这是我用来设置语言的代码:
$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=C;LC_NUMERIC=C;LC_TIME=C
echo setlocale(LC_ALL, 0).'<br><br>';
还有我正在测试的字符串
echo _('register_success');
在将其设置为"en_US"之前,我已经尝试了setlocale(LC_ALL, NULL)
和setlocale(LC_ALL, '')
,但它也没有帮助,尽管它使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=Portuguese_Portugal.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');
输出:English_United状态.1252
setlocale(LC_ALL, 'EN');
echo setlocale(LC_ALL, '0');
输出:英文
setlocale(LC_ALL, 'en_US');
echo setlocale(LC_ALL, '0');
输出: LC_COLLATE=C;LC_CTYPE=Portuguese_Portugal.1252;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C
setlocale(LC_ALL, '')
为我工作。