在本地主机上,西班牙语、俄语和罗马尼亚语语言可以正确显示,但是当我们将站点移动到 AWS 上的生产服务器时,我们的文本无法正确显示。
我们使用 get 文本和 .po 文件来显示我们的语言。直接来自我们数据库的文本显示正常,只有来自 .po 文件的文本被破坏。
破碎的例子:http://ru.artzoco.com/seller/102/YallooArt
它应该是什么样子:http://en.artzoco.com/seller/102/YallooArt
我们的获取文本代码:
//language sudomain process http://stackoverflow.com/q/18996503/1744357
$host = explode(".",$_SERVER['HTTP_HOST']);
switch ($host[0]) {
case 'en':
$locale = 'en_US';
break;
case 'es':
$locale = 'es_ES';
break;
case 'ru':
$locale = 'ru_RU';
break;
case 'ro':
$locale = 'ro_RO';
break;
default:
$locale = 'en_US';
break;
}
putenv("LANG=$locale");
$loc_es = setlocale(LC_ALL, $locale);
bindtextdomain("translations", "../../locale/");
textdomain("translations");
我在 gettext 的 php 手册条目中看到了这一点:
注意:
对于某些系统和 putenv() 来说,设置一种语言是不够的 应该用于定义当前区域设置。
本地计算机和生产服务器默认值之间可能存在差异,因此请尝试将上面的环境变量显式设置为所需的语言。
我的下一个最佳猜测是,这是生产服务器上来自数据库的字符编码问题(不确定您是否正在使用一个)。
您是否正在从 mysql 数据源查询数据?如果是这样,请在检索之前尝试mysql_set_charset
函数:
mysql_set_charset('utf8');
我发现对于Linux服务器,我需要专门为我们的代码调用这一行:
bind_textdomain_codeset("translations", "utf-8");
由于我们在本地主机上的Windows服务器上,因此无需此代码行即可工作。