Кодировки и наборы символов  The Turkish Test  Языковые и региональные стандарты  Кофе-брейк   i18n, g11n, l10n, NLS  Locale  Дата и время. Практическое задание  Многозвенные приложения  Отказ от интернационализации 2/65
 С 2004 занимаюсь корпоративным программным обеспечением  В 2008 пришел в CUSTIS  Работал разработчиком, техлидом, тимлидом, сейчас занимаюсь архитектурой 3/65
Yes, of course. ar عبطلاب معن ؟ءاهنإ ديرت كنأ دكأتم تنأ له . zh-Hans 您确定要退出吗?是的,当然。 es ¿Seguro que quieres salir? Sí, por supuesto. el Είστε σίγουροι ότι θέλετε να κλείσετε; Ναι, φυσικά. 12/65
в ресурсы  Внешнее по отношению к коду хранение (текстовые или xml- файлы, БД и прочее) Не конкатенировать строки Использовать строки форматирования  Знаки препинания и разрывы строк держать также в строке форматирования  Писать комментарии для переводчиков Даже для нелокализуемого софта это правила хорошего тона 13/65 Не относится к программным константам
 ASCII – 7-битная кодировка  В нее не помещаются даже все европейские символы (é, ß, ü, ä, ö и др.)  Extended-ASCII – использует 8-й бит  Для группы языков (набора символов) нужна собственная кодировка (codepage). Часто их несколько: для русского – cp866, KOI-8R, Windows-1251  А в китайском – около 3000 общеупотребимых иероглифов, а всего – более 80000 15/65
русской морзянке  Русская морзянка построена на сходстве звуков  Как следствие:  символы кириллицы в таблице расположены не по алфавиту  зато при отсекании старшего бита текст остается читаемым 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
1 114 112 символов, для которых определены уникальные коды. Коды записываются с префиксом U+. Сам набор символов частенько называют Юникодом  Семейство кодировок UTF 19/65
 Появился в стандарте Юникода 16 июня 2014 года  Новые шрифты Windows входят в обновление KB2970228 от 2 сентября 2014 года  Которого у многих пользователей нет  Многие разработчики не парятся  Ну а остальные придумывают способы («тащат» с собой шрифты или используют CSS) 21/65
регистрочувствительность*  Совершенно естественной выглядит возможность вводить, получать, искать информацию без учета регистра букв * Есть языки, где нет регистра символов 23/65
изменение регистра такое же, как в латинском алфавите  Изменение регистра может привести к изменению числа символов  немецкий: ToUpper(“groß”) == “GROSS”  Unicode содержит правила для Case Folding и специальных случаев  Использовать ToUpper() все же чуть безопаснее, чем ToLower() 26/65
на том, какая локаль используется при сравнении строк и case folding’e (в том числе сортировке и поиске), форматировании:  Явно указывайте инвариантную («пустую», «корневую», US English) для внутренних нужд, взаимодействия с другими системами либо используйте специальный формат, например XML’ный (2015-03-26T19:00:12+03:00)  Используйте пользовательскую (можно неявно), когда результат увидит пользователь Промежуточные итоги 29/65
 Строки  Медиа (изображения, звуки, видео)  UI Layout Все это мы будем называть ресурсами локализации  А еще специфическими могут быть алгоритмы. Правда, нечасто  Грамматика языка 36/65
 Алфавит, правила сравнения  Числа  Календарь, дата и время  Валюта  Система мер  Структура почтового адреса, телефонного номера  Формат бумаги по умолчанию  Печатные формы, отчеты  ... 41/65
пользовательского интерфейса  Для форматирования дат, чисел и т. д. и сравнения строк (сортировка, поиск, правила case folding’а)  Для пользовательского ввода (IME) 43/65
всех вариантов языка может быть неоправданно или будет просто дублированием  Пустой текст у пользовательского элемента UI недопустим  Ресурсы для ведущего языка (языка по умолчанию, языка разработки) всегда актуальны и непусты  Локализация часто не успевает за версиями софта, и часто используется предыдущая версия локализации 48/65
регион» существуют в операционных системах в виде локалей  Молдавия (Молдова) говорит по-молдавски (или на молдавском диалекте румынского)  Локалей ro-MD, ro-MD-TRI в Windows нет  А раньше даже были локали ru-MO, ro-MO  Тем не менее, запись на латинице одних и тех же румынских слов различается  Можно программно создавать собственные локали  Пользователи поступают проще, указывая локаль ro-RO 50/65
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
Ближнего Востока. Оплата прокатной машины почасовая, 1 долл/час. Дата и время. Задача 1 марта 2015 в полдень Вася выехал из офиса в Тегеране, в полдень 22 марта подъехал к границе Ирана и Азербайджана в Астаре, а в полдень 29 марта 2015 будет уже в Баку. Сколько заплатит Вася за аренду авто? 52/65
в разных часовых поясах  А еще есть летнее время  В разных странах переход на летнее время (и обратно) происходит в разные дни  В Азербайджане в последнее воскресенье марта  В Иране в третью субботу марта 53/65
дней  В сутках не всегда 24 часа  В часе 60 минут  В минуте не всегда 60 секунд  Один и тот же момент времени может случиться не единожды или не случиться вообще 56/65
часовым поясом/смещением  Календарь/напоминания  Нельзя хранить время со смещением  Не рекомендуется хранить время с часовым поясом  Лучше хранить местоположение  Универсального рецепта нет, все зависит от специфики задачи 57/65
или code-Subcode) с весами  Сервер решает, может ли и хочет ли он предоставить контент на одном из запрошенных языков  Других стандартных средств нет 58/65
Геолокация? Неуниверсально, ненадежно…  Датчики мобильных устройств  Анализ баз IP- и MAC-адресов  JavaScript ► Поэтому приложение должно предоставлять возможность изменить язык и/или регион ► Огромное количество приложений игнорирует локаль пользователя (настройки форматирования), что делает затруднительным, например, копипаст в Excel 59/65
“In addition, flags have nationalistic connotations that may be unwelcome for people of other countries, even though they speak the same language.” 60/65
на искусственном языке  На Simlish (симском) даже есть песни  GitHub  В 2011 году команда отказалась от поддержки многоязычности и сосредоточилась на том, чтобы сделать GitHub быстрым и надежным 63/65