PHP: использование таблицы строк / таблицы ресурсов для изменения бренда и i18n - PullRequest
1 голос
/ 07 ноября 2010

На многих платформах часто вместо встраивания строк непосредственно в код создается таблица ресурсов или таблица строк, в которой перечислены все сообщения, а код ссылается на них. Это позволяет легко перевести приложение или попросить не разработчика изменить формулировку сообщения.

Какой рекомендуемый способ сделать это в PHP? Есть ли хорошие, простые стандартные решения или это ваша роль? Простая таблица проста - меня беспокоит то, что файлы PHP, которые у меня есть, используют PHP, HTML и JavaScript вместе, и не всегда легко узнать, где вы находитесь ...

Ответы [ 4 ]

3 голосов
/ 08 ноября 2010

лично я не стал бы использовать определения, как указано Гордоном , но я бы сделал что-то вроде этого:

class Language
{
    var $language;
    var $storage = array();

    public function __construct($language)
    {
        $this->language = $language;
        $this->load();
    }

    private function load()
    {
        $location = '/path/to/' . $this->language . '.php';

        if(file_exists($location))
        {
             require_once $location;
             if(isset($lang))
             {
                 $this->storage = (object)$lang;
                 unset($lang);
             }
        }
    }

    public function __get($root)
    {
        return isset($this->storage[$root]) ? $this->storage[$root] : null;
    }
}

Так что вышеизложенное будет очень простым языковым объектом, иязыковой файл будет выглядеть так:

/ path / to / english.php

$lang = array(
    'user' => array(
        'welcome' => 'Welcome %s',
        'logout'  => 'Logout',
    )
    /*...*/
);

У вас должно быть несколько файлов для разных локалей, но вы должны изменить свой класстак что если ключ не существует в German, то по умолчанию он должен быть английским локальным, так как это основной

Так что использование будет таким:

$lang = 'english'; //logic behind this to detect the browser or user data.

$Language = new Language($lang);

echo sprintf($Language->user->welcome,"RobertPitt"); // Welcome RobertPitt
0 голосов
/ 08 ноября 2010

Я бы рекомендовал вам использовать ресурсы ICU:

См .:

0 голосов
/ 08 ноября 2010

В прошлом я делал это с помощью простого PHP-файла, содержащего строки define () d.

(english.php)

<?php
define ('MSG_OK_LOGIN', 'You have successfully logged in. Welcome back');
define ('MSG_ERR_LOGIN', 'Unable to log you in. ')
define ('MSG_ERR_LOGIN_USERNAME', MSG_ERR_LOGIN . 'Please register before attempting to log in');
define ('MSG_ERR_LOGIN_PASSWORD', MSG_ERR_LOGIN . 'Please check that you have typed your password correctly, and that your caps lock key is off. ');
// ...
?>

Затем на странице входа в систему,

<?php
require ('path/to/your/config.php'); // A configuration for the software.  Assume it contains a define ('CFG_LANG', 'english'); line in it somewhere
require ('path/to/language/files/' . CFG_LANG . '.php');
// ...
?>
0 голосов
/ 07 ноября 2010

Словари i18n / l10n являются простыми ассоциативными массивами (пары ключ-значение) и могут быть выполнены с использованием обычного кода PHP, файлов .ini или таблиц базы данных (даже NoSQL). Если словари не такие большие, лучшим выбором будут файлы PHP. Если пользовательская база не является кодировщиками, рассмотрите файлы .ini. Если вы предвидите, что словарные фразы растут со временем (и могут не соответствовать доступной памяти PHP), лучшим выбором будет вариант DB. Выбирай.

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