PHP setlocale возвращается к системному стандартному языку
Это код, который я использую для установки языка:
$locale = 'en_US';
putenv('LANG='.$locale);
setlocale(LC_ALL, $locale);
bindtextdomain($locale, ROOTPATH.'/admin/locale');
bind_textdomain_codeset($locale, 'UTF-8');
textdomain($locale);
echo setlocale(LC_ALL, 0).'<br><br>';
echo _('register_success');
,
Разбивая это:
$locale = 'en_US';
Установка этого значения в 'pt_PT' делает работу для португальского, но если для него установлено другое значение, ничего не переводится.
putenv('LANG='.$locale);
setlocale(LC_ALL, $locale);
bindtextdomain($locale, ROOTPATH.'/admin/locale');
(ROOTPATH - это переменная пути к корневой папке проекта)
bind_textdomain_codeset($locale, 'UTF-8');
textdomain($locale);
Следующая часть всегда выводит это: LC_COLLATE=C; LC_CTYPE=Portuguese_Portugal.1252; LC_MONETARY= С; LC_NUMERIC= С; LC_TIME= С
echo setlocale(LC_ALL, 0).'<br><br>';
И строку, которую я тестирую
echo _('register_success');
Я уже пробовала setlocale(LC_ALL, NULL)
а также setlocale(LC_ALL, '')
перед установкой его в "en_US", но это тоже не помогло, хотя это сделало echo setlocale(LC_ALL, 0)
только печать Portuguese_Portugal.1252
,
Я также пытался изменить язык моей системы и все такое, но она все еще Portuguese_Portugal.1252
не совсем уверен, как...
Вот структура папок для файлов.po/.mo.
root
- admin/
- locale/
- en_US/
- LC_MESSAGES/
- en_US.mo
- en_US.po
- pt_PT/
- LC_MESSAGES/
- pt_PT.mo
- pt_PT.po
РЕДАКТИРОВАТЬ
Вот значения, которые setlocale() возвращает для разных кодов (я не знаю, помогает ли это, но они не кажутся мне слишком последовательными):
setlocale(LC_ALL, 'pt_PT');
echo setlocale(LC_ALL, '0');
Выходы: LC_COLLATE = C; LC_CTYPE = Португальский_Португалия.1252; LC_MONETARY=C; LC_NUMERIC=C; LC_TIME=C
setlocale(LC_ALL, 'PT');
echo setlocale(LC_ALL, '0');
Выходы: PT
setlocale(LC_ALL, 'US');
echo setlocale(LC_ALL, '0');
Выходы: англ_Соединённые Штаты.1252
setlocale(LC_ALL, 'EN');
echo setlocale(LC_ALL, '0');
Выходы: EN
setlocale(LC_ALL, 'en_US');
echo setlocale(LC_ALL, '0');
Выходы: LC_COLLATE = C; LC_CTYPE = Португальский_Португалия.1252; LC_MONETARY=C; LC_NUMERIC=C; LC_TIME=C