用于语言翻译的php函数

Goo*_*bot 2 php multilingual content-management-system

对于CMS的多语言使用,它们通过类似于的函数来翻译术语

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

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

CD0*_*001 5

如果gettext()由于某种原因你不能使用,那么你应该把它放在一个带有包含的语言字符串作为静态数组的对象中,例如:

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] : "";
  }
}
Run Code Online (Sandbox Code Playgroud)

您的消息库文件(包含在setMessageLibrary()静态函数中),每种语言都有一个,它需要一个变量,它$aMsgs可能看起来像:

// Messages for fr-FR
$aMsgs = array(
  'hello_everybody' => "Bonjour tout le monde"

  ...

  and so on
);
Run Code Online (Sandbox Code Playgroud)

由于它是静态的,但在对象内,您可以通过在脚本的开头设置它来有效地缓存包含语言文件.

<?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');
?>
Run Code Online (Sandbox Code Playgroud)

然后,所有三个消息将引用存储在其中的单个语言数组 Message::$_messages

那里没有卫生处理,也没有健全检查,但这仍然是基本原则......如果你不能使用gettext();)