Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Локализация приложения на базе 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
250
Ruby, Rails and a secret ingredient
soulim
1
350
Other Decks in Programming
See All in Programming
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.8k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
540
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
150
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
130
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
190
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
290
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
0
180
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
250
React本体のコードリーディング
high_g_engineer
1
150
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
200
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
220
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
350
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
480
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
410
Become a Pro
speakerdeck
PRO
31
6.2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
エンジニアに許された特別な時間の終わり
watany
108
250k
The Invisible Side of Design
smashingmag
301
52k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
490
The browser strikes back
jonoalderson
0
1.5k
Everyday Curiosity
cassininazir
0
290
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
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