我试图解决这个加载两个mo文件.
我有两个mo文件都有不同的msgid和msgstr.
我的文件夹结构如下.
本地/ EN_US / LC_MESSAGES / lang.mo
本地/ EN_US / LC_MESSAGES / brand.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);
解决方法:
您可以再次使用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).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。