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
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
380
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
1
1.2k
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
3.1k
App Intentsのビルドプロセスを支える技術
kntkymt
0
490
Webの地図
yosuke_furukawa
PRO
6
5k
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
320
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
200
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
290
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.9k
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
WCS-LA-2024
lcolladotor
0
840
How to make the Groovebox
asonas
2
2.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
540
Docker and Python
trallard
47
4.2k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
Paper Plane
katiecoart
PRO
4
53k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
750
From π to Pie charts
rasagy
1
380
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