Slide 1

Slide 1 text

ЛОКАЛИЗАЦИЯ ПРИЛОЖЕНИЯ НА БАЗЕ RAILS ЛИЧНЫЙ ОПЫТ И СОВЕТЫ

Slide 2

Slide 2 text

Александр Сулим @soulim

Slide 3

Slide 3 text

www.heiaheia.com

Slide 4

Slide 4 text

9 языков {английский финский шведский русский немецкий испанский итальянский хорватский словенский www.heiaheia.com

Slide 5

Slide 5 text

интернационализация i18n internationalization

Slide 6

Slide 6 text

локализация l10n localization

Slide 7

Slide 7 text

Rails 3 + I18n www.heiaheia.com

Slide 8

Slide 8 text

9 языков {английский финский шведский русский немецкий испанский итальянский хорватский словенский www.heiaheia.com

Slide 9

Slide 9 text

3 000 ключей 1 400 файлов 12 человек 9 языков { www.heiaheia.com

Slide 10

Slide 10 text

.yml .yml .yml

Slide 11

Slide 11 text

# config/locales/layouts.ru.yml ru: layouts: application: greeting: “#Привет!” # Помечаем изменения

Slide 12

Slide 12 text

# Находим новые/измененные строчки $ grep -r '#' config/locales # config/locales/layouts.ru.yml ru: layouts: application: greeting: “#Привет!”

Slide 13

Slide 13 text

.yml .yml + + .yml .yml .yml

Slide 14

Slide 14 text

.yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .ym .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml

Slide 15

Slide 15 text

.yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .ym .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml

Slide 16

Slide 16 text

.yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .ym .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .y .yml .yml .yml .yml .yml .yml

Slide 17

Slide 17 text

.yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .ym .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .y .yml .yml .yml .yml .yml .yml Сложности с добавлением новых языков

Slide 18

Slide 18 text

.yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .ym .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .y .yml .yml .yml .yml .yml .yml YAML неудобен для переводчиков

Slide 19

Slide 19 text

.yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .ym .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .yml .y .yml .yml .yml .yml .yml .yml Сложности синхронизации

Slide 20

Slide 20 text

github.com/soulim/threepio

Slide 21

Slide 21 text

webtranslateit.com

Slide 22

Slide 22 text

Автоматизировано добавление нового языка 1

Slide 23

Slide 23 text

webtranslateit.com Упростился поиск ключей и переводов 2

Slide 24

Slide 24 text

Нет необходимости в синхронизации 3

Slide 25

Slide 25 text

Не нужно работать с YAML 4

Slide 26

Slide 26 text

.yml .yml .yml

Slide 27

Slide 27 text

www.localeapp.com

Slide 28

Slide 28 text

copycopter.com

Slide 29

Slide 29 text

github.com/copycopter Теперь с открытым кодом

Slide 30

Slide 30 text

СОВЕТЫ

Slide 31

Slide 31 text

Советы # config/locales/users.ru.yml ru: users: new: title: “Новый пользователь” Имя ключа

Slide 32

Slide 32 text

Советы # app/views/users/new.html.erb ... <%= t ‘users.new.title’ %> ... Имя ключа

Slide 33

Slide 33 text

“lazy” lookup Имя ключа Советы # config/locales/users.ru.yml ru: users: new: title: “Новый пользователь” # app/views/users/new.html.erb ... <%= t ‘.title’ %> ...

Slide 34

Slide 34 text

# config/locales/layouts.ru.yml ru: layouts: application: greeting_html: | ... О компании ... HTML внутри переводов Советы

Slide 35

Slide 35 text

# app/views/layouts/application.html.erb ... <%= t ‘.greeting_html’ %> ... HTML внутри переводов Советы

Slide 36

Slide 36 text

HTML внутри переводов # config/locales/layouts.ru.yml ru: layouts: application: greeting: html: | ... %{link} ... link: “О компании” HTML внутри переводов Советы

Slide 37

Slide 37 text

HTML внутри переводов # app/views/layouts/application.html.erb ... <%= t ‘.greeting.html’, link: link_to(t(‘.greeting.link’), about_url) %> HTML внутри переводов Советы

Slide 38

Slide 38 text

Используйте Accept-Language для определения локализации Советы

Slide 39

Slide 39 text

Учитывайте разницу в длине строки на разных языках Английский Словенский Советы

Slide 40

Slide 40 text

Помните о локализации скриптов на JavaScript Советы # app/views/articles/index.html.erb ... $("#content").pullToRefresh({ "i18n": { "pull_to_refresh": "<%= t ".pull_to_refresh" %>", "release_to_refresh": "<%= t ".release_to_refresh" %>" }, success: function() { // ... } }); ...

Slide 41

Slide 41 text

Unicode Common Locale Data Repository http://cldr.unicode.org/ Советы

Slide 42

Slide 42 text

СПАСИБО!

Slide 43

Slide 43 text

ВОПРОСЫ? @soulim