Как реализовать многоязычность в приложении PHP? - PullRequest
0 голосов
/ 24 марта 2009

Я отправляю этот вопрос самостоятельно, так как нашел пост, в котором отсутствует полное объяснение или лучший способ сделать это.

Должен ли я использовать языковой файл для именования элементов, таких как:

$ first_name = 'name'; $ last_name = 'last_name';

а затем включить этот файл в зависимости от выбора?

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

Понравится что-то в этих строках:

http://www.myapp.com/?lang=en http://www.myapp.com/?lang=es

Должен ли я использовать файл констант для этой цели?

constants.php

define ('OPERATION_NOT_ALLOWED_EN', 'Эта операция не разрешена!');

define ('OPERATION_NOT_ALLOWED_ES', 'Эта операция не разрешена!');

Каков рекомендуемый способ сделать это?

Ответы [ 5 ]

3 голосов
/ 24 марта 2009

Вы можете следовать по стопам phpBB - они используют массив $lang[] с кодом, похожим на:

$lang['Next'] = 'Next';
$lang['Previous'] = 'Previous';
$lang['Goto_page'] = 'Goto page';
$lang['Joined'] = 'Joined';
$lang['IP_Address'] = 'IP Address';

$lang['Select_forum'] = 'Select a forum';
$lang['View_latest_post'] = 'View latest post';
$lang['View_newest_post'] = 'View newest post';
$lang['Page_of'] = 'Page <b>%d</b> of <b>%d</b>'; // Replaces with: Page 1 of 2 for example

$lang['ICQ'] = 'ICQ Number';
$lang['AIM'] = 'AIM Address';
$lang['MSNM'] = 'MSN Messenger';
$lang['YIM'] = 'Yahoo Messenger';

Он, конечно, включен в файл, указанный в настройках пользователя, но вы можете согласиться с предложением ?lang=en в строке запроса, чтобы получить доступ к чему-то похожему на constants.php файл.

Возможно, вы захотите назвать файл lang_en.php или что-то подобное для ясности.

1 голос
/ 24 марта 2009

Как это реализовать? Как Zend_Translate.

1 голос
/ 24 марта 2009

Это будет работать для строк, которые вы дали в своем примере. Но есть и другие осложнения. Например, вы хотите отформатировать даты в соответствующем формате для локали (es vs en?). Как насчет форматирования чисел и валют? Кроме того, у вас могут быть «динамические» сообщения: «У вас есть сообщения $ x во входящих» Где вы хотите передать переменные. Проверьте некоторые из библиотек php локализации. Вот онлайн-учебник: http://www.devx.com/webdev/Article/38732.

Также посмотрите на структуру, которую вы используете. Многие из них имеют поддержку локализации.

0 голосов
/ 24 марта 2009

Существуют бесплатные сторонние элементы управления для этого с использованием стандартного XML-файла ISO (я написал утилиту базы данных для создания, редактирования и экспорта в этот формат).

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

Необходимый элемент управления находится по адресу: http://ezcomponents.org/docs/api/trunk/introduction_Translation.html

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

require_once "ezc/Base/base.php";
/**
 * __autoload()
 *
 * @param mixed $className
 * @return
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

Затем вы должны указать, где находится файл языка XML (см. ISO639-2, ISO3166 и Qt Linguist)

$config["language_code"] = "en_us"; // as defined by ISO639-2 and ISO3166

// grab our translation XML file
$backend = new ezcTranslationTsBackend( dirname( __FILE__ ). '/translations' );
$backend -> setOptions( array( 'format' => $config["language_code"].'.xml' ) );

// create a manager object
$manager = new ezcTranslationManager( $backend );

$language = $manager->getContext( $config["language_code"], 'strings' );

теперь вы можете захватывать строки, просто вызывая следующую функцию

getTranslation( "SOME_KEY" );

и для извлечения фраз, имеющих параметры, используйте следующий синтаксис, обратите внимание, что связь между [KEYWORD] и «ключевым словом» является преднамеренной и рекомендуется

getTranslation( "FIND_[KEYWORD]_BY_[TYPE]", array("keyword" => $keyword, "type" => $type ) );

Пример файла TS XML (должен называться en_US.xml)

<!DOCTYPE TS>
<TS>
<context>
    <name>strings</name>
    <message>
        <source>ZONE_TYPE</source>
        <translation>Zone Type</translation>
    </message>
    <message>
        <source>ZONE_TOOL</source>
        <translation>Zone Tool</translation>
    </message>
    <message>
        <source>HELLO_[NAME]_WELCOME_TO</source>
        <translation>Hello, %name, welcome to Webfood Admin</translation>
    </message>
    <message>
        <source>YOUR_ADMINISTRATIVE_SESSION_HAS</source>
        <translation>Your administrative session has timed out. Please login again.</translation>
    </message>
</context>
</TS>

В ваших сеансах PHP просто будет параметр, в котором хранится используемый язык, возможно, спросите пользователя до или после того, как он войдет в систему на каком языке он хочет, и сохраните его в своей таблице пользователей, если у вас есть учетные записи. Нет причин продолжать посылать значение URL снова и снова, это плохая идея.

0 голосов
/ 24 марта 2009

Я бы использовал специфичные для локали файлы с константами, например:

locale_en.php:

define('GREETING', "Welcome to Widgets Inc');

и

locale_de.php:

define('GREETING', 'Wir begruessen Sie zu Widgets Inc');

в вашей настройке вы определяете локаль и делаете:

if ($locale == 'en') {
  require 'locale_en.php';
} else if ($locale == 'de') {
  require 'locale_de.php';
}

Это дает вам преимущество констант и делает локализацию достаточно прозрачной для вашего приложения, поскольку вам не нужно делать if ($locale ... повсюду. Если что-то зависит от локали, просто поместите это в файлы локали.

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

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

...