Arhn - архитектура программирования

Локализация сайта для многобайтовых языков

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

  • Если я использую экстернализацию строк, должны ли строки для японского или корейского языка быть в формате Unicode в файле локали (т. е. 台北 вместо 台北 в качестве строкового значения)?
  • Имеет ли смысл хранить локализацию в БД (например, MySQL) и извлекать соответствующие значения с помощью функции локализации в PHP?

Ваш вклад мысли очень ценится.

С наилучшими пожеланиями


Ответы:


1

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

Экстернализация строк

Конечно, вам нужно будет отделить переводимые строки от кода. Я бы рекомендовал хранить перевод в виде простого текста, файла в кодировке UTF-8, содержащего пары ключ-значение:

some.key=some translation

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

Распознавание языка

Веб-браузеры настолько хороши, что отправляют заголовок AcceptLanguage каждый раз, когда отправляют запрос. Что вам нужно сделать, так это прочитать содержимое этого заголовка и проверить, поддерживаете ли вы какой-либо из перечисленных пользователем языков. Если это так, прочитайте файл ресурсов (как определено выше) и верните строки для данного языка, в противном случае верните язык по умолчанию. Пример кода ниже даст вам наиболее желаемый язык (который не обязательно поддерживает тот, который вы поддерживаете):

<?php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>

Это еще не самая большая из ваших проблем.

Стили и таблицы стилей

Настоящая проблема с многоязычными веб-сайтами или веб-приложениями — это стили. Люди склонны вставлять определения стилей в очередь, что, по меньшей мере, проблематично. Кроме того, дизайнеры склонны думать, что Arial — лучший шрифт для всей Вселенной, а выделение всегда должно быть с жирным шрифтом. Единственная проблема заключается в том, что при некоторых обстоятельствах шрифт может быть нечитаемым.
Должен признаться, я не знаю, почему это происходит, но в большинстве случаев веб-браузеры склонны игнорировать жирный шрифт для азиатских шрифтов (что хорошо). , но иногда нет, и это может стать серьезной проблемой для конечных пользователей, если ваше определение шрифта, скажем, font-family:Arial; font-size:10px;.

Другой проблемой могут быть цвета. В зависимости от дизайна вашего веб-сайта некоторые используемые цвета могут не подходить для целевых клиентов. Это потому, что все мы склонны придавать значение цветам на основе нашего культурного фона.

Изображения, содержащие локализуемый текст, также могут доставить вам головную боль, вам нужно будет либо преобразовать такие тексты (и записать их так же, как любой другой элемент HTML), либо подготовить многоязычную структуру ресурсов (т.е. поместить все изображения в каталоги, названные в соответствии с кодом языка (" ан", "я", "ко")).

Настоящей проблемой, однако, являются жестко запрограммированные теги форматирования, такие как <b>, <i>, <u>, <strong> и т. д. Никто не должен использовать их в настоящее время, вместо них следует использовать классы стилей, но обычная практика отличается. Вам, вероятно, потребуется заменить их классами стиля; каждый элемент может иметь более одного класса стиля, что, к моему удивлению, не является общеизвестным (например, <p class="main boldText">).

Хорошо, после того, как вы внедрите свои стили, вам, вероятно, придется реализовать какой-то механизм локализации CSS. Это нужно в свете того, что я написал выше. Самый простой способ сделать это — создать структуру каталогов, подобную той, о которой я упоминал ранее: «en» для базовых CSS-файлов на английском языке, «ja» для японского и «ko» для корейского, чтобы каждый язык имел свой собственный отдельный набор. файлов CSS. Это похоже на скины пользовательского интерфейса, только в этом случае пользователь не сможет выбрать скин, вы сами решаете, какой CSS их представить - вы все равно обнаружите язык.

Что касается встроенных определений стилей (<p style="whatever">), после того, как вы определите механизм CSS L10n, вы можете переопределить любой стиль, принудительно задав его с помощью ключевого слова !important. То есть, если кто-то в своем совершенно неправом мышлении не вставил это ключевое слово в определение встроенного стиля.

Объединения

Ну, это твоя самая большая проблема. Даже люди, которые понимают необходимость экстернализации строк, склонны объединять строки следующим образом:

$result = $label + ": " + $product;
$message = "$your_basket_is + $basket_status + ".";

Это создает серьезную проблему для интернационализации (а если она не решена и для локализации). Это связано с тем, что порядок предложений обычно отличается после перевода текста на другой язык (особенно это касается корейского языка). Кроме того, я показал вам жестко закодированные знаки препинания, которые не обязательно корректны для азиатских языков. Это то, через что мне приходится проходить ежедневно :/

Что вам, вероятно, нужно сделать, так это удалить такие конкатенации или использовать некоторые средства форматирования сообщений. . Пример PHP (взятый непосредственно с веб-страницы, на которую я ссылаюсь):

<?php
$fmt = new MessageFormatter("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
echo $fmt->format(array(4560, 123, 4560/123));
$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum");
echo $fmt->format(array(4560, 123, 4560/123));
?>

Как вы можете видеть в этом примере, числа также отформатированы в стиле локали. Это приводит нас к:

Форматирование с учетом региональных настроек

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

Сводка

Я только что представил вам краткое введение в дизайн многоязычного веб-сайта с упором на целевые рынки Японии и Кореи. Если в какой-то момент вам также понадобится поддержка упрощенного китайского языка, вероятно, также потребуется поддержка кодировки GB18030. Это было бы очень сложно...

14.05.2011

2

0,02 доллара от человека, имеющего некоторый опыт работы с i18n...

  1. Держите свои переводы в удобочитаемой форме, так как, скорее всего, этими ресурсами будут управлять переводчики, а не программисты.
  2. Если этот текст (жестко закодированный, как вы говорите) не подвержен частым изменениям, то вы можете сохранить эти ресурсы в виде файлов, которые вы читаете во время выполнения.
  3. Если этот текст подвержен частым изменениям, вы можете изучить другие альтернативы для хранения ресурсов, такие как базы данных или хранилища ключей и значений в памяти.

В зависимости от ваших требований, вы можете рассмотреть сочетание вышеперечисленного.

Но я настоятельно рекомендую вам избегать смешивания кода (сущностей символов HTML) с вашими переводческими ресурсами. Большинство переводчиков не поймут, что они означают, и могут нарушить их при переводе. И, с другой стороны, программист может не понимать, как правильно вставлять код или форматировать в ресурсы перевода, если он действительно не понимает этот язык.

tl;dr 
  - use UTF-8
  - don't mix any code/formatting into the translations themselves
  - how you store the translations depends upon your requirements
13.05.2011

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..