PHP / MySQL web-приложение Интернационализация с полями enum DB - PullRequest
0 голосов
/ 19 января 2012

Я недавно присоединился к проекту и сейчас работаю над улучшением его интернационализации. Используемые технологии: PHP / MySQL / Zend Framework / Dojo. I18n реализован с использованием gettext почти так же, как описано здесь ссылка на SO вопрос во втором ответе.

Но я столкнулся с одной проблемой. Некоторая часть информации, относящейся к определенным таблицам БД, хранится в этих таблицах в столбцах типа enum. Например, в таблице «пользователь» есть поле usr_online_status, которое может быть как «онлайн», так и «оффлайн». Существует много таких таблиц с полями enum, которые содержат такую ​​информацию, как ('yes', 'no'), ('download', 'upload') и так далее. Конечно, эта информация отображается на английском языке, независимо от выбранного языка.

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

Но могут быть более простые или лучшие решения этой проблемы.

Что бы вы сделали?

Спасибо за ваши ответы.

UPD1 Важное замечание Информация из перечислений не только отображается в графическом интерфейсе, но и используется в поиске. Например - на веб-странице есть сетка, которая содержит информацию о пользователях. Вы можете ввести «строку» в поле поиска, и результатом будут только пользователи со словом «% line%» в своей информации, например, статус «онлайн».

1 Ответ

2 голосов
/ 19 января 2012

Вам определенно нужны словарные таблицы: только с ними 2 разных пользователя приложения могут работать на разных языках одновременно.

Я рекомендую поместить некоторые из этих словарных таблиц в PHP, хотя это оказалось довольно ненавязчивым и производительным способом сделать это - например,

$translation=array('yes'=>'Ja','no'=>'Nein', ..)

//...

$row=mysql_fetch_row($qry);
//$row[1] has yes/no
$row[1]=$translation[$row[1]];

//...

$ translation может быть require_once() 'ed в зависимости от языковых предпочтений текущего пользователя, URL или любого другого

В основном вы торгуете некоторым ОЗУ для скорости и легкости.

UPDATE:

С Gior312, добавляющим информацию о поиске, вот мое решение для этого: иметь обратный перевод в таблице БД (вы даже можете использовать его для создания $ translation для скрипта):

CREATE TABLE translations (
  id INT PRIMARY KEY AUTO_INCREMENT,
  languageid INT NOT NULL,
  enumword VARCHAR(m) NOT NULL,
  langword VARCHAR(n) NOT NULL,
  -- n and m to your needs
  INDEX(languageid)
  -- other indices to your needs
)

Теперь, когда поиск до сих пор был

$line=... //Maybe coming from $_POST['line'] via mysql_real_escape_string()
$sql="SELECT * FROM sometable WHERE somefield LIKE '%$line%'";

То, что вы сейчас делаете, это

$line=... //Maybe coming from $_POST['line'] via mysql_real_escape_string()
$sql="SELECT enumword FROM translations WHERE languageid=$currentlanguageid AND langword LIKE '%$line%'";
//fetch resulting enumwords into array $enumwords
$enumlist=explode("','",$enumwords);
//This assumes, that the field enumwords contains nothing, that needs to be escaped
$sql="SELECT * FROM sometable WHERE somefield IN ('$enumlist')";

Различия в трактовке прямого и обратного перевода по-разному:

  • В коде, где вы будете отображать, будет гораздо больше строк, чем в том, где вы будете искать, поэтому незаметность прямого перевода важнее
  • Прямое trnslation должно быть выполнено PER ROW (с объединением), обратное только PER QUERY, поэтому выполнение прямого перевода важнее, чем выполнение обратного перевода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...