Igor Suvorov
Программист-предприниматель
17 Sep 2017
Профессия
Node.js & React.js developer
продвинутый курс
Наследование и модульная архитектура
Internationalization (i18n)
Localization (l10n)
Globalization (g11n)
Localizability (l12y)
MVC - внутри отображений, где
V - это текст шаблона
C - это место, где вызывается шаблон
M - функция интерполяции
Вывод:
Онлайн 26 пользователей
Шаблоны:
{
'online_1': 'Онлайн {{count}} пользователь',
'online_2': 'Онлайн {{count}} пользователя',
'online_3': 'Онлайн {{count}} пользователей'
}
render():
<div>
{t('online', { count: users.length })}
</div>
Своими руками
function t(key) {
const maps = {
'users': 'пользователи',
'slides': 'слайды',
}
return maps[key] || key;
}
Инфрастуктура для переводов
Приоритеты локалей
Сложности
Переводы должны работать
Реализация на сервере
{
console.log(this.t('errors.lowMemory'));
}
{
this.tbot.notify(ctx.t('errors.lowMemory'));
}
Реализация в роутерах
async (req) {
return {
...,
message: req.t('hello.world'),
}
}
async (req) {
throw req.t('errors.lowMemory');
}
Реализация в uapp
getLocale
Реализация в uapp
@inject('t')
@importcss(require('./AuthPage.css'))
export class SocialButton extends Component {
render() {
const { name, t } = this.props;
const value = buttons[name];
return (
<Button {...this.props} styleName="button" block>
<span styleName="icon" style={{ color: value.color }}>{value.icon}</span>
<span styleName="title">{t('auth.signInWith', { name: value.title })}</span>
</Button>
);
}
}
Советы
1. Прокидывайте сложные объекты, вложенность решайте в интерполяции
<div>
{t('welcome', { name: user.name, company: user.profile.company, phone: user.profile.contacts.phone })}
vs
{t('welcome', { user })}
</div>
Советы
2. Дублируйте переводы все в экселе
<div>
{t('page1.welcome', { user })}
{t('page2.welcome', { user })}
</div>
3. лучше сразу прокинуть переводы и потом перевести
Скоро в lsk-example2
паттерн для шаблонизации
или как программитам живется на Кипре
any questions?
программист-предприниматель
By Igor Suvorov