Как мне добавить поддержку мультиязычности в мое веб-приложение через PHP, JS и файлы шаблонов? - PullRequest
1 голос
/ 19 апреля 2010

Я создаю веб-сайт, который должен поддерживать перевод на разные языки. У меня есть строки в файлах PHP, JavaScript и Smarty Template, которые нужно перевести.

Я хочу использовать что-то вроде функции PHP gettext () и иметь один языковой файл для каждой локали.

Это легко, когда переводимые строки находятся в файлах PHP, но у меня также есть текст в файлах шаблонов Smarty и JavaScript, которые также необходимо перевести.

Мне действительно нужен один файл, содержащий все переводимые строки.


Обновление:

Я хочу использовать gettext (), но реальная проблема в том, что он работает только с PHP, а не с JavaScript, так как JavaScript на стороне клиента.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

Вы можете хранить свои строки в CSV-файлах следующим образом:

"Welcome","Welcome"
"Total Price","Total Price"

Создайте один файл для каждого языка. Первое значение - это ключ, который вы будете использовать для извлечения строки, а второе - перевод. Затем вы можете создать класс с функциями, которые загружают соответствующий файл, сохраняют переменные в массиве и переводят текст по запросу. Например:

protected function loadTranslation($locale) {
    $this->_data=array();
    $localeFilePath="locale/" . $locale . "/whatever.csv";
    if(file_exists($localeFilePath)){
        $localeFileHandle = fopen($localeFilePath, "r");
        while (($line = fgetcsv($localeFileHandle, 1000)) !== FALSE) {
            $this->_data[$line[0]]=$line[1];
        }
        fclose($localeFileHandle);
    }
    return $this;
}

для загрузки значений и

   public function __($label) {
        $output=$this->_data[$label];
        if(empty($output)) $output=$label;
        return $output;
    }

для перевода. Затем вы можете, например, использовать следующую строку для получения правильной строки:

echo $this->__('Total Price')

Преимущество использования CSV-файлов заключается в том, что вам не нужно беспокоиться о базе данных, и, конечно, их можно редактировать через Excel, что очень удобно, когда вам нужно будет указать какой-то беспилотник для ввода данных, чтобы выполнить перевод.

Кроме того, вы можете написать небольшой скрипт для поиска строк, используемых функцией __ () в вашем коде, а затем записать соответствующие строки в файлы CSV, чтобы вам не приходилось тратить время на добавление строк в каждый CSV. файл для каждой строки, которую вы используете в своем коде.

Что касается шаблонов Smarty и файлов Javascript, вам также придется использовать переведенные строки из PHP. Значения Smarty приходят из PHP, поэтому используйте ваш переводчик, прежде чем присваивать значение Smarty. Что касается javascript, он должен быть динамически создан PHP, чтобы вы могли установить переведенные строки в соответствующих местах.

1 голос
/ 19 апреля 2010

Все созданные мной веб-приложения поддерживают 3 языка и рассчитаны на большее. Я храню все тексты в базе данных и называю их константами.

create table constants (
id integer not null,
fk_constant_group integer not null 
)

create table constants_group (
id integer not null,
name varchar(32)
)

create table languages (
id integer not null,
name varchar(32),
accronym varchar(3),
/*other fields if necessary*/
)

create table constants_value (
id integer not null,
fk_constant integer,
fk_language integer,
value text
)

Постоянная группа используется для группировки их по модулю / странице. Если вы собираетесь отображать страницу, вам понадобятся все константы, поэтому вы используете один запрос, чтобы получить все данные на нужном языке для одной страницы. Индекс на имя группы будет уместным. В PHP я написал что-то вроде этого:

public static function SetNames()
    {
        $info=debug_backtrace(true);
        $result=self::GetNames($info);
        Factory::getSmarty()->assign("names",$result);
        return $result;
    }

public static function GetNames($info=false) /*$info is the debug_backtrace result*/
    {
        if(!$info)
            $info=debug_backtrace(true);
        $class=$info[1]['class']; /*It's the page name basically*/
        if(isset(self::$m_names[$class]))
            return self::$m_names[$class]; /*Using a static member for caching*/
        global $application;
        $langId=$application->langId;
        $constants=AppFac::getAdo()->GetAll("SELECT 
    X.name as constant_name, 
    XV.value as constant_value 
FROM 
    constants X 
LEFT JOIN constants_values XV ON XV.fk_constant=X.id 
LEFT JOIN constants_groups XG ON X.fk_constant_group=XG.id
WHERE
    XG.name=?
    AND XV.fk_language=?",array($class,$langId)); /*Parametrized query*/
        $result=array();
        foreach($constants as $constant) /*Make constants easily accessible*/
            $result[$constant['constant_name']]=$constant['constant_value'];
        self::$m_names[$class]=$result;
        return $result;
    }

Из модуля PHP перед извлечением или отображением шаблона вызовите метод SetNames(), который автоматически определит имя класса, из которого вы вызываете, и будет использовать это имя, чтобы найти группу констант и заполнить константы в языке, заданном в сеансе. После этого используйте константы из шаблона, например, {$names.label_name}, например, если вы ищете label_name константы для своей страницы.

Этот способ хорош, потому что: 1. Вы можете добавить несколько языков прямо из веб-интерфейса, созданного для вашего приложения. 2. Вы можете легко организовать ваши тексты, когда они хранятся в базе данных. 3. Вы можете легко добавлять и редактировать тексты прямо из интерфейса, созданного для вашего приложения.

Если вы хотите перевести целые страницы вместо констант, вы можете использовать Smarty Resources, когда вы просто включаете ресурс в шаблон, а в PHP вы определяете, как обращаться с этим ресурсом. http://www.smarty.net/manual/en/template.resources.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...