对于CMS的多语言使用,他们通过类似
的功能翻译术语function __($word) {
include 'fr.php';
if(!empty($lang[$word])) {$translated=$lang[$word];
} else {
$translated = $word;
}
return $translated;
}
由于我们需要在php页面中多次使用此函数,因为所有单词和短语都会被__('')回显;该函数是否需要每次都包含语言时间,或者首次加载后是否会为该函数缓存?
由于语言文件包含整个网站中使用的完整单词列表和措辞(数千个键/值),因此每次访问页面时,pho都需要将此长数组加载到内存中。这是向CMS添加多语言功能的最佳方法吗?
答案 0 :(得分:5)
如果由于某些原因你不能使用gettext()
,那么你最好把它放在一个包含语言字符串作为静态数组的对象中,例如: / p>
class Message {
private static $_messages = array();
public static function setMessageLibrary($sMessageLibrary) {
require_once $sMessageLibrary;
self::$_messages = $aMsgs;
}
public static function getMessage($sMessageId) {
return isset(self::$_messages[$sMessageId]) ? self::$_messages[$sMessageId] : "";
}
}
您的消息库文件(包含在setMessageLibrary()
静态函数中),每种语言都有一个,需要一个名为$aMsgs
的变量,它可能类似于:
// Messages for fr-FR
$aMsgs = array(
'hello_everybody' => "Bonjour tout le monde"
...
and so on
);
由于它全部是静态的,但在对象内,您可以通过在脚本开头设置它来有效地缓存包含语言文件。
<?php
Message::setMessageLibrary('/lang/fr-FR/messages.inc.php');
echo Message::getMessage('hello_world');
echo Message::getMessage('another_message');
echo Message::getMessage('yet_another_message');
?>
然后,所有三条消息都将引用Message::$_messages
那里没有卫生处理,也没有健全性检查,但无论如何这都是基本原则......如果你不能使用gettext();)
答案 1 :(得分:3)
1)它不会被缓存,而是使用include_once
2)不,我认为gettext正在做另一种/更好的方式
答案 2 :(得分:1)