#php #utf-8 #internationalization #gettext #utf-16
#php #utf-8 #интернационализация #gettext #utf-16
Вопрос:
Я работаю над приложением I18N, которое будет размещено на японском языке, я не знаю ни одного слова на японском, и сначала мне интересно, достаточно ли utf8 для этого языка.
Обычно для европейского языка достаточно utf8, и мне нужно настроить кодировку / параметры сортировки моей базы данных для использования utf8_general_ci (в MySQL) и мои html-представления в utf8, и этого достаточно.
Но как насчет японского, можно ли что-то еще сделать?
Кстати, мое приложение сможет обрабатывать английский, французский, японский, но позже может потребоваться добавить несколько языков, скажем, русский.
Как я мог бы настроить мое приложение I18N так, чтобы оно было широко доступно, без необходимости сильно изменять конфигурации при развертывании?
Есть ли какие-либо рекомендации?
Кстати, я планирую использовать gettext, я почти уверен, что он поддерживает такие языки без каких-либо проблем, поскольку это стандарт де-факто почти для всех программ GNU, но какие-либо отзывы?
Комментарии:
1. Посмотрите: yahoo.jp имеет кодировку UTF-8. Я думаю, это означает, что с UTF-8 все в порядке.
Ответ №1:
Пара моментов:
- UTF-8 подходит для внутренних данных вашего приложения, но если вам нужно обработать предоставленные пользователем документы (например, загружаемые файлы), они могут использовать другие кодировки, такие как Shift-JIS или ISO-2022-JP
- В японском тексте не используются пробелы между словами. Если вашему приложению где-то нужно разделить текст на слова, у вас проблема.
- Помимо текста, форматы даты и чисел различаются
- Общая сортировка может не привести к удобному порядку сортировки японского текста — если ваше приложение содержит большие списки, в которых людям приходится что-то искать, это может быть проблемой.
Комментарии:
1. Спасибо, это отличный контрольный список. Что-нибудь о направлении текста? Я думаю, что японский язык может быть написан в любом смысле, но может ли быть стандарт в Интернете, чтобы избежать проблем с языком rtl?
2. @Boris: Японский — это не rtl. Традиционно оно написано вертикальными линиями, но на электронных носителях этого практически никогда не делается. Однако Rtl связан с арабским и ивритом, и вы можете получить странные эффекты при смешивании их с текстом ltr. Но я знаю об этой проблеме не намного больше, чем то, что она существует — если вы хотите серьезно поддерживать языки rtl, вам придется изучить ее.
3. Я только что проверил, и вы правы, я был почти уверен, что где-то читал, что японский язык может быть RTL. Однако direction сейчас довольно злая предварительная оптимизация, но мне все равно стало любопытно. Спасибо
4. @Boris: ну, если вы пишете японский или китайский вертикально, строки становятся rtl.
Ответ №2:
Да, Unicode содержит все кодовые точки, необходимые для отображения английского, французского, японского, русского и практически любого языка в мире (включая тайваньский, чероки, эсперанто, действительно чего угодно, кроме эльфийского). Вот для чего это нужно. Однако из-за природы UTF8 текст на более эзотерических языках займет на несколько байт больше для хранения.
Gettext широко используется, и ваша сборка PHP, вероятно, даже включает его. Смотрите http://php.net/gettext для получения подробной информации об использовании.
Ответ №3:
Просто добавлю этот интересный веб-сайт, который поможет создать приложение I18N: http://www.i18nguy.com /
Ответ №4:
Если вы храните текст в текстовых файлах, то это выглядит следующим образом:
Это основная структура папок для language:
-lang
-en
-fr
-jp
etc
каждая вложенная папка, en, fr … содержит одни и те же файлы, одни и те же переменные с разными значениями.
Например, в lang/en/links.txt Вы бы
class txtLinks
{
public static $menu="Menu";
public static $products="Show products";
....
class txtErrors
{
public static $wrongUName="This user does not exists";
....
Затем, когда скрипт загружается, вы делаете
if(en)
define(__LANG,'en')
if(fr)
define(__LANG,'fr')
...
Затем
include('lang'.__LANG.'what ever file you want')
Тогда это фрагмент из вашего php-скрипта:
echo txtLink::$menu etc...
Если вы используете базу данных аналогичным образом, где вместо файлов у вас есть таблицы.
Таким образом, у вас есть абсолютная свобода, потому что вы можете передать английские файлы какому-нибудь человеку, который говорит, скажем, по-французски, и он сможет заполнить значения на французском языке, не будучи обязанным вообще разбираться в программировании.
И вам самому все равно, какой язык позже будет добавлен или удален.
И если вы работаете на mvc, вы можете разделить языковые файлы в соответствии с контроллерами, чтобы не загружать огромный текстовый файл.