Интернационализация ПО: тонкости культуры в...
TRANSCRIPT
План О компании и о себе Hello, world! Кодировки и наборы символов The Turkish Test Языковые и региональные стандарты Кофе-брейк i18n, g11n, l10n, NLS Locale Дата и время. Практическое задание Многозвенные приложения Отказ от интернационализации
2/68
О себе В 2005 окончил мехмат
Ташкентского государственного университета С 2004 занимаюсь корпоративным
программным обеспечением В 2008 пришел в CUSTIS Работал разработчиком, техлидом,
тимлидом, сейчас занимаюсь архитектурой
3/68
Знаки препинания
en Are you sure you want to quit? Yes, of course.
ar .ھل أنت متأكد أنك ترید إنھاء؟ نعم بالطبع
zh-Hans 您确定要退出吗?是的,当然。
es ¿Seguro que quieres salir? Sí, por supuesto.
el Είστε σίγουροι ότι θέλετε να κλείσετε; Ναι, φυσικά.
12/68
Hello, world! Выводы
Не зашивать в код строки Выносить строки в ресурсы Внешнее по отношению к коду
хранение (текстовые или xml-файлы, БД и прочее)
Не конкатенировать строки Использовать строки форматирования Знаки препинания и разрывы
строк держать также в строке форматирования
Писать комментарии для переводчиков
Даже для нелокализуемогософта это правила
хорошего тона
Не относится к программным
константам
13/68
Кодировки и наборы символов(Encodings and Character Sets) Начало… ASCII – 7-битная кодировка В нее не помещаются даже все европейские символы
(é, ß, ü, ä, ö и др.) Extended-ASCII – использует 8-й бит Для группы языков (набора символов) нужна
собственная кодировка (codepage). Часто их несколько: для русского – cp866, KOI-8R, Windows-1251
А в китайском – около 3000 общеупотребимых иероглифов, а всего – более 80000
15/68
KOI-8R – код обмена информацией, 8 битов Основана на русской морзянке Русская морзянка построена на
сходстве звуков Как следствие: символы кириллицы в таблице
расположены не по алфавиту зато при отсекании старшего
бита текст остается читаемым
11000001 а 01000001 A · −
11000010 б 01000010 B − · · ·
11010111 в 01010111 W · − −
11000111 г 01000111 G − − ·
11000100 д 01000100 D − · ·
11000101 е 01000101 E ·
11010110 ж 01010110 V · · · −
11011010 з 01011010 Z − − · ·Да здравствует Юникод! dA ZDRAWSTWUET `NIKOD!
17/68
Что такое ? Это – стандарт кодирования символов… 1 114 112 символов, для которых определены
уникальные коды. Коды записываются с префиксом U+. Сам набор символов частенько называют Юникодом
Семейство кодировок UTF
19/68
Символ рубля U+20BD Официально утвержден 11 декабря 2013 года Появился в стандарте Юникода 16 июня 2014 года Новые шрифты Windows входят в обновление
KB2970228 от 2 сентября 2014 года Которого у многих пользователей нет
Многие разработчики не парятся Ну а остальные придумывают способы
(«тащат» с собой шрифты или используют CSS)
21/68
The Turkish Test Англоязычному или русскоязычному
пользователю редко важна регистрочувствительность* Совершенно естественной выглядит
возможность вводить, получать, искать информацию без учета регистра букв
* Есть языки, где нет регистра символов
23/68
Case Folding – изменение регистра Не во всех языках изменение регистра
такое же, как в латинском алфавите Изменение регистра может привести
к изменению числа символов немецкий: ToUpper(“groß”) == “GROSS”
Unicode содержит правила для Case Foldingи специальных случаев Использовать ToUpper() все же чуть
безопаснее, чем ToLower()
26/68
Языковые и региональные стандарты Примеры
Английский (США)
Английский (Индия)
Русский (Россия)
Немецкий (Германия)
Итальянский (Италия) Персидский
3/26/2015 7:30:12 PM 26.03.2015 19:30 26.03.2015 19:30 26.03.2015 19:30 26/03/2015
19.30.1226/03/2015
ظ.ب07:30:12
($12,345,678.90) ₹ -123,45,678.90 -12 345 678,90 ₽ -12.345.678,90 € -€ 12.345.678,90 -12،345،678/90لایر
13.00 % 13.00% 13,00% 13,00% 13,00% 13/00 %
28/68
Почитайте о нормализации строк в Unicode
Заостряйте внимание на том, какая локальиспользуется при сравнении строк и case folding’e(в том числе сортировке и поиске), форматировании: Явно указывайте инвариантную («пустую», «корневую»,
US English) для внутренних нужд, взаимодействия с другими системамилибоиспользуйте специальный формат, например XML’ный(2015-03-26T19:00:12+03:00)
Используйте пользовательскую (можно неявно), когда результат увидит пользователь
Промежуточные итоги
29/68
i18n, g11n, l10n, NLS
33/68
Локализация – не только перевод Какие элементы подлежат локализации? Строки Медиа (изображения, звуки, видео) UI LayoutВсе это мы будем называть ресурсамилокализации
А еще специфическими могут быть алгоритмы. Правда, нечасто Грамматика языка
36/68
Языковые и региональные стандарты Язык и система письма (письменность) Алфавит, правила сравнения
Числа Календарь, дата и время Валюта Система мер Структура почтового адреса, телефонного
номера Формат бумаги по умолчанию Печатные формы, отчеты ...
41/68
Описание языковых и региональных стандартов
Locale («локаль»), в .NET – Culture («культура») Имеет два компонента: Язык (обязательный) Регион (необязательный)
42/68
Locale Можно выделить три использования: Для языка отображения пользовательского
интерфейса Для форматирования дат, чисел и т. д.
и сравнения строк (сортировка, поиск, правила case folding’а)
Для пользовательского ввода (IME)
43/68
LocaleОбычно локали UI и форматирования Наследуются от системных Могут быть переопределены программно Применяются на приложение (Java)
или даже отдельный поток (Windows)
44/68
Процесс поиска подходящих ресурсов (Resource Fallback Process) Переводить для всех вариантов языка может быть
неоправданно или будет просто дублированием Пустой текст у пользовательского элемента UI
недопустим Ресурсы для ведущего
языка (языка по умолчанию, языка разработки) всегда актуальны и непусты
Локализация часто не успевает за версиями софта, и часто используется предыдущая версия локализации
50/68
Locale Не все встречающиеся в жизни сочетания
«язык – регион» существуют в операционных системах в виде локалей Молдавия (Молдова) говорит по-молдавски
(или на молдавском диалекте румынского) Локалей ro-MD, ro-MD-TRI в Windows нет А раньше даже были локали ru-MO, ro-MO
Тем не менее, запись на латинице одних и тех же румынских слов различается
Можно программно создавать собственные локали Пользователи поступают проще, указывая локаль
ro-RO
52/68
Особенности окруженияFolder name Folder path LanguageProgram Files C:\Program Files EnglishProgramme C:\Programme German
Archivos de programa C:\Archivos de programa Spanish
Programmes C:\Programmes FrenchProgrammi C:\Programmi Italian
Arquivos de Programas C:\Arquivos de Programas Portuguese
Program C:\Program SwedishProgrammer C:\Programmer DanishProgramfiler C:\Programfiler NorwegianFisiere Program C:\Fisiere Program Romanian
Program Files C:\Program FilesDutch / Russian / Polish / Czech / Chinese
53/68
Корреспондент Василий Пупкинотправился в длительную командировку по провинциям стран Ближнего Востока. Оплата прокатной машины почасовая, 1 долл/час.
Дата и время. Задача
1 марта 2015 в полдень Вася выехал из офиса в Тегеране, в полдень 22 марта подъехал к границе Ирана и Азербайджана в Астаре, а в полдень 29 марта 2015 будет уже в Баку.Сколько заплатит Вася за аренду авто?
55/68
Дата и время. Задача. Подсказки Иран и Азербайджан находятся в разных
часовых поясах А еще есть летнее время В разных странах переход на летнее время
(и обратно) происходит в разные дни В Азербайджане в последнее воскресенье
марта В Иране в третью субботу марта
56/68
Дата и время. Выводы Надо различать термины «часовой пояс»
(timezone) и «смещение» (offset) В Гринвиче (район Лондона)
тоже переходят на летнее время UTC и GMT – не одно и то же (GMT устарел)
58/68
Дата и время. Выводы В году не всегда 365 дней В сутках не всегда 24 часа В часе 60 минут В минуте не всегда 60 секунд Один и тот же момент времени может
случиться не единожды или не случиться вообще
59/68
Хранение даты-времени Журналирование прошедшие события
логично хранить с часовым поясом/смещением
Календарь/напоминания Нельзя хранить время
со смещением Не рекомендуется хранить
время с часовым поясом Лучше хранить местоположение
Универсального рецепта нет, все зависит от специфики задачи
60/68
Веб-приложения Браузер использует заголовок Accept-Language Указываются языки (code или code-Subcode) с весами
Сервер решает, может ли и хочет ли он предоставить контент на одном из запрошенных языков
Других стандартных средств нет
61/68
Веб-приложения А нам еще нужна информация о местоположении Геолокация? Неуниверсально, ненадежно… Датчики мобильных устройств
Анализ баз IP- и MAC-адресов
JavaScript
► Поэтому приложение должно предоставлять возможность изменить язык и/или регион
► Огромное количество приложений игнорирует локаль пользователя (настройки форматирования), что делает затруднительным, например, копипаств Excel
62/68
Веб-приложенияКстати, W3C не рекомендует использовать флаги для обозначения языков
“In addition, flags have nationalistic connotations that may be unwelcome for people of other countries, even though they speak the same language.”
63/68
Тестирование локализацииПсевдолокализация: В русскоязычных интерфейсах – транслитерация В англоязычных – Pig Latin
64/68
Отказ от интернационализации Style Герои серии игр говорят на искусственном
языке На Simlish (симском) даже есть песни
GitHub В 2011 году команда отказалась от поддержки
многоязычности и сосредоточилась на том, чтобы сделать GitHub быстрым и надежным
66/68
О чем мы не говорили? Работа с исключениями Нормализация в Unicode Шрифты Полнотекстовый поиск Взаимодействие с переводчиками …
67/68