Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Локализация приложения на базе Rails. Личный оп...
Search
Alex Sulim
June 09, 2012
Programming
2.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Локализация приложения на базе Rails. Личный опыт и советы
Опыт локализации HeiaHeia.com, обзор полезных сервисов и советы.
Специально для DevConf 2012
Alex Sulim
June 09, 2012
More Decks by Alex Sulim
See All by Alex Sulim
Code hierarchy of needs
soulim
1
260
Ruby, Rails and a secret ingredient
soulim
1
350
Other Decks in Programming
See All in Programming
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
320
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
480
Jetpack Compose メカニズム
skydoves
0
440
SREの越境 / SRE Collaboration
y0hgi
2
220
Building an Out-of-Order CPU
latte72
1
780
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.4k
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
210
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
170
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
120
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Code Review Best Practice
trishagee
74
20k
Docker and Python
trallard
47
4.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
RailsConf 2023
tenderlove
30
1.5k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Why Our Code Smells
bkeepers
PRO
340
58k
Optimizing for Happiness
mojombo
378
71k
Transcript
ЛОКАЛИЗАЦИЯ ПРИЛОЖЕНИЯ НА БАЗЕ RAILS ЛИЧНЫЙ ОПЫТ И СОВЕТЫ
Александр Сулим @soulim
www.heiaheia.com
9 языков {английский финский шведский русский немецкий испанский итальянский хорватский
словенский www.heiaheia.com
интернационализация i18n internationalization
локализация l10n localization
Rails 3 + I18n www.heiaheia.com
9 языков {английский финский шведский русский немецкий испанский итальянский хорватский
словенский www.heiaheia.com
3 000 ключей 1 400 файлов 12 человек 9 языков
{ www.heiaheia.com
.yml .yml .yml
# config/locales/layouts.ru.yml ru: layouts: application: greeting: “#Привет!” # Помечаем изменения
# Находим новые/измененные строчки $ grep -r '#' config/locales #
config/locales/layouts.ru.yml ru: layouts: application: greeting: “#Привет!”
.yml .yml + + .yml .yml .yml
.yml .yml .yml .yml .yml .yml .yml .yml .yml .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 .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 .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
.yml .yml .yml .yml .yml .yml .yml .yml .yml .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 Сложности с добавлением новых языков
.yml .yml .yml .yml .yml .yml .yml .yml .yml .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 неудобен для переводчиков
.yml .yml .yml .yml .yml .yml .yml .yml .yml .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 Сложности синхронизации
github.com/soulim/threepio
webtranslateit.com
Автоматизировано добавление нового языка 1
webtranslateit.com Упростился поиск ключей и переводов 2
Нет необходимости в синхронизации 3
Не нужно работать с YAML 4
.yml .yml .yml
www.localeapp.com
copycopter.com
github.com/copycopter Теперь с открытым кодом
СОВЕТЫ
Советы # config/locales/users.ru.yml ru: users: new: title: “Новый пользователь” Имя
ключа
Советы # app/views/users/new.html.erb ... <%= t ‘users.new.title’ %> ... Имя
ключа
“lazy” lookup Имя ключа Советы # config/locales/users.ru.yml ru: users: new:
title: “Новый пользователь” # app/views/users/new.html.erb ... <%= t ‘.title’ %> ...
# config/locales/layouts.ru.yml ru: layouts: application: greeting_html: | ... <a href=”/about”>О
компании<a> ... HTML внутри переводов Советы
# app/views/layouts/application.html.erb ... <%= t ‘.greeting_html’ %> ... HTML внутри
переводов Советы
HTML внутри переводов # config/locales/layouts.ru.yml ru: layouts: application: greeting: html:
| ... %{link} ... link: “О компании” HTML внутри переводов Советы
HTML внутри переводов # app/views/layouts/application.html.erb ... <%= t ‘.greeting.html’, link:
link_to(t(‘.greeting.link’), about_url) %> HTML внутри переводов Советы
Используйте Accept-Language для определения локализации Советы
Учитывайте разницу в длине строки на разных языках Английский Словенский
Советы
Помните о локализации скриптов на 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() { // ... } }); ...
Unicode Common Locale Data Repository http://cldr.unicode.org/ Советы
СПАСИБО!
ВОПРОСЫ? @soulim