Каким образом организовать локализацию Backbone.js-приложения?

В данном случае локализацию и интернационализацию можно считать синонимами

Пока что решил для себя хранить настройки локали в отдельной Backbone модели и передавать её каждому представлению.
Может подскажете более интересное и элегантное решение.

// набор параметров локали/интернационализации
var i18n = {
    en : {
        language : 'English',
        greeting : 'Hello'
    },
    ru : {
        language : 'Русский',
        greeting : 'Привет'
    }
};

// В самой модели локали ничего особенного
var LocaleModel = Backbone.Model.extend();

// Некая модель (для примера не имеет значения)
var MyAppModel = Backbone.Model.extend();

// Вьюха приложения, использующая данные локали
var MyAppView = Backbone.View.extend({

    initialize: function(options)
    {
        this.i18n = options.i18n;
        this.i18n.bind('change', this.onLocaleChange, this);
    },

    setLocale: function(locale)
    {
        this.i18n.set(i18n[locale]);
    },

    onLocaleChange: function()
    {
        console.log('locale has been changed to: ' + language);
    }
});

var locale = new LocaleModel(i18n.en);
var app = new MyAppView ({
    model : new MyAppModel({username:'John Doe'}),
    i18n  : locale 
});


// Совсем другая вьюха, но она так же использует текущую локаль
// Смена локали в любом месте затрагивает все подвязанные представления
var OtherAppView = Backbone.View.extend({
    ...
});

var otherApp = new OtherAppView({
    model : new OtherModel(),
    i18n  : locale 
});

пример смены локали
app.setLocale('ru');

в контексте MyAppView можно обратиться к настройкам локали таким образом
this.i18n.get('language');


Посмотреть простенький пример использования

UPD:
Локаль является глобальным объектом и передаётся разным представлениям.
// Мы можем сменить локаль и на это событие отреагируют все подписанные представления.
locale.set(i18n.ru);
  • Вопрос задан
  • 5224 просмотра
Пригласить эксперта
Ответы на вопрос 6
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Мне кажется, что локаль относится сугубо к представлению. Соответственно, место ей в шаблонах.

Лучше вообще не использовать для этого модели, т.к. Backbone.Events можно «вмешать» в любой объект.
Ответ написан
kuzemchik
@kuzemchik
Я приложение структурирую с помощью require.js, для него есть модуль с примерами requirejs.org/docs/api.html#i18n
Изменение локали — это глобальное событие (если только у вас не интерфейс словаря или чего-то где есть несколько частей на разных языках). Я бы и оставил его глобальным, а не таскал за собой модель. Кроме того тянуть все локали одновременно, это же много.
Ответ написан
Shedal
@Shedal
А по-моему, у вас достаточно красиво получилось. Единственное, я бы поместил объект LocaleModel вовнутрь MyAppView. Так как-то более структурированно получается.

А чем вас не устраивает такое решение?

P.S. bind() и unbind() это устаревшие функции underscore. Начиная с какой-то там версии нужно использовать on() и off().
Ответ написан
megahertz
@megahertz
full stack разработчик
Обычно выношу локализацию отдельно, реализовал как в Yii, в том числе и с поддержкой склонения числительных. Пока не публиковал код нигде, руки не доходят красиво оформить, но если кому понравится могу поделиться:
App.messages.ru = {
    main: {
        'Hello {subject}': 'Привет'
    }
};
...
var text = App.t('main', 'Hello {subject}', {'{subject}': 'Мир'});
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А зачем хранить локаль в модели?
Ответ написан
@personaljs
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы