функция php для языкового перевода - PullRequest
2 голосов
/ 25 октября 2011

Для многоязычного использования CMS они переводят термины с помощью функции, аналогичной

function __($word) {
include 'fr.php';
if(!empty($lang[$word])) {$translated=$lang[$word];
} else {
$translated = $word;
} 
return $translated;
}
  1. Поскольку нам нужно использовать эту функцию несколько раз на странице php, так как все слова и фразы будут повторяться с помощью __ (''); должна ли функция каждый раз включать языковое время или она будет кэшироваться для функции после первой загрузки?

  2. Поскольку языковой файл содержит полный список слов и словосочетаний, используемых на сайте (тысячи ключей / значений), pho необходимо загружать этот длинный массив в память каждый раз, когда посещается страница. Это действительно лучший способ добавить многоязычную функцию в CMS?

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Если по какой-то причине вы не можете использовать 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] : "";
  }
}

Для вашего файла библиотеки сообщений (включенного в статическую функцию 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 ();)

3 голосов
/ 25 октября 2011

1) он не будет кеширован, используйте include_once вместо

2) нет, я думаю, gettext делает это другим / лучшим способом

1 голос
/ 25 октября 2011
  1. IIRC, он сделает некоторое кэширование.
  2. Нет, это не так.Проверьте gettext .
...