Перевести несколько языков в PHP - PullRequest
0 голосов
/ 06 ноября 2008

Я работаю над небольшим парсером, который должен принимать входные данные на нескольких языках. Я собираюсь иметь около 50 строк, которые будут служить ключевыми словами / якорями при разборе ввода. В PHP, как лучше организовать эти переведенные ключевые слова?

Одно из возможных решений, которое приходит мне в голову, - использовать ассоциативный массив. Как это:

$lang = array('us' => array('totalDebt' => 'Total Debt', 'color' => 'Color'),
              'gb' => array('totalDebt' => 'Total Debt', 'color' => 'Colour'))

, к которому я мог бы затем обратиться, используя следующее:

$langCode = 'en';
$debtPos = strpos($lang[$langCode]['totalDebt']);

Существуют ли лучшие, проверенные методы для работы с кучей коротких строк, переведенных на несколько языков?

Ответы [ 5 ]

2 голосов
/ 06 ноября 2008

Для полного решения по переводу вы можете посмотреть решение, например gettext .

Ваше решение достаточно хорошее (быстрое, дешевое на ресурсы) для небольших словарей. Я не понял, что вы пытались сделать с помощью функции strpos ().

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

0 голосов
/ 07 ноября 2008

Вы, вероятно, не хотите 'totaldebt' => 'Total Debt', поскольку это в конечном итоге запутает ваш код и будет медленнее, чем просто сохранение 'Total Debt' в качестве хеш-ключа. Метод gettext - просто заключить строки в функцию.

так, а не:

echo "Color";

Вы делаете:

echo t("Color");

функция t () будет смотреть на глобально определенный язык и делать подстановку, если это возможно. В какой-то момент вы можете использовать gettext и делать это таким образом, будет совместимым.

0 голосов
/ 07 ноября 2008

Как сказал Питер, у вас есть правильная идея, но вы можете разделить ваши языки на разные файлы. Это означает, что PHP не нужно хранить массив каждого слова на каждом языке. Поскольку вы собираетесь загружать только один язык за раз, вы можете пропустить уровень вложенности $lang['us'].

Вы можете даже «расширить» языки:

<?php // lang.en-gb.php
$lang = array(
    'color' => "Colour",
    'totalDebt' => "Total Debt",
    ...
);
?>

<?php // lang.en-us.php
include('lang.en-gb.php');

$lang['color'] = "Color";
// don't need to redefine "totalDebt"
?>

Вы можете даже подумать о создании базового класса, который будет обрабатывать все это для вас: определить локаль, выбрать правильный файл, обработать «ошибку», если термин не определен в определенном языке и т. Д.

0 голосов
/ 07 ноября 2008

Я видел, как ваше решение использовалось в других проектах ОС, однако массив $lang обычно создается в разных файлах. Например:

<?php // lang.us.php
$LANG['us'] = array(
                    'totalDebt' => 'Total Debt',
                    'color' => 'Color',
                   );

и т. Д. Для lang.gb.php, lang.de.php и т. Д.

0 голосов
/ 06 ноября 2008

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

...