l10n

61
1 Локализация веб-проектов Олег Алистратов

Upload: oleg-alistratov

Post on 24-May-2015

677 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: L10N

1

Локализациявеб-проектов

Олег Алистратов

Page 2: L10N

2

I18N и L10N

Интернационализация и локализация

Page 3: L10N

3

Локализация

Адаптация интерфейса:

• Тексты, сортировка и сравнение

• Форматы чисел, дат и валют

• Символы и типографика

• Пиктограммы, рисунки и цвета

• Средства ввода (клавиатура)

Page 4: L10N

4

Локализация

Адаптация содержания и поведения:

• Способ ведения бизнеса(например, бухгалтерский учет)

• Культурозависимые объекты и идеи

• Географическое положение

• Юридические требования

Page 5: L10N

5

Интернационализация

I18N — проектирование и разработка с целью легкой локализации:

• Убираем ограничения(например, внедряем Unicode)

• Проверяем поддержку функций l10n заранее(например, двунаправленный или вертикальный текст)

• Включаем «локаль»(системные функции форматирования)

• Разделяем код и локализуемые ресурсы

Page 6: L10N

6

Объекты локализации

Page 7: L10N

7

Мега-сайт

• Новости

• Товары

• О компании

Page 8: L10N

8

Мега-сайт локализованный

• Новости

• Товары

• О компании

• News

• Products

• About the company

Page 9: L10N

9

Мега-сайт – 2

• Новости

• Товары

– Молотки

– Трубы

– Напильники

• О компании

• News

• Products

– Hammers

– Tubing

– Files

• About the company

Page 10: L10N

10

Мега-сайт – 3

• Новости

• Товары

– Молотки

– Трубы• Труба 20 мм

– Напильники

• О компании

• News

• Products

– Hammers

– Tubing• Tubing 20 mm• Tubing 1.5"

• About the company

Page 11: L10N

11

Мега-сайт – 4

• Доставка

– Курьером

– Почтой

• Оплата

– Наличными

– Наложенным платежом

• Delivery

– Priority overnight

– Saturday delivery

– Washington, DC delivery

• Payment info

– Visa

– Mastercard

– C.O.D.

Page 12: L10N

12

Взболтать, но не смешивать!

• Язык → Интерфейс

• Регион → Поведение

Page 13: L10N

13

Определение локали

Page 14: L10N

14

Accept-Language

• Accept-Language:uk, ru;q=0.9, en-GB;q=0.8, en;q=0.7

• Accept-Language:de-DE, de-CH, de-AT

• Accept-Language: de

Page 15: L10N

15

GeoIP

• Страна ≠ Язык

• Невероятные приключения итальянцев в России

Page 16: L10N

16

Доменные имена

• en.example.com

• ru.example.com

• uk.example.com

• ru.user.hosting.com

Page 17: L10N

17

Доменные имена - 2

• www.example.co.uk

• www.example.ru

• www.example.com.ua

• www.example.com

• Multi-domain Authentication (MDA)

Page 18: L10N

18

Доменные имена - 3

• www.example.com/en/

• www.example.com/ru/

• www.example.com/uk/

Page 19: L10N

19

Определили – запоминаем

• Язык

• Регион

• Валюту

• Форматы дат и т.п.

…и разрешаем изменить по вкусу!

А еще: в узбекском – шрифт, в венгерском – порядок сортировки…

Page 20: L10N

20

Технологии

Page 21: L10N

21

Все уже придумано до нас

• GNU gettext

• POSIX locale

Page 22: L10N

22

Вокруг gettext’а

Файлы ресурсов:

• ru/LC_MESSAGES/animals.mobird → птицаcat → кот

• uk/LC_MESSAGES/animals.mo bird → птицяcat → кіт

Page 23: L10N

23

Вокруг gettext’а

Использование:

• textdomain("animals");print(gettext("bird"));

• print(gettext("Little bird! O little bird!\n""I wonder at what thou doest,\n""Thou singing merry far from me,\n""I in sadness all alone!"));

Page 24: L10N

24

Искусственные ключи

Использование:

• print(gettext("msg_bird_name"));

• print(gettext("msg_bird_poem"));

Page 25: L10N

25

Искусственные ключи

• Не засоряются исходники

• Решается проблема контекста

• Трудно отслеживать изменения

• Без перевода нет осмысленного текста

Page 26: L10N

26

Усложняем

• "logo" = object { src = "logo.jpg", width = "120", height = "80", title = "ABC Ltd."}

• "logo" = object { src = "logo.uk.jpg", width = "200", height = "90", title = "ТОВ «ABC»"}

Page 27: L10N

27

Точка наложения перевода

Page 28: L10N

28

Точка наложения перевода

Page 29: L10N

29

Подготовка исходных текстов

Page 30: L10N

30

Хороший стиль

• Баннер: код

• Код баннера для вставки на страницу

Page 31: L10N

31

Полные фразы

• printf ( "Файл защищен от %s", rw ? "записи" : "чтения")

• printf ( rw ? "Файл защищен от записи" : "Файл защищен от чтения")

Page 32: L10N

32

Форматированные строкивместо конкатенации

• "в городе: " + "Киев"

• printf("в городе: %s", "Киев")

Page 33: L10N

33

Избегаем специальных символов

• "Иван Петрович"

• nbsp("Иван Петрович")

Page 34: L10N

34

Кому специальный, а кому и родной

• 'Кам'янець-Подільський'

• 'Кам\'янець-Подільський'

Page 35: L10N

35

Верстка

Page 36: L10N

36

Проверяем длинными фразами

Новости Товары О компании

News Products About the company

News ProduitsÀ propos

de cette société

Page 37: L10N

37

Используем CSS для заглавныхи строчных символов

• <p>Сегодня понедельник</p><p>Понедельник, 20 сентября</p>

• <style>.ucfirst:first-letter {text-transform: uppercase}</style>

<p>Сегодня понедельник</p><p class="ucfirst">понедельник,20 сентября</p>

Page 38: L10N

38

Атрибуты lang и dir

lang="en" dir="ltr"

• Localization

lang="ar" dir="rtl"

والتدوي • االقلمه

Page 39: L10N

39

Избегаем текстов в графике

• Рисованные заголовки – зло

• Скриншоты, например, тоже зло

• Если очень хочется – можно генерировать программно:<img src="header.cgi?t=Heading" />

Page 40: L10N

40

Поменьше разметки

• gettext(<a href="http://example.com">Example</a>)

• <a href="gettext('http://example.com')">gettext('Example')</a>

Page 41: L10N

41

Формымножественного числа

Page 42: L10N

42

Правильная форма

• Found 42 file(s)

• Found 1 fileFound 42 files

• Найден 101 файлНайдено 42 файлаНайдено 15 файлов

Page 43: L10N

43

Ищем решение

• printf("Found %d file%s", n, n == 1 ? "" : "s");

• if (n == 1) printf ("Found %d file", n);else printf ("Found %d files", n);

• int idx = plural_form(n);printf(strings[FOUND_MESSAGE][idx], n);

Page 44: L10N

44

Список форм в файле ресурсов

• lang="en"Две формы

[0] Found %d file[1] Found %d files

• lang="ru"Три формы

[0] Найден %d файл[1] Найдено %d файла[2] Найдено %d файлов

Page 45: L10N

45

Пример: английский язык

• function plural_form(int n) { return n != 1 ? 1 : 0;}

• …а также немецкий, норвежский, греческий, итальянский, эстонский, эсперанто и многие другие языки

Page 46: L10N

46

Пример: русский язык

• function plural_form(int n) { return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;}

• …а также украинский, белорусский, сербский и хорватский

Page 47: L10N

47

Пример: китайский язык

• function plural_form(int n) { return 0;}

Page 48: L10N

48

Усложняем задачу

• Found 10 files in 5 directories

• Found %d %s in %d %s

• Found {NUM_FILES} {FORM_FILES} in {NUM_DIRS} {FORM_DIRS}

Page 49: L10N

49

Кодировки

Page 50: L10N

50

Unicode

Преимущества UTF-8:

• Цифры, знаки препинания и латиница отображаются всегда

• Экономим объем (трафик)

• Нет путаницы с little endian и big endian

• В UTF-16 не всегда два байта (только символы UCS-2)

• Поддержка редакторами, БД,XML-процессорами…

Page 51: L10N

51

8 бит

• Несколько языков могут поместиться в одной 8-битной кодировке:английский, русский, украинский — Win-1251

• А могут и не поместиться:русский и немецкий

Page 52: L10N

52

Даты, валюты,единицы измерения

Page 53: L10N

53

POSIX

• setlocale(LC_ALL, "uk_UA.UTF-8");

• sprintf(), sscanf()

• strftime(), strptime()

• strfmon()

Page 54: L10N

54

Локаль можно обработать напильником

• $ LANG=uk_UA date +"%e %B"10 Квітень

• $ LANG=uk_UA date +"%e %B"10 квітня

Page 55: L10N

55

Строги при выводе,лояльны при вводе

• out: printf()21,00 грн.21.00 €

• in: scanf()21.0021,0021-00

Page 56: L10N

56

Номера телефонов

• (044) 200-10-20

• +380 44 200-10208 (044) 200-10-20200-10-20

Page 57: L10N

57

Локальное время

• Мы работаем с 900 до 1800

(MSK, UTC+3)

• Ми працюємо з 800 до 1700

(EET, UTC+2)

Page 58: L10N

58

Anno Domini

• 6244 – Древнеегипетский

• 5768 – Еврейский

• 5208 – Древнеиндийский

• 5127 – Календарь Майя

• 4706 – Китайский

• 2761 – Древнеримский

• 2757 – Вавилонский

• 2552 – Буддистский

• 2008 – Григорианский

• 1429 – Мусульманский

• 1387 – Персидский

• 216 – Календарь Французской революции

• 164 – Бахаи

Page 59: L10N

59

Единицы измерения

• Длина: 100 м

• Length: 328.08399 feet

• Length ≈ 328 feet

Page 60: L10N

60

Желаю успеха!Бажаю успіху!

Je vous souhaite du succes!Le deseo éxito!

Ich wünsche ihnen Gelingen!Сизга мен мувафакият тилайман!

Page 61: L10N

61