Xpoint
   [напомнить пароль]

Мультиязычность

Метки: [без меток]
2005-08-01 23:48:51 [обр] sharf[досье]

Здравствуйте!
Нахожусь перед выбором: как реализовать мультиязычность? Т.е. каким способом?
Нашел пока вот что:

способ 1:
Реализация двуязычности по-простому:

function langprint($russtring,$engstring) {
        global $lang
        if ($lang=='eng') return $engstring;
        else return $russtring;
}

способ 2:
Хранение вариантов одной строки на разных языках в одном поле базы в формате, например:
en:=english~~ru:=русский
извлечение из базы и запись в нее специальными функциями

способ 3: (то, что мне первое приходит на ум)
Хранение в базе, но в разных полях, например одно ru, а другое eng...

А какие еще есть варианты? для многоязычноти? или только для русского и английского языков? Интересно узнать мнение по этому вопросу... Заранее спасибо!

спустя 48 минут [обр] Иван Шумков(0/77)[досье]
Есть специальный модуль для PHP - GetText. Но можно самому релизовать месаджсеты.
спустя 8 минут [обр] sharf[досье]
Меня как раз интересует как самому! =)
спустя 25 минут [обр] Иван Шумков(0/77)[досье]

sharf[досье]
Зря, GetText очень удобен.

Если используете шаблоны то это вообще не сложно:

Есть шаблон:

<html>
<body>
<form>
<input type="submit" value="{{=SendForm}}">
</form>
</body>
</html>

Есть хранилище месаджсетов, будь то таблица или файл с масивом title, rus, eng: SendForm, Отправить, Send

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

Если не использовать шаблоны, то просто пишите свою функцию отдачи текста.

К примеру:

print Text('SendForm');
$var = '<b>'.Text('SendForm').'</b>';

И функция:

function Text($title)
{
  Берем из хранилища месаджсетов по тайтолу нужный текст
  в зависимости от выбранного языка.

  return $text;
}
спустя 2 дня 10 часов [обр] Алексей Степанов[досье]

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

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

вот упрощенный пример того, что я делал лично.
в шаблоне отличий нет. с одним лишь условием у нас как-то идентифицируются страницы внутри системы. то есть допустим для страницы отведен идентификатор test (это было сделано для манипулирования страницами внутри системы, в основном парсинг ЧПУ и подключения соответствующих для страницы шаблонов и текстовых файлов).

<html>
<body>
<form>
<input type="submit" value="{{=SendForm}}">
</form>
</body>
</html>

в языковом файле(файл формата ini).

[test]
SendForm = "Отправить"

в движке системы

$current_lang = 'ru';
$current_page = 'test';
$tpl_text = parse_ini_file($current_lang);
echo $tpl_text[$current_page]['SendForm'];

таким образом получаем двумерный массив текстами соответствующие выбранному языку.

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

спустя 25 дней [обр] Николай[досье]
Вот как это реализовано у меня:
==== Файл Russian.php ====
<?
$title="Компания Kurkov Software";
...
?>
==== Файл English.php ====
<?
$title="Company Kurkov Software";
...
?>
==== Файл Lang.php ====
<?
// Работа с языком
// Если язык задан
if ($lang)
{
// И он существует
if (file_exists("languages/".$lang.".php"))
// Грузим его
include "languages/".$lang.".php";
else
// Иначе грузим английский как стандартный
include "languages/".$lang.".php";
}
// Если язык не задан, грузим английский
else
include "languages/english.php";
?>
================
Для перевода просто подключить файл lang.php к страничке:
...
<?
include "languages/english.php";
?>
<head>
<title><?=$title?></title>
</head>
...
================
В результате для перевода нужно всего лишь новый языковой файл.
Будут проблемы, стучи в аську, хотя я не PHP-гуру, 1 день книжку почитал + месяц практики :).
спустя 12 дней [обр] Mihailoff[досье]

Мое пока теоритическое решение:
Для начала подымимся уровнем выше из PHP скриптов к архитектуре БД. У меня по крайней мере вся информация хранится в БД по тому к ней и подымаемся =)).
Итак есть куча таблиц с разной информацией, в языкозависимых полях вместо текста прописываем ID записи в так называемой языковой таблице.

Она выглядит примерно так:
ID: SomeID
RU: текст на русском
EN: текст на английском
и т.д.

Плюсы:

  1. В коде описываются соответствующие ID, тем самым нам все равно какие есть языки и сколько их.
  2. Расширяемость, добавляй новых языков сколько надо.

Минусы:

  1. Затратность ресурсов БД, в одном случае у нас большой текст, в другом два слова.
  2. Не знаю хороши ли сваливать все в одну таблицу.
спустя 1 месяц 17 дней [обр] Григорий(0/8)[досье]

Mihailoff[досье]
может и в базу. может и нет.

Знаю точно, такое есть в struts (MessageTag class) (http://struts.apache.org) и работает прекрасно без помещения в таблицу БД. Исходники на сайте разработчика имеются.

Powered by POEM™ Engine Copyright © 2002-2005