мультиязыковой проект: перевод нескольких сообщений на наиболее похожие языки

Popoff

popoff.donetsk.ua
мультиязыковой проект: перевод нескольких сообщений на наиболее похожие языки

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

если я хочу выбрать сообщение в переводе на наиболее похожий язык (после проверки того, что нет перевода на нужный язык), то я делаю примерно такой запрос:
[sql]select TMsg.sMsg from TMsg,TSim where TMsg.kMsg=$kMsg and TMsg.kLang=TSim.kLang2 and TSim.kLang1=$kLang order by kSim limit 1[/sql]где TMsg - таблица сообщений, kLang - код языка, TSim - таблица похожести языков. при переводе с kLang1 в первую очередь берем те kLang2, для которых kSim минимальна.

необходимо в базе данных хранить, например, названия стран и городов на всех языках. возникла ситуация, когда пользователю нужно показать список всех городов заданой страны. известно, что для каждого города есть название как минимум на одном каком-то языке.
как рабочий вариант рассматривается смесь sql+php, когда я выбираю сначала коды всех городов заданной страны (1-й запрос), потом для каждого города ищу перевод (грубо - n запрорсов), собираю все переводы в массив и потом сортирую.

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

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

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

Popoff

popoff.donetsk.ua
Все, придумал :)
PHP:
function geoSelectCities($kCountry)
{ //returns a list of cities in a given country
  //returns false if an error has occured
  //!!! kCountry must be a valid counry key

  global $cmsLanguage;

  $res=array(); //this will be a result

  //select a list of untranslated countries
  $r=mysql_query("select TGEOCountryCity.kCity from TGEOCountryCity left join TGEOCity on TGEOCountryCity.kCity=TGEOCity.kCity and kLang=".$cmsLanguage." where kCountry=".$kCountry." and TGEOCity.sCity is null");
  if(!$r) return false;
  for($i=0;$i<mysql_num_rows($r);$i++)
  {
    $f=mysql_fetch_assoc($r);
    $res{$f{'kCity'}}="<b>".cmsSelectBest('sCity','TGEOCity','kCity='.$f{'kCity'})."</b>";
  }
  asort($res);
  //select a list of translated countries
  $r=mysql_query("select TGEOCity.kCity,TGEOCity.sCity from TGEOCountryCity,TGEOCity where TGEOCountryCity.kCity=TGEOCity.kCity and kCountry=".$kCountry." and kLang=".$cmsLanguage." order by sCity");
  if(!$r) return false;
  for($i=0;$i<mysql_num_rows($r);$i++)
  {
    $f=mysql_fetch_assoc($r);
    $res{$f{'kCity'}}=$f{'sCity'};
  }
  return $res;
}
под функцией cmsSelectBest прячется тот запрос, который я уже написал выше. в переменной $cmsLanguage содержится код языка, на котором следует отображать сообщения

от запросов по каждому непереведенному сообщению и сортировки внутри массива избавиться не удалось, но такой вариант лучше тем, эти запросы и сортировка производится ТОЛЬКО для непереведенных сообщений. поскольку в идеале непереведенных сообщений быть не должно вообще, то в этом месте запросов будет мало и сортироваться будет небольшое количество значений.

спасибо всем, кто успел поломать себе голову :)
 
Сверху