【问题标题】:PHP gettext issue: strings are only translated for EnglishPHP gettext问题:字符串只翻译成英文
【发布时间】:2011-11-09 11:37:30
【问题描述】:

我正在使用 php gettext 实现根据用户偏好获取网站本地化(通过分析 HTTP_ACCEPT_LANGUAGE)。

我测试了我构建的翻译系统,它工作正常,但我刚刚发现(在我添加了其他语言之后)当我尝试使用不同的语言时它不起作用,返回未翻译的字符串。

我得到了正确的语言环境(使用德语设置进行调试,我得到它使用的是 de_DE),并且我有正确的 .mo 文件 (locale/de_DE/LC_MESSAGES/messages.mo)。

我正在使用这段代码来设置翻译环境:

    putenv("LC_ALL=" . $g_locale);
    setlocale(LC_ALL,  $g_locale);
    bind_textdomain_codeset('messages', 'UTF-8');
    bindtextdomain('messages', './locale'); // echo here makes sure it's getting the right absolute path
    textdomain('messages');

其中 $g_locale 是“de_DE”。

我尝试了以下几种解决方案,我已经安装了德语语言环境,并且 locale -a 告诉 de_DE.UTF-8 已正确安装。我也重启了apache2。

但是消息仍然没有翻译成除 en_US 之外的任何语言。

这种行为的原因可能是什么? 我该怎么做才能让它发挥作用?

谢谢。

编辑:我忘了说它也可以使用默认系统语言(意大利语)。 这似乎是一个错误配置,但我运行了正确的命令(sudo apt-get install language-pack-de-base)。

【问题讨论】:

    标签: php


    【解决方案1】:

    我通过简单地将“.UTF-8”添加到 $g_locale 的值来修复它,导致德国用户为“de_DE.UTF-8”,英语为“en_US.UTF-8”等等.

    安装所有语言环境后,我每次都需要重新启动网络服务器(这似乎是缓存问题)。

    在 Ubuntu 上,我既不需要使用 putenv("LC_ALL=" . $g_locale); 也不需要使用 bind_textdomain_codeset('messages', 'UTF-8');,将代码量减少到:

    // $g_locale = "en_US.UTF-8";
    setlocale(LC_ALL,  $g_locale);
    bindtextdomain('messages', './locale');
    textdomain('messages');
    

    希望对您有所帮助,问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      相关资源
      最近更新 更多