* независимые от платформы * настройки языка / локали? - PullRequest
0 голосов
/ 06 декабря 2018

tl; dr

Можно ли изменить настройку среды LANGUAGE (или компонент LC_MESSAGES локали) независимо от платформы , и если нет (то естьвозможно, дело) определить, было ли запрошенное значение действительно законным / вступило в силу?

Контекст

Одна из моих функций пыталась обнаружить возникновение конкретной ошибки, grep() выполнивтекст сообщения об ошибке.Как ранее указывалось в списке рассылки R (сейчас не могу найти ссылку), этот подход хрупок: текст сообщения может меняться в зависимости от значения переменной среды LANGUAGE.

ИтакЯ изменяю свой код, чтобы не делать этого, но я бы хотел добавить регрессионный тест в пакет, который проверяет, возникает ли проблема.И я бы хотел, чтобы он работал (или, по крайней мере, не работал) на разных платформах.

Как описано, например, в этот вопрос , я могу использовать Sys.setenv(LANGUAGE=...) или Sys.setlocale("LC_MESSAGES",.) для измененияязык сообщений.Но это будет работать, только если я угадаю правильное значение LANGUAGE / LC_MESSAGES, и оно доступно в текущей системе.(Кажется, что LANGUAGE - это код языка, а LC_MESSAGES - это языковой стандарт, и что языковой стандарт не требуется устанавливать , если я просто хочу переключать языки?)

Sys.getenv("LANGUAGE") ## [1] "en_CA:en"
test_msg <- function(msg,silent=FALSE) {
   grepl(msg,try(x ,silent=silent))
}
test_msg("not found") ## TRUE ("object 'x' not found")
Sys.setenv(LANGUAGE="fr")
test_msg("introuvable")
## Erreur : objet 'x' introuvable

Пока все хорошо.Но сброс переменной LANGUAGE, похоже, не работает ...

Sys.setenv(LANGUAGE="en")
Sys.getenv("LANGUAGE")=="en" ## TRUE
test_msg("not found")   ## FALSE ('introuvable')
Sys.setenv(LANGUAGE="en_CA:en")
test_msg("not found") ## FALSE ('introuvable')

Установка LC_MESSAGES в C кажется более надежной ...

Sys.setlocale("LC_MESSAGES", "C")
test_msg("not found")

FWIW У меня естьобнаружил, что эта последовательность команд на самом деле кажется ненадежной , то есть та же самая попытка установить переменную окружения, кажется, работает иногда в зависимости от того, что я делал раньше ...Я должен вернуться и продолжить чистую сессию, чтобы получить воспроизводимые результаты ...

В любом случае, я знаю, что если бы я попробовал это на компьютере без французского языка или гденазвание локали / языка было другим, это не сработало.Я хотел бы иметь возможность выяснить, работает ли языковая настройка.Я могу использовать test_msg("introuvable") в качестве грубой силы, но я надеюсь, что есть более элегантный вариант ...


соответствующих битов sessionInfo():

R Under development (unstable) (2018-11-26 r75681)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.5 LTS

locale:
 [1] LC_CTYPE=en_CA.UTF8       LC_NUMERIC=C             
 [3] LC_TIME=en_CA.UTF8        LC_COLLATE=en_CA.UTF8    
 [5] LC_MONETARY=en_CA.UTF8    LC_MESSAGES=en_CA.UTF8  
...