Backbone.js предоставляет гибкую архитектуру для создания клиентских приложений с использованием моделей, коллекций, представлений и маршрутизаторов. В контексте многоязычных приложений важно уметь динамически переключать язык интерфейса без перезагрузки страницы. Реализация такой функциональности требует интеграции Backbone с библиотеками для локализации и грамотного управления состоянием приложения.
Для хранения переведённых строк удобно использовать Backbone.Model или Backbone.Collection. Каждая модель может представлять отдельный набор переводов для конкретного языка.
Пример структуры модели:
var Translation = Backbone.Model.extend({
defaults: {
language: 'en',
strings: {}
}
});
var translations = new Backbone.Collection([
new Translation({
language: 'en',
strings: {
greeting: "Hello",
farewell: "Goodbye"
}
}),
new Translation({
language: 'ru',
strings: {
greeting: "Привет",
farewell: "До свидания"
}
})
]);
В этом примере translations хранит набор языковых
моделей, каждая из которых содержит объект strings с
ключами сообщений.
Backbone.View играет ключевую роль в обновлении интерфейса при смене языка. Представление должно подписываться на изменения текущего языка и динамически обновлять текстовые элементы.
var AppView = Backbone.View.extend({
el: '#app',
initialize: function(options) {
this.translations = options.translations;
this.currentLanguage = options.currentLanguage;
this.listenTo(this.currentLanguage, 'change', this.render);
},
render: function() {
var lang = this.translations.findWhere({language: this.currentLanguage.get('language')});
if (lang) {
this.$('#greeting').text(lang.get('strings').greeting);
this.$('#farewell').text(lang.get('strings').farewell);
}
return this;
}
});
Здесь currentLanguage — это модель Backbone, которая
хранит текущий выбранный язык. Любое изменение этой модели автоматически
вызывает перерисовку представления.
Для глобального управления языком удобно использовать отдельную модель:
var CurrentLanguage = Backbone.Model.extend({
defaults: {
language: 'en'
}
});
var currentLanguage = new CurrentLanguage();
Смена языка выполняется просто:
currentLanguage.set('language', 'ru');
Все представления, подписанные на change этой модели,
автоматически обновят отображение.
Backbone.Router позволяет интегрировать язык в URL приложения, что упрощает навигацию и поддержку закладок:
var AppRouter = Backbone.Router.extend({
routes: {
':lang/home': 'home'
},
home: function(lang) {
currentLanguage.set('language', lang);
appView.render();
}
});
var appRouter = new AppRouter();
Backbone.history.start();
В этом примере язык задаётся через URL (/ru/home) и
автоматически обновляет модель currentLanguage.
Для крупных приложений перевод может храниться в отдельных JSON-файлах и загружаться динамически через Backbone.sync или AJAX:
var TranslationLoader = {
load: function(lang, callback) {
$.getJSON('/i18n/' + lang + '.json', function(data) {
var translation = translations.findWhere({language: lang});
if (translation) {
translation.set('strings', data);
} else {
translations.add(new Translation({language: lang, strings: data}));
}
callback && callback();
});
}
};
Динамическая подгрузка позволяет минимизировать объем передаваемых данных и быстро добавлять новые языки.
В сложных интерфейсах представления могут быть вложенными. Важно, чтобы дочерние представления также реагировали на изменение языка:
var ChildView = Backbone.View.extend({
initialize: function(options) {
this.currentLanguage = options.currentLanguage;
this.translations = options.translations;
this.listenTo(this.currentLanguage, 'change', this.render);
},
render: function() {
var lang = this.translations.findWhere({language: this.currentLanguage.get('language')});
this.$el.text(lang.get('strings').greeting);
return this;
}
});
var parentView = new AppView({
translations: translations,
currentLanguage: currentLanguage
});
var childView = new ChildView({
el: '#child',
translations: translations,
currentLanguage: currentLanguage
});
Использование событий change позволяет синхронизировать
все уровни интерфейса без прямого вмешательства в логику каждого
представления.
Для повышения производительности рекомендуется кэшировать загруженные
переводы в памяти и использовать _.memoize или аналогичные
методы для ускорения поиска нужных строк. Это особенно важно при работе
с большим количеством языков и текстовых ресурсов.
var getString = _.memoize(function(key) {
var lang = translations.findWhere({language: currentLanguage.get('language')});
return lang ? lang.get('strings')[key] : '';
});
Такой подход уменьшает количество обращений к коллекциям и ускоряет обновление интерфейса при смене языка.
Backbone.js позволяет строить гибкие механизмы динамического
переключения языков через модели, коллекции и представления. Основные
принципы включают хранение переводов в моделях, реактивное обновление
представлений через события change и интеграцию с
маршрутизатором для управления URL. Асинхронная подгрузка и кэширование
переводов обеспечивают производительность и масштабируемость
многоязычного приложения.