Я хотел бы разработать многоязычную страницу на PHP, например, на английском / немецком / японском языке. Поэтому, когда я нажимаю на немецкий язык, язык страницы будет изменяться на немецкий, затем я нажму английский, чтобы он изменился на английский. Пожалуйста, помогите мне сделать это. Заранее спасибо….
Как ни странно, многие разработчики 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, используйте функции для получения ваших переводов, а не переменных. Возможно, вам захочется заглянуть в внутреннее расширение php.
Мы используем способ http://php.net/manual/en/intro.gettext.php . Хорошо работает, и все мы уже работали с http://www.gnu.org/software/gettext/manual/gettext.html в других проектах (не PHP-проектах). Так было легко начать.
Я думаю, что правильный путь зависит от того, кто переводит текст! Если это разработчик (ы), вы можете иметь для каждого языка собственный вид. Но если у вас есть другие люди, переводящие текст, что-то вроде gettext (перевод в выделенный файл и есть инструменты для работы с такими типами файлов) правильный выбор!
Вы можете использовать сеансы для хранения языка, который пользователь установил.
$_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 или очень многими.
Обычно вам нужен веб-сайт с поддержкой UTF-8. Это устанавливается через заголовок файла. (и может быть задано с помощью функции header ()).
Тогда я предполагаю, что вы хотите иметь сайт на английском и китайском языках. Тогда я бы рекомендовал иметь языковой файл. Возможно, массив или объект, где вы храните абзацы, которые хотите отобразить на сайте. И тогда вы просто распечатываете этот параграф.
Затем, чтобы узнать, на каком языке запрашивается пользователь, я бы использовал $ _SESSION для хранения выбранного вами языка.
Тогда ваш языковой файл может выглядеть так:
$lang["en"]["Welcome"] = "Welcome to the site";
И тогда у китайского файла приветствия будет что-то вроде этого
$lang["ch"]["Welcome"] = "歡迎";
Затем в месте, которое вы хотите распечатать. Вы бы сделали
echo $lang[$_SESSION["lang"]]["Welcome"];
Одним из эффективных способов создания многоязычных веб-сайтов является не использование жестко закодированных ярлыков, а получение их из соответствующего языкового файла, потому что в основном то, что вам нужно сделать, – это ориентировать разных пользователей на вашем сайте. Если бы вы отображали данные, хранящиеся в базе данных, возможно, вам стоит рассмотреть возможность добавления некоторых таблиц базы данных, хранящих переводы на разных языках. Чтобы выполнить некоторую работу в C #, например, вы можете использовать файлы ресурсов, хранящие значения меток.
В большинстве инфраструктур будут помощники, которые помогут вам в этом. Здесь используются Codeigniter и cakePHP для стартеров.
Вы можете просто набрать часть содержимого вашего HTML в любом наборе символов, который вам нужен. Просто не забудьте правильно установить кодировку и кодировку содержимого . Например, установите его в UTF-8 для простого юникода.
Rails отлично справляется с этим. Вы можете проверить это на предмет того, как это сделать.
Как сказал Грегор; gettext – это профессиональный способ для меня …
вот хорошая ссылка на статью
Но я хочу добавить некоторые важные моменты
I- С помощью этого метода u вам придется использовать файлы .po и .mo, если вы создаете po-файл под окнами, вы не можете использовать его под Linux. Или файл .po, созданный под Linux, не может использоваться под окнами.
II-linux может создавать сами файлы .po, но в Windows я предлагаю вам использовать такую программу, как poedit (которую вы можете получить со своего сайта: http://www.poedit.net/ )
III. Некоторые локали имеют проблемы характера. Но я не помню, кто они? 🙁
Я лично перевел свои полные взгляды. Таким образом, у вас будет файловая структура, например:
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.
РЕДАКТИРОВАТЬ
Вы должны отделить вас от своего сценария. Таким образом, у вас будет скрипт, который выполняет некоторые скриптовые записи, например, получение искомой метки времени 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, но это должно дать вам эту идею.