PHP使用gettext实现i18n (internationalization)国际化

i18n是英文单词internationalization的首字母”i”和末字母”n”的缩写,中间的18代表省略(缩写)了18个字母。

gettext是PHP的一个函数库,主要函数有

  • bind_textdomain_codeset
  • bindtextdomain
  • gettext
  • textdomain
  • dgettext
  • ……

我们首先要先搞明白一些概念,就能很容易的理解这些函数了。

  • .po文件

    把英文内容翻译成本地内容的文件,文件格式:

    msgid "英文内容"
    msgstr "本地内容"
    

    比如:

    msgid "hello, world!"
    msgstr "你好,世界!"
    

    这样我们在程序中使用 gettext("hell, world!"),如果设置成显示中文的话就会显示“你好,世界!”,英文的话就会显示”hello, world!”

  • .mo文件

    .po文件是我们编辑的源文件,就像我们写的代码一样,.mo文件是编译过的二进制文件,gettext读取的就是.mo文件,因为程序读取二进制的效率要高一些。

  • 函数中的domain

    domain就是.mo的文件名,一般.po和.mo的文件名是一致的,除了扩展名不样。bindtextdomain的第一个参数就是.mo的文件名, 比如我们要用default.mo文件,那么bindtextdomain第一个参数就是default,第二个参数是default.mo文件的路径。

  • textdomain

    程序中可以设置绑定多个.mo文件,textdomain是设置默认的.mo文件,比如设置default.mo文件为默认 textdomain('default')之后 就可以使用gettext函数来实现多语言了。

  • dgettext

    上面我们知道gettext函数使用的是默认的.mo文件,那么dgettext函数就是指定.mo文件,二个参数,第一个是.mo文件名,第二个参数同gettext函数的第一个参数一样。

  • bind_textdomain_codeset

    指定.mo文件的编码,一般我们使用utf-8,就需要调用这个bind_textdomain_codeset,你的.po文件是utf-8,那么.mo文件也是utf-8,二个文件会保持一致, 不指定编码的话使用gettext或者dgettext就会是乱码。

  • poedit编辑器

    poedit就是专门编辑.po文件的编辑器软件,他只能翻译内容,不能添加内容。

  • 目录结构

    对于.mo文件是的位置是有一定要求的,比如我们想把.mo文件统一放在./locale目录,可以使用函数 bindtextdomain('default', './locale'); 来设置, 那么我们的中文default.mo文件的位置必须是 ./locale/zh_CN/LC_MESSAGES/default.mo ,zh_CN是中文,LC_MESSAGES是固定的,为什么要有他我也不清楚。

  • setlocale函数

    这个函数是语言切换的核心,比如上面我们有一个中文的翻译文件default.mo保存在zh_CN目录下面,我们只需要调用 setlocale(LC_ALL, 'zh_CN');  即可显示我们在default.mo翻译过的内容。关于第一个参数可以查看php setlocale的文档,这里就不说了。

还有什么问题不明白的可以通过评论告诉我哦。