答案 0 :(得分:13)
为什么重新发明轮子? 也许我不明白,但我很确定你以前做过的事情已经完成了。
只需使用众多现有解决方案中的一个。
在做出决定时,需要考虑以下事项:
以下是一些(随机排序):
更新:谢谢,El Yobo。我已将此标记为社区维基,如果他找到其他内容,欢迎任何人编辑或回复其他项目。
答案 1 :(得分:6)
当您被推荐使用gettext时,实际上建议使用 gettext- 之类的 翻译系统。由于助记符文本指示,您当前的代码很复杂。你使用正则表达式进行编辑所遇到的麻烦是由于在那里摆弄变量引起的。让我为过渡目的提出一些替代代码。
gettext的优点在于它使用了非突兀的API。函数调用_()
非常简单,可以在不添加太多语法或代码膨胀的情况下彻底使用。它更适合getTextTrans('ABBR_TXT_ID')
之类的东西。使用这样的助记符文本ID是一种普遍的谬误;因为在实践中没有频繁的重新措辞,而_("Raw english original text.")
也有同样的目的。但是,由于您已经安装了助记键,因此如果更改太多,请保留它们。这只是一个建议。
您真正的问题是使用内联PHP表达式来构建翻译目标字符串。这就是为什么翻译编辑器的正则表达式变得不透明的原因。因此,我强烈建议使用静态字符串并提供占位符。翻译功能的任务是处理它。 (不要担心这里的微优化!) - 我会使用{$url_xy}
PHP / Smarty风格的占位符,例如:
$txt['dp_who_forum'] = 'Viewing the forum index
of <a href="{$scripturl}?action=forum">{$forum_name}</a>.';
一个翻译函数,用于查找全局占位符表或params($ context)以替换:
function __($text, $params=array()) {
global $txt, $txt_placeholders;
if (isset($txt[$text])) {
$text = $txt[$text];
}
if (strpos($text, '{$')) {
$params = array_merge($params, $txt_placeholders);
$text= preg_replace("/\{\$(\w+)\}/e", "$params['$1']", $text);
}
return $text;
}
可优化。但是这样你可以使用静态助记符 - &gt;文本或英语 - &gt;文本集翻译数组。 您只在文本翻译编辑器形式中使用静态字符串。这些静态字符串按原样显示,您的译员会编辑英文文本,但不会编辑任何{$placeholders}
。
因此,您的翻译功能代码不需要任何复杂的正则表达式(在这种情况下它们没用)来匹配字符串和内联PHP变量。实际上,更简单的include()
和var_export()
组合现在可以取而代之:
function langSave($lang, $file) {
$txt = array();
include($file); // assuming it contains a simple $txt = array(...
foreach ($txt as $key=>$string) {
$txt[$key] = $_REQUEST["txt$key"];
}
file_put_contents($file, "<?php\n\$txt =".var_export($txt,1).';?>');
}
文件处理当然需要定制。但这仍然是一种更简单的方法。
它还可以让您转换为其中一个gettext变体作为后端。保留自定义包装器功能__()
并使用例如Zend_Translate作为后端。这允许您继续使用.php $ txt = array()翻译文件(或者我认为是这样)或移动到gettext样式的.mo / .po文件。这样做的好处是,与自制软件解决方案相比,有丰富的工具支持。
无论如何,这是您在主应用程序中使用这些内容的方式:
print "<a href='...'>" . __("link_text") . "</a>";
print __("dp_forum_link"); // uses e.g. $txt_placeholder["scripturl"]
print __("dp_param_link", array("scripturl"=>"http://override..."));
首先建议从short_txt键移动到english-&gt;外语文本翻译数组,但理论上dvbs中的任何后端都是适用的。现在你已经说过本机gettext不是你的选择(对于非fastcgi PHP设置,内存阻力是一个缺点)。但PHP本机INTL功能可能对您有所帮助。特别是http://www.php.net/manual/en/class.messageformatter.php可能比我给你的简单的{$ var}替换包装更有用。但我从来没有使用它,我认为Zend_Translate可能更有用。特别是任何这些后端都可以让你拥有charset独立性。就个人而言,无论怎样,我都会坚持使用UTF-8。但gettext .mo / .po文件可以各自拥有自己的自定义字符集。