用于语言翻译的php函数

时间:2011-10-25 12:21:28

标签: php content-management-system multilingual

对于CMS的多语言使用,他们通过类似

的功能翻译术语
function __($word) {
include 'fr.php';
if(!empty($lang[$word])) {$translated=$lang[$word];
} else {
$translated = $word;
} 
return $translated;
}
  1. 由于我们需要在php页面中多次使用此函数,因为所有单词和短语都会被__('')回显;该函数是否需要每次都包含语言时间,或者首次加载后是否会为该函数缓存?

  2. 由于语言文件包含整个网站中使用的完整单词列表和措辞(数千个键/值),因此每次访问页面时,pho都需要将此长数组加载到内存中。这是向CMS添加多语言功能的最佳方法吗?

3 个答案:

答案 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)

  1. IIRC,它会进行一些缓存。
  2. 不,不是。查看gettext