php – 如何为gettext本地化加载两个mo文件

我试图解决这个加载两个mo文件.
我有两个mo文件都有不同的msgid和msgstr.

我的文件夹结构如下.
本地/ EN_US / LC_MESSAGES / lang.mo
本地/ EN_US / LC_MESSAGES / brand.mo

以下代码我用来加载mo文件.

define('PROJECT_DIR', realpath('./'));
define('LOCALE_DIR', PROJECT_DIR .'/locale');
define('DEFAULT_LOCALE', 'en_US');
$encoding = 'UTF-8';
$locale = (isset($_SESSION['lang']))? $_SESSION['lang'] : DEFAULT_LOCALE;
// gettext setup
T_setlocale(LC_MESSAGES, $locale);
// Set the text domain as 'messages'
$our_domain = 'lang';
T_bindtextdomain($our_domain, LOCALE_DIR);
T_bind_textdomain_codeset($our_domain, $encoding);
T_textdomain($our_domain);

我怎么能在这里添加一个mo文件

解决方法:

您可以再次使用bindtextdomain和textdomain函数将新的翻译文件设置为认资源.

简化它的一个方法是创建实用函数,例如selectTrFile($filename),它将使它看起来像这样:

function selectTrFile($trFile) {
    bindtextdomain($trFile, TRANSLATION_BASE_DIR); // The constant being the path of you translations file directory
    textdomain($trFile);
}

// Now set the first file

selectTrFile('default');

// Do your stuff with this translations file

selectTrFile('anotherTranslationsResource');

// Have fun with it

您甚至可以通过将上面的功能包装在另一个自动切换文件内容中来加快速度.

function _f($msgid, $trFile){ // called _f to make it very short to type
    selectTrFile($trFile); // Switch the translations file
    return _($msgid); // Return the translated string
}

// Then wrap your translations filenames in short variables
$f1 = 'lang';
$f2 = 'brand';

// Now you can translate Strings easily from one file or another.
_f("to be translated in file 'lang'", $f1);
_f("to be translated in file 'brand'", $f2);

如果你不知道翻译是哪个文件,你可以使用这个函数而不是_f($msgid,$trFile);

function _f($msgid){

     selectTrFile('lang'); // or set a variable containing the filename and use it

     $msgstr = _($msgid);

     if($msgstr == $msgid){ // if the Strings are equals it means that there was no match in the first file
         selectTrFile('brand'); // or set a variable containing the second filename and use it
         $msgstr = _$(msgid);
     }

     return $msgstr;
 }

最后一个问题是它可能会减慢很多过程,我不知道在什么时候.您可以通过不每次更改为“lang”来优化它,如果String未被翻译或类似的话,查看实际的那个.

编辑

我认为您不能同时加载多个翻译资源.这对于msgid的冲突来说太危险了.你最好制作一个更大的.mo文件,而不是加载多个.mo文件.

这就是为什么msgfmt确保在编译时没有冲突的msgids的原因.不要害怕非常大的.po / .mo文件. Mo是一种编译且速度非常快的格式.

现在可能出现的问题是有一个非常笨拙的.po文件.为避免这种情况,最好的方法是将文件分成几部分.

有两种方法可以通过文件或子喷射来分隔各个部分.如果您计划在多个文件中使用相同的翻译(如果您正确使用包含文件,这种情况很少发生),您可以按主题分开.

通常的方法是按文件分隔并添加字符串来自的注释.

##
# File : /your/PHP/file.PHP
##
msgid "first String in file.PHP"
msgstr "first translation in file.PHP
.
.
.
##
# File : your/other/file.PHP
##
msgid "other translation"
msgstr "and then you go on"

所以重点是,如果您正确遵循指南,则永远不需要从单个.PHP文件访问多个.mo文件.

有关更多信息,请参见here (The format of PO files).

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...