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
2.2k
Локализация приложения на базе Rails. Личный опыт и советы
Опыт локализации HeiaHeia.com, обзор полезных сервисов и советы.
Специально для DevConf 2012
Alex Sulim
June 09, 2012
Tweet
Share
More Decks by Alex Sulim
See All by Alex Sulim
Code hierarchy of needs
soulim
1
240
Ruby, Rails and a secret ingredient
soulim
1
340
Other Decks in Programming
See All in Programming
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
140
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
240
ruby.wasmで多人数リアルタイム通信ゲームを作ろう
lnit
2
280
C++20 射影変換
faithandbrave
0
540
Benchmark
sysong
0
270
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
330
Is Xcode slowly dying out in 2025?
uetyo
1
200
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
1
120
LINEヤフー データグループ紹介
lycorp_recruit_jp
0
920
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
130
来たるべき 8.0 に備えて React 19 新機能と React Router 固有機能の取捨選択とすり合わせを考える
oukayuka
2
860
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
230
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
94
14k
The Language of Interfaces
destraynor
158
25k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Balancing Empowerment & Direction
lara
1
370
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
700
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
The Invisible Side of Design
smashingmag
300
51k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
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