2009-03-24 4 views
0

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

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

$ first_name = 'имя'; $ last_name = 'last_name';

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

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

ли как-то в этой линии:

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

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

constants.php

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

define ('OPERATION_NOT_ALLOWED_ES', 'Эта операция не допускается!');

Каков рекомендуемый способ достижения этого?

ответ

3

вы можете следовать по стопам 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 или что-то подобное для наглядности.

+0

Я рекомендую этот метод также. – jerebear

0

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

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 ... повсюду. Если что-то специфично для локали, просто поместите его в файлы локали.

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

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

+0

Я определяю язык с помощью GET? Что-то вроде: $ locale = $ _GET ['lang']; ЧТО прочитает ури? – Codex73

+0

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

1

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

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

0

Для этого используются свободные сторонние элементы управления, используя стандартный 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"); 

и извлекать фразы, которые имеют параметры используйте следующий синтаксис, обратите внимание на соотношение между [ПАРОЛЬ] и «ключевое слово» является преднамеренным и рекомендуется

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

пример файла XML TS есть (должен быть назван 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

Ty, ожидая ссылки. – Codex73

Смежные вопросы