Локализация веб-проектов Олег Алистратов
I18N  и  L10N Интернационализация и локализация
Локализация <ul><li>Адаптация интерфейса: </li></ul><ul><li>Тексты, сортировка и сравнение </li></ul><ul><li>Форматы чисел...
Локализация <ul><li>Адаптация содержания и поведения: </li></ul><ul><li>Способ ведения бизнеса (например, бухгалтерский уч...
Интернационализация <ul><li>I18N  —  проектирование и разработка с целью легкой локализации: </li></ul><ul><li>Убираем огр...
Объекты локализации
Мега-сайт <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><li>О компании </li></ul>
Мега-сайт   локализованный <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><li>О компании </li></ul><ul><li>News </...
Мега-сайт  – 2 <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><ul><li>Молотки </li></ul></ul><ul><ul><li>Трубы </l...
Мега-сайт  – 3 <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><ul><li>Молотки </li></ul></ul><ul><ul><li>Трубы </l...
Мега-сайт  –  4 <ul><li>Доставка </li></ul><ul><ul><li>Курьером </li></ul></ul><ul><ul><li>Почтой </li></ul></ul><ul><li>О...
Взболтать, но не смешивать! <ul><li>Язык  ->  Интерфейс </li></ul><ul><li>Регион  ->  Поведение </li></ul>
Определение локали
Accept-Language <ul><li>Accept-Language: uk, ru;q=0.9, en-GB;q=0.8, en;q=0.7 </li></ul><ul><li>Accept-Language: de-DE, de-...
GeoIP <ul><li>Страна  ≠  Язык </li></ul><ul><li>Невероятные приключения итальянцев в России </li></ul>
Доменные имена <ul><li>en.example.com </li></ul><ul><li>ru.example.com </li></ul><ul><li>uk.example.com </li></ul><ul><li>...
Доменные имена -  2 <ul><li>www.example.co.uk </li></ul><ul><li>www.example.ru </li></ul><ul><li>www.example.com.ua </li><...
Доменные имена -  3 <ul><li>www.example.com/en/ </li></ul><ul><li>www.example.com/ru/ </li></ul><ul><li>www.example.com/uk...
Определили – запоминаем <ul><li>Язык </li></ul><ul><li>Регион </li></ul><ul><li>Валюту </li></ul><ul><li>Форматы дат и т.п...
Технологии
Все уже придумано до нас <ul><li>GNU gettext </li></ul><ul><li>POSIX locale </li></ul>
Вокруг  gettext ’ а <ul><li>Файлы ресурсов: </li></ul><ul><li>ru/LC_MESSAGES/animals.mo bird -> птица cat -> кот </li></ul...
Вокруг  gettext ’ а <ul><li>Использование: </li></ul><ul><li>textdomain(&quot;animals&quot;); print(gettext(&quot;bird&quo...
Искусственные ключи <ul><li>Использование: </li></ul><ul><li>print(gettext(&quot;msg_bird _ name&quot;)); </li></ul><ul><l...
Искусственные ключи <ul><li>Не засоряются исходники </li></ul><ul><li>Решается проблема контекста </li></ul><ul><li>Трудно...
Усложняем <ul><li>&quot;logo&quot; = object {   src = &quot;logo.jpg&quot;,   width = &quot;120&quot;,   height = &quot;80...
Точка наложения перевода
Точка наложения перевода
Подготовка исходных текстов
Хороший стиль <ul><li>Баннер: код </li></ul><ul><li>Код баннера для вставки на страницу </li></ul>
Полные фразы <ul><li>printf (   &quot;Файл защищен от %s&quot;,    rw ? &quot;записи&quot; : &quot;чтения&quot; ) </li></u...
Форматированные строки вместо конкатенации <ul><li>&quot; в городе:  &quot;  + &quot;Киев&quot; </li></ul><ul><li>printf(&...
Избегаем специальных символов <ul><li>&quot;Иван &nbsp; Петрович&quot; </li></ul><ul><li>nbsp(&quot; Иван Петрович &quot;)...
Кому специальный, а кому и родной <ul><li>' Кам'янець-Подільський ' </li></ul><ul><li>'Кам  'янець-Подільський' </li></ul>
Верстка
Проверяем длинными фразами О компании Товары Новости About the company Products News À propos de cette société Produits News
Используем  CSS  для заглавных и строчных символов <ul><li><p> Сегодня  п онедельник </p> <p> П онедельник, 20 сентября </...
Атрибуты  lang   и  dir <ul><li>lang=&quot;en&quot; dir=&quot;ltr&quot; </li></ul><ul><li>•   Localization </li></ul><ul><...
Избегаем текстов в графике <ul><li>Рисованные заголовки – зло </li></ul><ul><li>Скриншоты, например, тоже зло </li></ul><u...
Поменьше разметки <ul><li>gettext ( <a href=&quot;http://example.com&quot;> Example </a> ) </li></ul><ul><li><a href= &quo...
Формы множественного числа
Правильная форма <ul><li>Found 42 file(s) </li></ul><ul><li>Found 1 file Found 42 files </li></ul><ul><li>Найден 101 файл ...
Ищем решение <ul><li>printf(&quot; Found  %d file%s&quot;, n,    n == 1 ? &quot;&quot; : &quot;s&quot;); </li></ul><ul><li...
Список форм в файле ресурсов <ul><li>lang=&quot;en&quot; Две формы [0] Found %d file [1] Found %d files </li></ul><ul><li>...
Пример: английский язык <ul><li>function plural_form(int n) {   return n != 1 ? 1 : 0; } </li></ul><ul><li>… а также немец...
Пример: русский язык <ul><li>function plural_form(int n) {   return   n % 10 == 1 &&   n % 100 != 11 ?    0 :   n % 10 >= ...
Пример: китайский язык <ul><li>function plural_form(int n) {   return 0; } </li></ul>
Усложняем задачу <ul><li>Found 10 files in 5 directories </li></ul><ul><li>Found %d %s in %d %s </li></ul><ul><li>Found {N...
Кодировки
Unicode <ul><li>Преимущества  UTF-8: </li></ul><ul><li>Цифры, знаки препинания и латиница отображаются всегда </li></ul><u...
8  бит <ul><li>Несколько языков могут поместиться в одной 8-битной кодировке: английский, русский, украинский  —  Win-1251...
Даты, валюты, единицы измерения
POSIX <ul><li>setlocale(LC_ALL, &quot; uk_UA.UTF-8 &quot;); </li></ul><ul><li>sprintf(), sscanf() </li></ul><ul><li>strfti...
Локаль можно обработать напильником <ul><li>$   LANG=uk_UA date +&quot;%e %B&quot; 10 Квітень </li></ul><ul><li>$   LANG=u...
Строги при выводе, лояльны при вводе <ul><li>out:  printf() 21,00  грн. 21.00   € </li></ul><ul><li>in:  scanf() 21.00 21,...
Номера телефонов <ul><li>(044) 200-10-20 </li></ul><ul><li>+380 44 200-1020 8 (044) 200-10-20 200-10-20 </li></ul>
Локальное время <ul><li>Мы работаем с 9 00  до 18 00 (MSK, UTC+3) </li></ul><ul><li>Ми працюємо з 8 00  до 17 00   (EET, U...
Anno Domini <ul><li>6244 – Древнеегипетский </li></ul><ul><li>5768 – Еврейский </li></ul><ul><li>5208 – Древнеиндийский </...
Единицы измерения <ul><li>Длина: 100 м </li></ul><ul><li>Length:  328.08399  feet </li></ul><ul><li>Length  ≈  328  feet <...
Желаю успеха! Бажаю успіху! Je vous souhaite   du succes ! Le deseo   éxito ! I ch wünsche ihnen Gelingen ! Сизга мен мува...
 
Upcoming SlideShare
Loading in …5
×

L10N

783 views
757 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
783
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

L10N

  1. 1. Локализация веб-проектов Олег Алистратов
  2. 2. I18N и L10N Интернационализация и локализация
  3. 3. Локализация <ul><li>Адаптация интерфейса: </li></ul><ul><li>Тексты, сортировка и сравнение </li></ul><ul><li>Форматы чисел, дат и валют </li></ul><ul><li>Символы и типографика </li></ul><ul><li>Пиктограммы, рисунки и цвета </li></ul><ul><li>Средства ввода (клавиатура) </li></ul>
  4. 4. Локализация <ul><li>Адаптация содержания и поведения: </li></ul><ul><li>Способ ведения бизнеса (например, бухгалтерский учет) </li></ul><ul><li>Культурозависимые объекты и идеи </li></ul><ul><li>Географическое положение </li></ul><ul><li>Юридические требования </li></ul>
  5. 5. Интернационализация <ul><li>I18N — проектирование и разработка с целью легкой локализации: </li></ul><ul><li>Убираем ограничения (например, внедряем Unicode ) </li></ul><ul><li>Проверяем поддержку функций l10n заранее (например, двунаправленный или вертикальный текст) </li></ul><ul><li>Включаем «локаль» (системные функции форматирования) </li></ul><ul><li>Разделяем код и локализуемые ресурсы </li></ul>
  6. 6. Объекты локализации
  7. 7. Мега-сайт <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><li>О компании </li></ul>
  8. 8. Мега-сайт локализованный <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><li>О компании </li></ul><ul><li>News </li></ul><ul><li>Products </li></ul><ul><li>About the company </li></ul>
  9. 9. Мега-сайт – 2 <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><ul><li>Молотки </li></ul></ul><ul><ul><li>Трубы </li></ul></ul><ul><ul><li>Напильники </li></ul></ul><ul><li>О компании </li></ul><ul><li>News </li></ul><ul><li>Products </li></ul><ul><ul><li>Hammers </li></ul></ul><ul><ul><li>Tubing </li></ul></ul><ul><ul><li>Files </li></ul></ul><ul><li>About the company </li></ul>
  10. 10. Мега-сайт – 3 <ul><li>Новости </li></ul><ul><li>Товары </li></ul><ul><ul><li>Молотки </li></ul></ul><ul><ul><li>Трубы </li></ul></ul><ul><ul><ul><li>Труба 20 мм </li></ul></ul></ul><ul><ul><li>Напильники </li></ul></ul><ul><li>О компании </li></ul><ul><li>News </li></ul><ul><li>Products </li></ul><ul><ul><li>Hammers </li></ul></ul><ul><ul><li>Tubing </li></ul></ul><ul><ul><ul><li>Tubing 20 mm </li></ul></ul></ul><ul><ul><ul><li>Tubing 1.5&quot; </li></ul></ul></ul><ul><li>About the company </li></ul>
  11. 11. Мега-сайт – 4 <ul><li>Доставка </li></ul><ul><ul><li>Курьером </li></ul></ul><ul><ul><li>Почтой </li></ul></ul><ul><li>Оплата </li></ul><ul><ul><li>Наличными </li></ul></ul><ul><ul><li>Наложенным платежом </li></ul></ul><ul><li>Delivery </li></ul><ul><ul><li>Priority overnight </li></ul></ul><ul><ul><li>Saturday delivery </li></ul></ul><ul><ul><li>Washington, DC delivery </li></ul></ul><ul><li>Payment info </li></ul><ul><ul><li>Visa </li></ul></ul><ul><ul><li>Mastercard </li></ul></ul><ul><ul><li>C.O.D. </li></ul></ul>
  12. 12. Взболтать, но не смешивать! <ul><li>Язык -> Интерфейс </li></ul><ul><li>Регион -> Поведение </li></ul>
  13. 13. Определение локали
  14. 14. Accept-Language <ul><li>Accept-Language: uk, ru;q=0.9, en-GB;q=0.8, en;q=0.7 </li></ul><ul><li>Accept-Language: de-DE, de-CH, de-AT </li></ul><ul><li>Accept-Language: de </li></ul>
  15. 15. GeoIP <ul><li>Страна ≠ Язык </li></ul><ul><li>Невероятные приключения итальянцев в России </li></ul>
  16. 16. Доменные имена <ul><li>en.example.com </li></ul><ul><li>ru.example.com </li></ul><ul><li>uk.example.com </li></ul><ul><li>ru.user.hosting.com </li></ul>
  17. 17. Доменные имена - 2 <ul><li>www.example.co.uk </li></ul><ul><li>www.example.ru </li></ul><ul><li>www.example.com.ua </li></ul><ul><li>www.example.com </li></ul><ul><li>Multi-domain Authentication (MDA) </li></ul>
  18. 18. Доменные имена - 3 <ul><li>www.example.com/en/ </li></ul><ul><li>www.example.com/ru/ </li></ul><ul><li>www.example.com/uk/ </li></ul>
  19. 19. Определили – запоминаем <ul><li>Язык </li></ul><ul><li>Регион </li></ul><ul><li>Валюту </li></ul><ul><li>Форматы дат и т.п. </li></ul><ul><li>… и разрешаем изменить по вкусу! </li></ul><ul><li>А еще: в узбекском – шрифт, в венгерском – порядок сортировки… </li></ul>
  20. 20. Технологии
  21. 21. Все уже придумано до нас <ul><li>GNU gettext </li></ul><ul><li>POSIX locale </li></ul>
  22. 22. Вокруг gettext ’ а <ul><li>Файлы ресурсов: </li></ul><ul><li>ru/LC_MESSAGES/animals.mo bird -> птица cat -> кот </li></ul><ul><li>uk/LC_MESSAGES/animals.mo bird -> птиця cat -> кіт </li></ul>
  23. 23. Вокруг gettext ’ а <ul><li>Использование: </li></ul><ul><li>textdomain(&quot;animals&quot;); print(gettext(&quot;bird&quot;)); </li></ul><ul><li>print(gettext( &quot;Little bird! O little bird! &quot; &quot;I wonder at what thou doest, &quot; &quot;Thou singing merry far from me, &quot; &quot;I in sadness all alone!&quot; )); </li></ul>
  24. 24. Искусственные ключи <ul><li>Использование: </li></ul><ul><li>print(gettext(&quot;msg_bird _ name&quot;)); </li></ul><ul><li>print(gettext(&quot;msg_bird_poem&quot;)); </li></ul>
  25. 25. Искусственные ключи <ul><li>Не засоряются исходники </li></ul><ul><li>Решается проблема контекста </li></ul><ul><li>Трудно отслеживать изменения </li></ul><ul><li>Без перевода нет осмысленного текста </li></ul>
  26. 26. Усложняем <ul><li>&quot;logo&quot; = object { src = &quot;logo.jpg&quot;, width = &quot;120&quot;, height = &quot;80&quot;, title = &quot;ABC Ltd.&quot; } </li></ul><ul><li>&quot;logo&quot; = object { src = &quot;logo.uk.jpg&quot;, width = &quot;200&quot;, height = &quot;90&quot;, title = &quot; ТОВ « ABC » &quot; } </li></ul>
  27. 27. Точка наложения перевода
  28. 28. Точка наложения перевода
  29. 29. Подготовка исходных текстов
  30. 30. Хороший стиль <ul><li>Баннер: код </li></ul><ul><li>Код баннера для вставки на страницу </li></ul>
  31. 31. Полные фразы <ul><li>printf ( &quot;Файл защищен от %s&quot;, rw ? &quot;записи&quot; : &quot;чтения&quot; ) </li></ul><ul><li>printf ( rw ? &quot;Файл защищен от записи&quot; : &quot;Файл защищен от чтения&quot; ) </li></ul>
  32. 32. Форматированные строки вместо конкатенации <ul><li>&quot; в городе: &quot; + &quot;Киев&quot; </li></ul><ul><li>printf(&quot; в городе : %s&quot;, &quot; Киев &quot;) </li></ul>
  33. 33. Избегаем специальных символов <ul><li>&quot;Иван &nbsp; Петрович&quot; </li></ul><ul><li>nbsp(&quot; Иван Петрович &quot;) </li></ul>
  34. 34. Кому специальный, а кому и родной <ul><li>' Кам'янець-Подільський ' </li></ul><ul><li>'Кам 'янець-Подільський' </li></ul>
  35. 35. Верстка
  36. 36. Проверяем длинными фразами О компании Товары Новости About the company Products News À propos de cette société Produits News
  37. 37. Используем CSS для заглавных и строчных символов <ul><li><p> Сегодня п онедельник </p> <p> П онедельник, 20 сентября </p> </li></ul><ul><li><style> .ucfirst:first-letter {text-transform: uppercase} </style> <p> Сегодня п онедельник< /p > <p class=&quot;ucfirst&quot;> п онедельник, 20 сентября </p> </li></ul>
  38. 38. Атрибуты lang и dir <ul><li>lang=&quot;en&quot; dir=&quot;ltr&quot; </li></ul><ul><li>• Localization </li></ul><ul><li>lang=&quot;ar&quot; dir=&quot;rtl&quot; </li></ul><ul><li>الاقلمه والتدوي • </li></ul>
  39. 39. Избегаем текстов в графике <ul><li>Рисованные заголовки – зло </li></ul><ul><li>Скриншоты, например, тоже зло </li></ul><ul><li>Если очень хочется – можно генерировать программно: <img src=&quot;header.cgi?t=Heading&quot; /> </li></ul>
  40. 40. Поменьше разметки <ul><li>gettext ( <a href=&quot;http://example.com&quot;> Example </a> ) </li></ul><ul><li><a href= &quot; gettext ('http://example.com')&quot;> gettext ('Example') </a> </li></ul>
  41. 41. Формы множественного числа
  42. 42. Правильная форма <ul><li>Found 42 file(s) </li></ul><ul><li>Found 1 file Found 42 files </li></ul><ul><li>Найден 101 файл Найдено 42 файла Найдено 15 файлов </li></ul>
  43. 43. Ищем решение <ul><li>printf(&quot; Found %d file%s&quot;, n, n == 1 ? &quot;&quot; : &quot;s&quot;); </li></ul><ul><li>if (n == 1) printf (&quot; Found %d file&quot;, n); else printf (&quot; Found %d files&quot;, n); </li></ul><ul><li>int idx = plural_form(n); printf(strings[FOUND_MESSAGE][idx], n); </li></ul>
  44. 44. Список форм в файле ресурсов <ul><li>lang=&quot;en&quot; Две формы [0] Found %d file [1] Found %d files </li></ul><ul><li>lang=&quot;ru&quot; Три формы [0] Найден %d файл [1] Найдено %d файла [ 2 ] Найдено %d файлов </li></ul>
  45. 45. Пример: английский язык <ul><li>function plural_form(int n) { return n != 1 ? 1 : 0; } </li></ul><ul><li>… а также немецкий, норвежский, греческий, итальянский, эстонский, эсперанто и многие другие языки </li></ul>
  46. 46. Пример: русский язык <ul><li>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; } </li></ul><ul><li>… а также украинский, белорусский, сербский и хорватский </li></ul>
  47. 47. Пример: китайский язык <ul><li>function plural_form(int n) { return 0; } </li></ul>
  48. 48. Усложняем задачу <ul><li>Found 10 files in 5 directories </li></ul><ul><li>Found %d %s in %d %s </li></ul><ul><li>Found {NUM_FILES} {FORM_FILES} in {NUM_DIRS} {FORM_DIRS} </li></ul>
  49. 49. Кодировки
  50. 50. Unicode <ul><li>Преимущества UTF-8: </li></ul><ul><li>Цифры, знаки препинания и латиница отображаются всегда </li></ul><ul><li>Экономим объем (трафик) </li></ul><ul><li>Нет путаницы с little endian и big endian </li></ul><ul><li>В UTF-16 не всегда два байта (только символы UCS-2 ) </li></ul><ul><li>Поддержка редакторами, БД, XML- процессорами… </li></ul>
  51. 51. 8 бит <ul><li>Несколько языков могут поместиться в одной 8-битной кодировке: английский, русский, украинский — Win-1251 </li></ul><ul><li>А могут и не поместиться: русский и немецкий </li></ul>
  52. 52. Даты, валюты, единицы измерения
  53. 53. POSIX <ul><li>setlocale(LC_ALL, &quot; uk_UA.UTF-8 &quot;); </li></ul><ul><li>sprintf(), sscanf() </li></ul><ul><li>strftime(), strptime() </li></ul><ul><li>strfmon() </li></ul>
  54. 54. Локаль можно обработать напильником <ul><li>$ LANG=uk_UA date +&quot;%e %B&quot; 10 Квітень </li></ul><ul><li>$ LANG=uk_UA date +&quot;%e %B&quot; 10 квітня </li></ul>
  55. 55. Строги при выводе, лояльны при вводе <ul><li>out: printf() 21,00 грн. 21.00 € </li></ul><ul><li>in: scanf() 21.00 21,00 21-00 </li></ul>
  56. 56. Номера телефонов <ul><li>(044) 200-10-20 </li></ul><ul><li>+380 44 200-1020 8 (044) 200-10-20 200-10-20 </li></ul>
  57. 57. Локальное время <ul><li>Мы работаем с 9 00 до 18 00 (MSK, UTC+3) </li></ul><ul><li>Ми працюємо з 8 00 до 17 00 (EET, UTC+2) </li></ul>
  58. 58. Anno Domini <ul><li>6244 – Древнеегипетский </li></ul><ul><li>5768 – Еврейский </li></ul><ul><li>5208 – Древнеиндийский </li></ul><ul><li>5127 – Календарь Майя </li></ul><ul><li>4706 – Китайский </li></ul><ul><li>2761 – Древнеримский </li></ul><ul><li>2757 – Вавилонский </li></ul><ul><li>2552 – Буддистский </li></ul><ul><li>2008 – Григорианский </li></ul><ul><li>1429 – Мусульманский </li></ul><ul><li>1387 – Персидский </li></ul><ul><li>216 – Календарь Французской революции </li></ul><ul><li>164 – Бахаи </li></ul>
  59. 59. Единицы измерения <ul><li>Длина: 100 м </li></ul><ul><li>Length: 328.08399 feet </li></ul><ul><li>Length ≈ 328 feet </li></ul>
  60. 60. Желаю успеха! Бажаю успіху! Je vous souhaite du succes ! Le deseo éxito ! I ch wünsche ihnen Gelingen ! Сизга мен мувафакият тилайман!

×