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
Register is more than clipboard
satorunooshie
1
180
data-viz-talk-cz-2025
lcolladotor
0
100
Google Opalで使える37のライブラリ
mickey_kubo
3
180
CSC509 Lecture 08
javiergs
PRO
0
270
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
650
スキーマ駆動で、Zod OpenAPI Honoによる、API開発するために、Hono Takibiというライブラリを作っている
nakita628
0
330
釣り地図SNSにおける有料機能の実装
nokonoko1203
0
200
Designing Repeatable Edits: The Architecture of . in Vim
satorunooshie
0
200
AI時代に必須!状況言語化スキル / ai-context-verbalization
minodriven
2
250
ドメイン駆動設計のエッセンス
masuda220
PRO
15
6.9k
Claude Agent SDK を使ってみよう
hyshu
0
1.4k
SODA - FACT BOOK(JP)
sodainc
1
9k
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
80
6k
Automating Front-end Workflow
addyosmani
1371
200k
Building Applications with DynamoDB
mza
96
6.7k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
680
4 Signs Your Business is Dying
shpigford
186
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
2.9k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
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