68
26 марта 2015 года Интернационализация ПО: тонкости культуры в разработке Владислав Иофе Архитектор

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

  • Upload
    custis

  • View
    77

  • Download
    3

Embed Size (px)

Citation preview

26 марта 2015 года

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

Владислав ИофеАрхитектор

План О компании и о себе Hello, world! Кодировки и наборы символов The Turkish Test Языковые и региональные стандарты Кофе-брейк i18n, g11n, l10n, NLS Locale Дата и время. Практическое задание Многозвенные приложения Отказ от интернационализации

2/68

О себе В 2005 окончил мехмат

Ташкентского государственного университета С 2004 занимаюсь корпоративным

программным обеспечением В 2008 пришел в CUSTIS Работал разработчиком, техлидом,

тимлидом, сейчас занимаюсь архитектурой

3/68

О компании

Проектирование Заказная разработка

Бережное внедрение Масштабных IT-систем

4/68

Hello, world!

5/68

Hello, world! (2)

6/68

Hello, world! (3)

7/68

Hello, world! (4)

8/68

Hello, world! (5)

9/68

Hello, world! (6)

10/68

Hello, world! (7)

11/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)

14/68

Кодировки и наборы символов(Encodings and Character Sets) Начало… ASCII – 7-битная кодировка В нее не помещаются даже все европейские символы

(é, ß, ü, ä, ö и др.) Extended-ASCII – использует 8-й бит Для группы языков (набора символов) нужна

собственная кодировка (codepage). Часто их несколько: для русского – cp866, KOI-8R, Windows-1251

А в китайском – около 3000 общеупотребимых иероглифов, а всего – более 80000

15/68

KOI-8R

16/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

Extended-ASCII

18/68

Что такое ? Это – стандарт кодирования символов… 1 114 112 символов, для которых определены

уникальные коды. Коды записываются с префиксом U+. Сам набор символов частенько называют Юникодом

Семейство кодировок UTF

19/68

Символ рубля

20/68

Символ рубля U+20BD Официально утвержден 11 декабря 2013 года Появился в стандарте Юникода 16 июня 2014 года Новые шрифты Windows входят в обновление

KB2970228 от 2 сентября 2014 года Которого у многих пользователей нет

Многие разработчики не парятся Ну а остальные придумывают способы

(«тащат» с собой шрифты или используют CSS)

21/68

Кстати, о локализации

22/68

The Turkish Test Англоязычному или русскоязычному

пользователю редко важна регистрочувствительность* Совершенно естественной выглядит

возможность вводить, получать, искать информацию без учета регистра букв

* Есть языки, где нет регистра символов

23/68

The Turkish Test (2)

24/68

The Turkish Test (3)

25/68

Case Folding – изменение регистра Не во всех языках изменение регистра

такое же, как в латинском алфавите Изменение регистра может привести

к изменению числа символов немецкий: ToUpper(“groß”) == “GROSS”

Unicode содержит правила для Case Foldingи специальных случаев Использовать ToUpper() все же чуть

безопаснее, чем ToLower()

26/68

Языковые и региональные стандарты

27/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

Перерыв 10 минут

30/68

Buzzwords

31/68

i18n, g11n, l10n, NLS

32/68

Что здесь не так?

34/68

Локализация

35/68

Локализация – не только перевод Какие элементы подлежат локализации? Строки Медиа (изображения, звуки, видео) UI LayoutВсе это мы будем называть ресурсамилокализации

А еще специфическими могут быть алгоритмы. Правда, нечасто Грамматика языка

36/68

Локализация – не только перевод (2)

37/68

История

38/68

Когда работает банк?

39/68

Письменность

40/68

Языковые и региональные стандарты Язык и система письма (письменность) Алфавит, правила сравнения

Числа Календарь, дата и время Валюта Система мер Структура почтового адреса, телефонного

номера Формат бумаги по умолчанию Печатные формы, отчеты ...

41/68

Описание языковых и региональных стандартов

Locale («локаль»), в .NET – Culture («культура») Имеет два компонента: Язык (обязательный) Регион (необязательный)

42/68

Locale Можно выделить три использования: Для языка отображения пользовательского

интерфейса Для форматирования дат, чисел и т. д.

и сравнения строк (сортировка, поиск, правила case folding’а)

Для пользовательского ввода (IME)

43/68

LocaleОбычно локали UI и форматирования Наследуются от системных Могут быть переопределены программно Применяются на приложение (Java)

или даже отдельный поток (Windows)

44/68

Методы ввода

45/68

Методы ввода

46/68

Методы ввода

47/68

Фонетические методы ввода

48/68

Иерархия локалей

49/68

Процесс поиска подходящих ресурсов (Resource Fallback Process) Переводить для всех вариантов языка может быть

неоправданно или будет просто дублированием Пустой текст у пользовательского элемента UI

недопустим Ресурсы для ведущего

языка (языка по умолчанию, языка разработки) всегда актуальны и непусты

Локализация часто не успевает за версиями софта, и часто используется предыдущая версия локализации

50/68

.NET Resource Fallback

• en-IN → en → ru• en-GB → en → ru• zh-CN → zh-Hans → zh → ru

51/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

Особенности окружения

54/68

Корреспондент Василий Пупкинотправился в длительную командировку по провинциям стран Ближнего Востока. Оплата прокатной машины почасовая, 1 долл/час.

Дата и время. Задача

1 марта 2015 в полдень Вася выехал из офиса в Тегеране, в полдень 22 марта подъехал к границе Ирана и Азербайджана в Астаре, а в полдень 29 марта 2015 будет уже в Баку.Сколько заплатит Вася за аренду авто?

55/68

Дата и время. Задача. Подсказки Иран и Азербайджан находятся в разных

часовых поясах А еще есть летнее время В разных странах переход на летнее время

(и обратно) происходит в разные дни В Азербайджане в последнее воскресенье

марта В Иране в третью субботу марта

56/68

Дата и время. Задача

57/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

Трудности перевода

В рецепте сказано «варить неприкрытым»!

65/68

Отказ от интернационализации Style Герои серии игр говорят на искусственном

языке На Simlish (симском) даже есть песни

GitHub В 2011 году команда отказалась от поддержки

многоязычности и сосредоточилась на том, чтобы сделать GitHub быстрым и надежным

66/68

О чем мы не говорили? Работа с исключениями Нормализация в Unicode Шрифты Полнотекстовый поиск Взаимодействие с переводчиками …

67/68

Спасибо!Вопросы?

Владислав Иофе[email protected]

68/68