Создать веб-страницу с мультиязычностью в PHP - PullRequest
3 голосов
/ 22 апреля 2009

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

Ответы [ 10 ]

8 голосов
/ 04 мая 2009

Странно, но многие разработчики php считают, что все естественные языки имеют одинаковую грамматику. Создание структуры перевода без параметров просто невозможно. Хотя строка $lang['welcomeTo'] $sitename может корректно переводиться для большинства языков (Welcome to stackoverflow), она не работает, например, для турецкого языка, где она должна быть $sitename $lang['welcomeTo'] (stackoverflow'a hos geldiniz), или для немецкого языка, где возможен любой из этих способов (Willkommen auf stackoverflow / Stackoverflow heißt Sie willkommen). И это ухудшается, когда вы пытаетесь переводить предложения с несколькими переменными.

Единственный вариант - использовать параметризованные переводы (скажем, функции)

Language::getCurrentLanguage()->translate('welcomeTo', array('sitename' => $sitename));

# Translation file for english (configfile-style):
welcomeTo=Welcome to $sitename

# Translation file for turkish:
welcomeTo=$sitename'a hos geldiniz

# Translation file for german:
welcomeTo=Willkommen auf $sitename
# Or
welcomeTo=$sitename heißt sie willkommen

Вкратце: если вам нужен настоящий i18n, используйте функции для получения ваших переводов, а не переменные. Возможно, вы захотите посмотреть и на расширение intl в php.

7 голосов
/ 22 апреля 2009

Мы используем http://php.net/manual/en/intro.gettext.php способ. Работает нормально, и все мы уже работали с http://www.gnu.org/software/gettext/manual/gettext.html в других проектах (не PHP-проектах). Так что было легко начать.

Я думаю, правильный путь зависит от того, кто переводит текст! Если это разработчик (и), вы можете иметь для каждого языка свой вид. Но если у вас есть другие люди, которые переводят текст, то что-то вроде gettext (перевод находится в отдельном файле и есть инструменты для работы с файлами такого типа) - правильный выбор!

2 голосов
/ 22 апреля 2009

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

$_SESSION["lang"] = "en";
$_SESSION["lang"] = $_GET["lang"]; 
// or this way, then you can do example.com/?lang=en

Затем создайте файл с массивом перевода.

$lang["en"]["welcome"] = "Welcome to the site";

И тогда другой файл может иметь немецкий перевод

$lang["de"]["welcome"] = "Willkommen auf der Webseite";

И тогда вы просто вызовете массив $ lang с сеансом

echo $lang[$_SESSION["lang"]]["welcome"];

Это упрощенная версия, вы также можете использовать объекты для хранения перевода. Но я не рекомендую использовать базу данных для хранения перевода, поскольку для этого требуется либо очень большой SELECT, либо очень очень много.

1 голос
/ 04 мая 2009

Одним из эффективных способов создания многоязычных веб-сайтов является не использование жестко закодированных меток, а извлечение их из соответствующего языкового файла, потому что в основном вам нужно ориентировать разных пользователей на вашем сайте. Если у вас отображены данные, которые вы храните в базе данных, возможно, вам следует подумать о добавлении таблиц базы данных, хранящих переводы на разные языки. Например, для выполнения некоторой работы в C # вы можете использовать Resource Files, хранящие значения меток.

1 голос
/ 04 мая 2009

Обычно вам нужен веб-сайт с поддержкой UTF-8. Это устанавливается через заголовок файла. (и может быть установлен с помощью функции header ()).

Тогда, я думаю, вы хотите, чтобы сайт был на английском и китайском языках. Тогда я бы порекомендовал иметь языковой файл. Возможно, массив или объект, где вы храните абзацы, которые вы хотите отобразить на сайте. А потом вы просто распечатываете этот абзац.

Тогда, чтобы узнать, какой язык запрашивает пользователь, я бы использовал $ _SESSION для сохранения выбранного языка.

Тогда ваш языковой файл может выглядеть следующим образом

$lang["en"]["Welcome"] = "Welcome to the site";

И тогда у китайского файла приветствия будет что-то вроде этого

$lang["ch"]["Welcome"] = "歡迎";

Затем в месте, где вы хотите распечатать это. Вы бы сделали

echo $lang[$_SESSION["lang"]]["Welcome"];
0 голосов
/ 14 октября 2009

Как сказал Грегор; gettext - это профессиональный способ для меня ...

вот хорошая статья ссылка

Но я хочу добавить несколько важных моментов

I- С этим методом вам придется использовать файлы .po и .mo, если вы создаете po-файл под windows, вы не можете использовать его под linux. Или .po файл, созданный в Linux, не может быть использован под Windows.

II - Linux может создавать .po файлы самостоятельно, но в Windows я предлагаю вам использовать такую ​​программу, как poedit (которую вы можете получить с ее сайта: http://www.poedit.net/)

III- В некоторых регионах есть проблемы с характером. Но я не помню, кто из них?: (

0 голосов
/ 04 мая 2009

Rails справляется с этим хорошо . Возможно, вы захотите проверить это для идей о том, как это сделать.

0 голосов
/ 04 мая 2009

Вы можете просто ввести контентную часть своего HTML в любом наборе символов, который вы хотите. Просто убедитесь, что правильно настроили кодировку и кодировку контента . Например, установите его в UTF-8 для простого Unicode.

0 голосов
/ 22 апреля 2009

Большинство фреймворков будут иметь помощников, которые помогут вам в этом. Вот Codeigniter и cakePHP , для начала.

0 голосов
/ 22 апреля 2009

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

application/
 someScript.php
views/
 de/
  someView.php
 en/
  someView.php
models/
 someModel.php

И затем, как предлагает Олафур, сохраните язык в переменной сеанса и сделайте что-то вроде этого.

 session_start(); //dont forget to call this somewhere
 $_SESSION['lang'] = 'en';
 //and then in somewehere else:
 include 'views/'.$_SESSION['lang'].'/someView.php'; //or whatever method is used to include views.

EDIT
Вы должны отделить свой вывод от вашего сценария. Таким образом, у вас будет скрипт, который выполняет некоторые скриптовые функции, такие как получение точной метки времени UNIX, это будет someScript.php в приведенном выше примере:

  //someScript.php
  $timestamp = time();

Теперь мы могли бы добавить все выходные данные непосредственно под этим, но это усложнило бы поддержку, поэтому мы делаем вывод в другом файле, который здесь будет файлом someView.php. Таким образом, someView.php в папке 'en' будет выглядеть так:

<html>
<head>
<title>Currect UNIX timestamp!</title>
</head>
<body>
<p>The current UNIX timestamp is: <?php echo $timestamp; ?> seconds</p>
</body></html>

И в папке 'de' это будет практически тот же файл, но со всем текстом на немецком языке.

Теперь все, что нам нужно сделать, это включить эти выходные файлы в наш someScript.php, поэтому мы добавляем следующую строку в конец этого скрипта:

 include '../views/'.$_SESSION['lang'].'/someView.php';

Вы должны прочитать больше о MVC здесь: http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

Примечание: То, что этот пример не является строгим MVC, но это должно дать вам представление.

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