Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.11.2013, 13:33
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Как соединить многоязычность с плюрализацией
Нашел несколько модулей (раз, два, три), но там эта проблема не решена.

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

В шаблоне:
{{ 'SmthBuyPearsAndApples' | i18n:'15-04-2013':'Петя':0:1:2}}

В файле перевода:
'SmthBuyPearsAndApples': '{1,date:fullDate} {2} {3|купил|купила|купили} {4} {4|груш|грушу|груши|груши} и {5} {5|яблок|яблоко|яблока|яблок}'

Посоветуйте модуль, решающий эту задачу

Последний раз редактировалось Shitbox2, 09.11.2013 в 15:05.
Ответить с цитированием
  #2 (permalink)  
Старый 09.11.2013, 23:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Shitbox2
Как соединить многоязычность с плюрализацией
ровно таким же вопросом задавался неделю-полторы назад Прям "назад в будущее"

Я видел такую штуку, но не вникал.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 10.11.2013, 15:12
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Видел. Там всё не то. Написал такой фильтр:
.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 грушу и дофига яблок

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

Осталось подумать как подключать скрипт с переводами при смене локали, и, вообще, как менять локаль.
Ответить с цитированием
  #4 (permalink)  
Старый 18.11.2013, 12:23
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

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

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

id – {string} – идентификатор локали в виде IdЯзыка-IdСтраны (напр:, en-us)
http://angular.ru/api/ng.$locale
не проверял, но делаю вывод, что можно поменять id в сервисе и изменится язык (глобально)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 19.11.2013, 00:08
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

... жду, когда в ui-router допилят $state.reload(), чтобы проверить))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как включить синхронное выполнение строк? SkaN Элементы интерфейса 1 26.04.2012 22:28
Как писать код который легко поддерживать, расширять, читать. Policeman Общие вопросы Javascript 3 24.03.2012 05:40
Как при быстром многократном клике по кнопке обрабатывать только первый клик battrack jQuery 3 22.03.2012 10:47
Как отловить обратное событие "click" ? jsuse Общие вопросы Javascript 2 18.01.2012 00:16
Как сделать электронный каталог продукции? natarius Серверные языки и технологии 6 24.05.2009 20:56