Как соединить многоязычность с плюрализацией
Нашел несколько модулей (раз, два, три), но там эта проблема не решена.
Мне видится такая подстановка параметров (для фразы «15 апреля 2013 г. Петя купил 1 грушу и 2 яблока»): В шаблоне: {{ 'SmthBuyPearsAndApples' | i18n:'15-04-2013':'Петя':0:1:2}} В файле перевода: 'SmthBuyPearsAndApples': '{1,date:fullDate} {2} {3|купил|купила|купили} {4} {4|груш|грушу|груши|груши} и {5} {5|яблок|яблоко|яблока|яблок}' Посоветуйте модуль, решающий эту задачу |
Цитата:
Я видел такую штуку, но не вникал. |
Видел. Там всё не то. Написал такой фильтр:
.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 грушу и дофига яблок Думаю, для большинства задач за глаза и за уши. Хотя, по-хорошему, строки должны парситься прекомпилятором в шаблоны для разных языков, а в шаблонах уже должны быть свои фильтры и директивы плюрализации. Осталось подумать как подключать скрипт с переводами при смене локали, и, вообще, как менять локаль. |
случайно наткнулся на твоем сайте (уже читал это, но полез за ссылкой и вот оно):
Цитата:
Цитата:
не проверял, но делаю вывод, что можно поменять id в сервисе и изменится язык (глобально) |
... жду, когда в ui-router допилят $state.reload(), чтобы проверить))
|
Часовой пояс GMT +3, время: 13:44. |