我一直在寻找国际化开源项目的选项:
似乎每个人都推荐的 Gettext 显然需要“安装在您的系统上”才能使用语言环境。请参阅 PHP 手册上的此注释,它准确地反映了我的情况。这个SO question也询问了同样的问题。这不适合开源项目,因为我不能相信最终用户在他们的系统上安装了适当的语言环境。此外,您必须安装语言环境才能使用已翻译的字符串(IMO),这非常奇怪。
Zend_Translate 有时也推荐使用 gettext,但我没有使用 Zend 框架,所以我认为这不是我的选择。有人说你可以将它从 Zend 框架中分离出来,但我不知道如何。如果有人能告诉我需要哪些文件(我已经下载了 Zend 框架的压缩包)来挑选,我愿意使用 Zend_Translate。
数组。这就是我现在正在做的事情,但这并不理想,因为:
- 当当前页面不会使用大多数翻译时,它将占用大量内存来定义每个翻译。
- 我在发现自己复制数组中的键时遇到了问题,这已经变成了 1000 行代码长而且我几乎没有添加任何东西......
- 这意味着非程序员无法真正翻译,而 POedit 是每个人都希望使用的标准。
我可以.mo
在没有 Gettext 或 Zend_Translate 的情况下以某种方式读取文件,还是必须使用 Gettext?如果是这样,我怎样才能使所有语言环境都工作,就像我上面链接的问题一样?
编辑:我现在愿意使用 Zend_Translate。我只需要弄清楚我需要什么文件(如果可以将它们合并到一个文件中那就太好了)——我不想在我的项目中使用整个 Zend 框架。
更新:我很想看看大型开源项目如何处理 i18n:
- Moodle 使用数组。
- Drupal 似乎使用数组,带有数据库后备。他们还跑去
setlocale('C')
获得一个通用的语言环境并规避整个setlocale
混乱。 - Wordpress 为 i18n 使用了大量自己的函数,尽管下面确实使用了 gettext。
因此,据我所知,这三个随机项目都没有使用 Zend_Translate,也没有直接使用 gettext。
也许使用语言环境是个好主意,将C
语言名称存储在文本域名中,然后从那里开始。
因此,就我所知:
$lang = 'de'; //debug
setlocale( LC_ALL, 'C' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
var_dump( file_exists( PATH . "/locale/$lang/C/LC_MESSAGES/default.mo" ) ); //bool(true)
但我仍然只是得到英文字符串,即使我使用 poedit、msgfmt 等来制作适当的文件。我也尝试过重新启动 Apache。