Вход

Просмотр полной версии : Как соединить многоязычность с плюрализацией


Shitbox2
09.11.2013, 13:33
Нашел несколько модулей (раз (https://github.com/zeflasher/angularjs-i18n), два (https://github.com/4vanger/angular-l10n), три (http://pascalprecht.github.io/angular-translate/)), но там эта проблема не решена.

Мне видится такая подстановка параметров (для фразы «15 апреля 2013 г. Петя купил 1 грушу и 2 яблока»):

В шаблоне:
{{ 'SmthBuyPearsAndApples' | i18n:'15-04-2013':'Петя':0:1:2}}
В файле перевода:
'SmthBuyPearsAndApples': '{1,date:fullDate} {2} {3|купил|купила|купили} {4} {4|груш|грушу|груши|груши} и {5} {5|яблок|яблоко|яблока|яблок }'
Посоветуйте модуль, решающий эту задачу

nerv_
09.11.2013, 23:55
Как соединить многоязычность с плюрализацией
ровно таким же вопросом задавался неделю-полторы назад :) Прям "назад в будущее" :D

Я видел такую штуку (https://github.com/PascalPrecht/angular-translate), но не вникал.

Shitbox2
10.11.2013, 15:12
Видел. Там всё не то. Написал такой фильтр:

.value('Strings', {
SmthBuyPearsAndApples: '{1,date:fullDate} {2} {3|купил|купила|купили} {4|* груш|* грушу|* груши|* груши} и {5|* яблок|* яблоко|* яблока|дофига яблок}'
})

.filter('i18n', ['$filter', '$locale', 'Strings', function ($filter, $locale, Strings) {
return function (data) {
var args = arguments;
var strTpl = typeof Strings[data] === 'string' ? Strings[data] : '...';

try {
return strTpl.replace(/\{([^{}]+)\}/g, function (key, phrase) {

var parts = /(^\d)\s?([,|]?)(.*?)$/.exec(phrase);
var value = args[parseInt(parts[1])];

if (value === undefined) {
return '';
}
if (parts[2] === ',') {
//Фильтры валют/даты/времени и проч.
try {
var opts = parts[3].split(':');
return $filter(opts[0])(value, opts[1])
} catch (e) {
return value;
}
} else if (parts[2] === '|') {
//Плюрализация
try {
var plurals = parts[3].split('|');
var whens = {
0: plurals[0],
one: plurals[1],
other: plurals[plurals.length-1]
}
if (plurals[3] !== undefined) {
whens.few = plurals[2];
whens.many = plurals[3];

} else if (plurals[2] !== undefined) {
whens.many = plurals[2];
}
return whens[(value in whens) ? 0 : $locale.pluralCat(value)].replace('*', value);
} catch (e) {
return '..';
}
} else {
return value;
}
});
} catch (e) {
return '....';
}
}
}])
На выходе выдает: понедельник, 15 апреля 2013 г. Петя купил 1 грушу и дофига яблок

Думаю, для большинства задач за глаза и за уши. Хотя, по-хорошему, строки должны парситься прекомпилятором в шаблоны для разных языков, а в шаблонах уже должны быть свои фильтры и директивы плюрализации.

Осталось подумать как подключать скрипт с переводами при смене локали, и, вообще, как менять локаль.

nerv_
18.11.2013, 12:23
случайно наткнулся на твоем сайте (уже читал это, но полез за ссылкой и вот оно):

Все локализуемые компоненты Angular зависят от языковых правил, предоставляемых сервисом $locale.
http://angular.ru/guide/i18n

Сервис $locale устанавливает правила локализации для различных компонентов Angular. На сегодняшний день имеет только публичное api:

id – {string} – идентификатор локали в виде IdЯзыка-IdСтраны (напр:, en-us)
http://angular.ru/api/ng.$locale
не проверял, но делаю вывод, что можно поменять id в сервисе и изменится язык (глобально)

Shitbox2
19.11.2013, 00:08
... жду, когда в ui-router допилят $state.reload(), чтобы проверить))