Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Интернационализация ПО: тонкости культуры в раз...

CUSTIS
March 26, 2015

Интернационализация ПО: тонкости культуры в разработке

Открытый семинар для студентов в компании CUSTIS (26 марта 2015 года).
Лектор: Владислав Иофе, архитектор.

CUSTIS

March 26, 2015
Tweet

More Decks by CUSTIS

Other Decks in Programming

Transcript

  1. План  О компании и о себе  Hello, world!

     Кодировки и наборы символов  The Turkish Test  Языковые и региональные стандарты  Кофе-брейк   i18n, g11n, l10n, NLS  Locale  Дата и время. Практическое задание  Многозвенные приложения  Отказ от интернационализации 2/65
  2. О себе  В 2005 окончил мехмат Ташкентского государственного университета

     С 2004 занимаюсь корпоративным программным обеспечением  В 2008 пришел в CUSTIS  Работал разработчиком, техлидом, тимлидом, сейчас занимаюсь архитектурой 3/65
  3. Знаки препинания en Are you sure you want to quit?

    Yes, of course. ar عبطلاب معن ؟ءاهنإ ديرت كنأ دكأتم تنأ له . zh-Hans 您确定要退出吗?是的,当然。 es ¿Seguro que quieres salir? Sí, por supuesto. el Είστε σίγουροι ότι θέλετε να κλείσετε; Ναι, φυσικά. 12/65
  4. Hello, world! Выводы Не зашивать в код строки Выносить строки

    в ресурсы  Внешнее по отношению к коду хранение (текстовые или xml- файлы, БД и прочее) Не конкатенировать строки Использовать строки форматирования  Знаки препинания и разрывы строк держать также в строке форматирования  Писать комментарии для переводчиков Даже для нелокализуемого софта это правила хорошего тона 13/65 Не относится к программным константам
  5. Кодировки и наборы символов (Encodings and Character Sets)  Начало…

     ASCII – 7-битная кодировка  В нее не помещаются даже все европейские символы (é, ß, ü, ä, ö и др.)  Extended-ASCII – использует 8-й бит  Для группы языков (набора символов) нужна собственная кодировка (codepage). Часто их несколько: для русского – cp866, KOI-8R, Windows-1251  А в китайском – около 3000 общеупотребимых иероглифов, а всего – более 80000 15/65
  6. 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/65
  7. Что такое ?  Это – стандарт кодирования символов… 

    1 114 112 символов, для которых определены уникальные коды. Коды записываются с префиксом U+. Сам набор символов частенько называют Юникодом  Семейство кодировок UTF 19/65
  8. Символ рубля U+20BD  Официально утвержден 11 декабря 2013 года

     Появился в стандарте Юникода 16 июня 2014 года  Новые шрифты Windows входят в обновление KB2970228 от 2 сентября 2014 года  Которого у многих пользователей нет  Многие разработчики не парятся  Ну а остальные придумывают способы («тащат» с собой шрифты или используют CSS) 21/65
  9. The Turkish Test  Англоязычному или русскоязычному пользователю редко важна

    регистрочувствительность*  Совершенно естественной выглядит возможность вводить, получать, искать информацию без учета регистра букв * Есть языки, где нет регистра символов 23/65
  10. Case Folding – изменение регистра  Не во всех языках

    изменение регистра такое же, как в латинском алфавите  Изменение регистра может привести к изменению числа символов  немецкий: ToUpper(“groß”) == “GROSS”  Unicode содержит правила для Case Folding и специальных случаев  Использовать ToUpper() все же чуть безопаснее, чем ToLower() 26/65
  11. Языковые и региональные стандарты Примеры Английский (США) Английский (Индия) Русский

    (Россия) Немецкий (Германия) Итальянский (Италия) Персидский 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.12 26/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/65
  12.  Почитайте о нормализации строк в Unicode  Заостряйте внимание

    на том, какая локаль используется при сравнении строк и case folding’e (в том числе сортировке и поиске), форматировании:  Явно указывайте инвариантную («пустую», «корневую», US English) для внутренних нужд, взаимодействия с другими системами либо используйте специальный формат, например XML’ный (2015-03-26T19:00:12+03:00)  Используйте пользовательскую (можно неявно), когда результат увидит пользователь Промежуточные итоги 29/65
  13. Локализация – не только перевод  Какие элементы подлежат локализации?

     Строки  Медиа (изображения, звуки, видео)  UI Layout Все это мы будем называть ресурсами локализации  А еще специфическими могут быть алгоритмы. Правда, нечасто  Грамматика языка 36/65
  14. Языковые и региональные стандарты  Язык и система письма (письменность)

     Алфавит, правила сравнения  Числа  Календарь, дата и время  Валюта  Система мер  Структура почтового адреса, телефонного номера  Формат бумаги по умолчанию  Печатные формы, отчеты  ... 41/65
  15. Описание языковых и региональных стандартов Locale («локаль»), в .NET –

    Culture («культура»)  Имеет два компонента:  Язык (обязательный)  Регион (необязательный) 42/65
  16. Locale  Можно выделить три использования:  Для языка отображения

    пользовательского интерфейса  Для форматирования дат, чисел и т. д. и сравнения строк (сортировка, поиск, правила case folding’а)  Для пользовательского ввода (IME) 43/65
  17. Locale Обычно локали UI и форматирования  Наследуются от системных

     Могут быть переопределены программно  Применяются на приложение (Java) или даже отдельный поток (Windows) 44/65
  18. Процесс поиска подходящих ресурсов (Resource Fallback Process)  Переводить для

    всех вариантов языка может быть неоправданно или будет просто дублированием  Пустой текст у пользовательского элемента UI недопустим  Ресурсы для ведущего языка (языка по умолчанию, языка разработки) всегда актуальны и непусты  Локализация часто не успевает за версиями софта, и часто используется предыдущая версия локализации 48/65
  19. .NET Resource Fallback • en-IN → en → ru •

    en-GB → en → ru • zh-CN → zh-Hans → zh → ru 49/65
  20. Locale  Не все встречающиеся в жизни сочетания «язык –

    регион» существуют в операционных системах в виде локалей  Молдавия (Молдова) говорит по-молдавски (или на молдавском диалекте румынского)  Локалей ro-MD, ro-MD-TRI в Windows нет  А раньше даже были локали ru-MO, ro-MO  Тем не менее, запись на латинице одних и тех же румынских слов различается  Можно программно создавать собственные локали  Пользователи поступают проще, указывая локаль ro-RO 50/65
  21. Особенности окружения Folder name Folder path Language Program Files C:\Program

    Files English Programme C:\Programme German Archivos de programa C:\Archivos de programa Spanish Programmes C:\Programmes French Programmi C:\Programmi Italian Arquivos de Programas C:\Arquivos de Programas Portuguese Program C:\Program Swedish Programmer C:\Programmer Danish Programfiler C:\Programfiler Norwegian Fisiere Program C:\Fisiere Program Romanian Program Files C:\Program Files Dutch / Russian / Polish / Czech / Chinese 51/65
  22. Корреспондент Василий Пупкин отправился в длительную командировку по провинциям стран

    Ближнего Востока. Оплата прокатной машины почасовая, 1 долл/час. Дата и время. Задача 1 марта 2015 в полдень Вася выехал из офиса в Тегеране, в полдень 22 марта подъехал к границе Ирана и Азербайджана в Астаре, а в полдень 29 марта 2015 будет уже в Баку. Сколько заплатит Вася за аренду авто? 52/65
  23. Дата и время. Задача. Подсказки  Иран и Азербайджан находятся

    в разных часовых поясах  А еще есть летнее время  В разных странах переход на летнее время (и обратно) происходит в разные дни  В Азербайджане в последнее воскресенье марта  В Иране в третью субботу марта 53/65
  24. Дата и время. Выводы  Надо различать термины «часовой пояс»

    (timezone) и «смещение» (offset)  В Гринвиче (район Лондона) тоже переходят на летнее время   UTC и GMT – не одно и то же (GMT устарел) 55/65
  25. Дата и время. Выводы  В году не всегда 365

    дней  В сутках не всегда 24 часа  В часе 60 минут  В минуте не всегда 60 секунд  Один и тот же момент времени может случиться не единожды или не случиться вообще 56/65
  26. Хранение даты-времени  Журналирование  прошедшие события логично хранить с

    часовым поясом/смещением  Календарь/напоминания  Нельзя хранить время со смещением  Не рекомендуется хранить время с часовым поясом  Лучше хранить местоположение  Универсального рецепта нет, все зависит от специфики задачи 57/65
  27. Веб-приложения  Браузер использует заголовок Accept-Language  Указываются языки (code

    или code-Subcode) с весами  Сервер решает, может ли и хочет ли он предоставить контент на одном из запрошенных языков  Других стандартных средств нет 58/65
  28. Веб-приложения  А нам еще нужна информация о местоположении 

    Геолокация? Неуниверсально, ненадежно…  Датчики мобильных устройств  Анализ баз IP- и MAC-адресов  JavaScript ► Поэтому приложение должно предоставлять возможность изменить язык и/или регион ► Огромное количество приложений игнорирует локаль пользователя (настройки форматирования), что делает затруднительным, например, копипаст в Excel 59/65
  29. Веб-приложения Кстати, W3C не рекомендует использовать флаги для обозначения языков

    “In addition, flags have nationalistic connotations that may be unwelcome for people of other countries, even though they speak the same language.” 60/65
  30. Отказ от интернационализации  Style  Герои серии игр говорят

    на искусственном языке  На Simlish (симском) даже есть песни  GitHub  В 2011 году команда отказалась от поддержки многоязычности и сосредоточилась на том, чтобы сделать GitHub быстрым и надежным 63/65
  31. О чем мы не говорили?  Работа с исключениями 

    Нормализация в Unicode  Шрифты  Полнотекстовый поиск  Взаимодействие с переводчиками  … 64/65