PHP Custom Webapp Система перевода - предложения по оптимизации - PullRequest
1 голос
/ 05 марта 2011

Я разработчик веб-приложения (диспетчера задач).
Это приложение должно быть доступно на многих языках.Таким образом, у пользователя есть обычный языковой выпадающий список для переключения на другой язык.

Мне пришлось создать собственную систему перевода с MySQL в качестве бэкенда, потому что у меня были определенные ограничения.

Основная таблицасистема (включая некоторые записи в качестве примеров) представляет собой таблицу translation:

id | language_id | string_id | message  
1  |     en      | WELCOME   | welcome  
2  |     it      | WELCOME   | benvenuto  

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

Проблема такой системы в том, что она сильно укрепит базу данных.Если у меня будет 20 строк для перевода на странице, будет 20 запросов к базе данных на каждую загрузку страницы.

Как вы думаете, я должен пойти по этому пути, потому что он самый чистый и простой, используя memcache, чтобы сохранить результат каждого getTranslatedMessage вывода, используя language_id и string_id в качестве ключа длязапись в memcache?

Вы сделали бы это по-другому?

Возможно, я думал, загружая все сообщения для языка в глобальном массиве $lang при запуске.

Любое предложение будет более чем приветствоваться, так как этот компонент будет ключевым в моем приложении..

Спасибо,
Дан

Ответы [ 4 ]

3 голосов
/ 05 марта 2011

Это не данные приложения. Это не входит в базу данных. (См. Хороший пример osCommerce, чтобы не следовать этому пути). Поскольку вы уже планируете прочитать его одним махом, вы вполне можете хранить тексты пользовательского интерфейса приложения в файлах.

И длинное имя функции getTranslatedMessage(), и идентификаторы мнемонических сообщений тоже не очень хорошая идея. Используйте сырые английские предложения, а не заглавные. И сделать вызов функции перевода менее громоздким. В противном случае это сделает ваше приложение более неудобным, как только вы достигнете ожидаемых 20 строк. (OTOH, если вы хотите психологически ограничить количество переводов, уместно указать msgid и длинное имя функции.)

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

3 голосов
/ 05 марта 2011

Сколько записей в вашей таблице у вас есть? Если у вас не слишком много (<10000), конечно, вы должны загрузить его в один массив, а затем получить переменные из этого массива. </p>

$LANG = array();

$result = mysql_query("SELECT string_id, message FROM translation");
while ($row = mysql_fetch_row($result))
  $LANG[$row[0]] = $row[1];


function __($id) {
  global $LANG;
  return (isset($LANG[$id])) ? $LANG[$id] : $id;
}

Используйте имя __ () вместо getTranslatedMessage. Это намного проще.

2 голосов
/ 05 марта 2011

Для мультиязычных веб-сайтов я использую глобальные словари, хеш-таблицы в отдельных файлах.Например:

--- Файл с английскими переводами ---

$lang['hello'] = 'Hello';

--- Файл с немецкими переводами ---

$lang['hello'] = 'Hallo';

И я просто включаю необходимый файл.Я думаю, что это довольно дешево и быстро.Легко добавить другой языковой файл (даже с веб-формой) и использовать его.

1 голос
/ 22 января 2012

Я попытался создать свою собственную систему перевода.

Я храню свои переводы в базе данных, чтобы их было легко изменять.И затем я использую этот код, чтобы сделать супер глобальный.Пример ниже!

$sql = mysql_query("SELECT * FROM `f_translations` where `language` = '".mysql_real_escape_string($setting[language])."'");
while ($a = mysql_fetch_array($sql)) { $name=$a['category'].'-'.$a['name']; $language[$name] = utf8_encode($a['translation']);}

Удачи!

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