Всегда хочется верить, что создаваемый вами программный продукт выйдет за пределы вашей страны.
Это с одной стороны.
С другой стороны, количество возникающих по этой причине трудностей будет очень велико.
В этом посте я постараюсь раскрыть некоторые из них.
0. В чем именно проблема? Давайте сначала рассмотрим сложность интернационализации.
Условно перед нами программа, написанная в России и имеющая русский интерфейс, поэтому ее нужно будет перевести на любой другой язык, например, на французский.
Почему в примере французский? А все очень просто - там есть такое понятие как диакритика, так что придется использовать Юникод и одной только английской раскладкой не обойтись ;) Итак, что нам нужно перевести?
- интерфейс приложения
установщик (если он у вас есть)
Конечно, современная тенденция такова, что установщиком часто пользоваться не нужно, однако мне всегда удобно отображать лицензионное соглашение (это тоже прекрасно соответствует российскому законодательству).
Мы не можем выпускать наш продукт для внешнего мира без правил, не так ли? Давайте перейдем к проблеме.
Хранить отдельные версии приложения на разных языках будет не очень удобно.
Представьте себе объем изменений, которые нужно будет внести при редактировании кода, а также помните, что отдавать исходный код переводчику тоже будет не очень корректно.
Следовательно, у нас должен быть один и тот же исходный код. Другой метод — файлы ресурсов, то есть когда язык «встроен» в приложение (либо исполняемый файл, либо библиотеку).
Возникает вопрос – как его определить и выбрать.
1. Подходящее решение Когда передо мной встала эта проблема, я выбрал следующие правила интернационализации: 1. Инсталлятор должен позволять пользователю выбирать язык установщика, при этом окно установщика с предложением выбора языка выбирает его исходя из языковой версии операционной системы, и именно на этом языке создаются все ярлыки 2. Язык приложения выбирается отдельно на одном из этапов установки.
3. Пользователь должен выбрать, поддержка каких языков ему необходима в приложении.
4. После установки приложения должна появиться возможность выбора другого языка интерфейса.
2. Как мы это сделаем? Вопрос выбора установщика заслуживает отдельного и масштабного обсуждения, но я использую NSIS. Поэтому реализовать первые три пункта удалось без проблем — в NSIS с самого начала есть многоязычная поддержка, я лишь немного подправил языковые файлы.
Далее я должен рассказать вам, каким путем я пошел с языковыми файлами.
На мой взгляд, элегантным решением было взять для каждого языка файл *.
xml, сохранив в нем все необходимые строки.
В самом исполняемом файле я «зашит» только английский язык, на случай, если пользователь со злости удалит все языковые файлы.
XML для меня удобен еще и тем, что я могу быстро проверить файл на корректность по схеме, то есть, если пользователь сам отредактирует языковой файл и допустит ошибку, программа его не загрузит. XML достаточно хорошо поддерживает Unicode, это тоже был большой плюс.
3. Что произошло в итоге? В итоге решение выглядит так - в папке программы после установки есть языковая папка.
Языковые файлы он хранит под именами ru.xml, en-GB.xml, en-US.xml и так далее.
Набор языковых файлов определяется пользователем при установке.
в папке с программой находится файл Language.xml, содержащий данные для выбранного пользователем языка.
Утилита выбора языка копирует XML-файл из языковой папки в корневую папку программы, тем самым определяя язык.
4. Осложнения
веб сервер
Все бы ничего, если бы не одно «но» — один из компонентов моей программы содержал самописный веб-сервер, предназначенный для более удобной отладки.Он не предлагал никакого активного контента, а просто генерировал отладочные данные.
Однако среди них была дата.
В чем проблема с датой? В общих чертах – ничего.
Когда пользователь делает запрос, я извлек поле Accept-Language из HTTP-запроса и всегда точно знал, какой язык возвращать.
Но преобразование даты в строку выполняется на стороне сервера.
Поэтому, чтобы всё работало корректно, нужно сменить язык потока обработки на тот язык, который запрашивает браузер пользователя.
Тогда все будет совершенно правильно.
И, конечно же, я хранил ресурсы веб-сервера в отдельных папках с именами «ru», «en-GB» и так далее.
Если там не нашлось языка, который просил пользователь, то я бы из ресурсов выдал стандартный файл на английском языке.
Длина слов (строк)
Конечно, одни и те же слова в разных языках различаются.Поэтому при создании интерфейса приложения стоит об этом помнить.
Хороший пример — английская «Unlock» и украинская «Rozblokuvati».
Разница в цифрах
Помните, что если в русском языке разделителем целой и дробной части числа является запятая, то в английском, например, это точка.А для разделения тысяч используется запятая, то есть запись на русском языке «1 000 000,00» на английском языке должна выглядеть так «1 000 000,00».
Разница дат
Несмотря на то, что ISO задает формат хранения даты (ГГГГ-ММ-ДД), не всегда все так просто и радостно.В России его можно записать как ДД-ММ-ГГГГ, а в США — ММ-ДД-ГГГГ.
Общий совет относительно чисел и дат — форматировать их с учетом языка пользователя и ни при каких обстоятельствах не «встраивать» в программу самодельный механизм их обработки.
С любовью, мания
-
Итоги 2015: Веб-Разработка
19 Oct, 24 -
Продажи: «Еще Одна Фича И Продажи Будут»
19 Oct, 24