Updates #849
Refactor locales code to store the currently chosen locale as `_converse.locale` and use that in converse-notifications.js
This commit is contained in:
parent
853c765f0d
commit
f0deac9ec5
@ -10,7 +10,7 @@
|
|||||||
- eslint 3.19.0
|
- eslint 3.19.0
|
||||||
|
|
||||||
- #842 Persistent muc room creation not working [jcbrand]
|
- #842 Persistent muc room creation not working [jcbrand]
|
||||||
|
- #849 `TypeError: _converse.i18n.locale_data is undefined` when reconnecting. [jcbrand]
|
||||||
|
|
||||||
## 3.0.1 (2017-04-04)
|
## 3.0.1 (2017-04-04)
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
"jquery-private",
|
"jquery-private",
|
||||||
"lodash",
|
"lodash",
|
||||||
"polyfill",
|
"polyfill",
|
||||||
"locales",
|
|
||||||
"utils",
|
"utils",
|
||||||
"moment_with_locales",
|
"moment_with_locales",
|
||||||
"strophe",
|
"strophe",
|
||||||
@ -19,7 +18,7 @@
|
|||||||
"backbone.browserStorage",
|
"backbone.browserStorage",
|
||||||
"backbone.overview",
|
"backbone.overview",
|
||||||
], factory);
|
], factory);
|
||||||
}(this, function (sizzle, $, _, polyfill, locales, utils, moment, Strophe, pluggable) {
|
}(this, function (sizzle, $, _, polyfill, utils, moment, Strophe, pluggable) {
|
||||||
/* Cannot use this due to Safari bug.
|
/* Cannot use this due to Safari bug.
|
||||||
* See https://github.com/jcbrand/converse.js/issues/196
|
* See https://github.com/jcbrand/converse.js/issues/196
|
||||||
*/
|
*/
|
||||||
@ -194,6 +193,16 @@
|
|||||||
'INACTIVE': 90000
|
'INACTIVE': 90000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Internationalization
|
||||||
|
this.locale = utils.getLocale(settings.i18n, utils.isConverseLocale);
|
||||||
|
if (!moment.locale) {
|
||||||
|
//moment.lang is deprecated after 2.8.1, use moment.locale instead
|
||||||
|
moment.locale = moment.lang;
|
||||||
|
}
|
||||||
|
moment.locale(utils.getLocale(settings.i18n, utils.isMomentLocale));
|
||||||
|
var __ = _converse.__ = utils.__.bind(_converse);
|
||||||
|
_converse.___ = utils.___;
|
||||||
|
|
||||||
// XEP-0085 Chat states
|
// XEP-0085 Chat states
|
||||||
// http://xmpp.org/extensions/xep-0085.html
|
// http://xmpp.org/extensions/xep-0085.html
|
||||||
this.INACTIVE = 'inactive';
|
this.INACTIVE = 'inactive';
|
||||||
@ -202,28 +211,6 @@
|
|||||||
this.PAUSED = 'paused';
|
this.PAUSED = 'paused';
|
||||||
this.GONE = 'gone';
|
this.GONE = 'gone';
|
||||||
|
|
||||||
// Detect support for the user's locale
|
|
||||||
// ------------------------------------
|
|
||||||
locales = _.isUndefined(locales) ? {} : locales;
|
|
||||||
this.isConverseLocale = function (locale) {
|
|
||||||
return !_.isUndefined(locales[locale]);
|
|
||||||
};
|
|
||||||
this.isMomentLocale = function (locale) { return moment.locale() !== moment.locale(locale); };
|
|
||||||
if (!moment.locale) { //moment.lang is deprecated after 2.8.1, use moment.locale instead
|
|
||||||
moment.locale = moment.lang;
|
|
||||||
}
|
|
||||||
moment.locale(utils.detectLocale(this.isMomentLocale));
|
|
||||||
if (_.includes(_.keys(locales), settings.i18n)) {
|
|
||||||
settings.i18n = locales[settings.i18n];
|
|
||||||
}
|
|
||||||
this.i18n = settings.i18n ? settings.i18n : locales[utils.detectLocale(this.isConverseLocale)] || {};
|
|
||||||
|
|
||||||
// Translation machinery
|
|
||||||
// ---------------------
|
|
||||||
var __ = _converse.__ = utils.__.bind(_converse);
|
|
||||||
_converse.___ = utils.___;
|
|
||||||
var DESC_GROUP_TOGGLE = __('Click to hide these contacts');
|
|
||||||
|
|
||||||
// Default configuration values
|
// Default configuration values
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
this.default_settings = {
|
this.default_settings = {
|
||||||
@ -260,6 +247,7 @@
|
|||||||
rid: undefined,
|
rid: undefined,
|
||||||
roster_groups: true,
|
roster_groups: true,
|
||||||
show_only_online_users: false,
|
show_only_online_users: false,
|
||||||
|
show_send_button: false,
|
||||||
sid: undefined,
|
sid: undefined,
|
||||||
storage: 'session',
|
storage: 'session',
|
||||||
strict_plugin_dependencies: false,
|
strict_plugin_dependencies: false,
|
||||||
@ -268,7 +256,6 @@
|
|||||||
whitelisted_plugins: [],
|
whitelisted_plugins: [],
|
||||||
xhr_custom_status: false,
|
xhr_custom_status: false,
|
||||||
xhr_custom_status_url: '',
|
xhr_custom_status_url: '',
|
||||||
show_send_button: false
|
|
||||||
};
|
};
|
||||||
_.assignIn(this, this.default_settings);
|
_.assignIn(this, this.default_settings);
|
||||||
// Allow only whitelisted configuration attributes to be overwritten
|
// Allow only whitelisted configuration attributes to be overwritten
|
||||||
@ -1310,7 +1297,7 @@
|
|||||||
this.RosterGroup = Backbone.Model.extend({
|
this.RosterGroup = Backbone.Model.extend({
|
||||||
initialize: function (attributes) {
|
initialize: function (attributes) {
|
||||||
this.set(_.assignIn({
|
this.set(_.assignIn({
|
||||||
description: DESC_GROUP_TOGGLE,
|
description: __('Click to hide these contacts'),
|
||||||
state: _converse.OPENED
|
state: _converse.OPENED
|
||||||
}, attributes));
|
}, attributes));
|
||||||
// Collection of contacts belonging to this group.
|
// Collection of contacts belonging to this group.
|
||||||
|
@ -163,7 +163,7 @@
|
|||||||
}
|
}
|
||||||
var n = new Notification(title, {
|
var n = new Notification(title, {
|
||||||
body: message.querySelector('body').textContent,
|
body: message.querySelector('body').textContent,
|
||||||
lang: _.isEmpty(converse.i18n) ? 'en' : _converse.i18n.locale_data.converse[""].lang,
|
lang: _converse.locale,
|
||||||
icon: _converse.notification_icon
|
icon: _converse.notification_icon
|
||||||
});
|
});
|
||||||
setTimeout(n.close.bind(n), 5000);
|
setTimeout(n.close.bind(n), 5000);
|
||||||
@ -193,7 +193,7 @@
|
|||||||
}
|
}
|
||||||
var n = new Notification(contact.fullname, {
|
var n = new Notification(contact.fullname, {
|
||||||
body: message,
|
body: message,
|
||||||
lang: _converse.i18n.locale_data.converse[""].lang,
|
lang: _converse.locale,
|
||||||
icon: _converse.notification_icon
|
icon: _converse.notification_icon
|
||||||
});
|
});
|
||||||
setTimeout(n.close.bind(n), 5000);
|
setTimeout(n.close.bind(n), 5000);
|
||||||
@ -202,7 +202,7 @@
|
|||||||
_converse.showContactRequestNotification = function (contact) {
|
_converse.showContactRequestNotification = function (contact) {
|
||||||
var n = new Notification(contact.fullname, {
|
var n = new Notification(contact.fullname, {
|
||||||
body: __('wants to be your contact'),
|
body: __('wants to be your contact'),
|
||||||
lang: _converse.i18n.locale_data.converse[""].lang,
|
lang: _converse.locale,
|
||||||
icon: _converse.notification_icon
|
icon: _converse.notification_icon
|
||||||
});
|
});
|
||||||
setTimeout(n.close.bind(n), 5000);
|
setTimeout(n.close.bind(n), 5000);
|
||||||
@ -212,7 +212,7 @@
|
|||||||
if (data.klass === 'error' || data.klass === 'warn') {
|
if (data.klass === 'error' || data.klass === 'warn') {
|
||||||
var n = new Notification(data.subject, {
|
var n = new Notification(data.subject, {
|
||||||
body: data.message,
|
body: data.message,
|
||||||
lang: _converse.i18n.locale_data.converse[""].lang,
|
lang: _converse.locale,
|
||||||
icon: _converse.notification_icon
|
icon: _converse.notification_icon
|
||||||
});
|
});
|
||||||
setTimeout(n.close.bind(n), 5000);
|
setTimeout(n.close.bind(n), 5000);
|
||||||
|
93
src/utils.js
93
src/utils.js
@ -4,6 +4,8 @@
|
|||||||
"jquery-private",
|
"jquery-private",
|
||||||
"jquery.browser",
|
"jquery.browser",
|
||||||
"lodash",
|
"lodash",
|
||||||
|
"locales",
|
||||||
|
"moment_with_locales",
|
||||||
"tpl!field",
|
"tpl!field",
|
||||||
"tpl!select_option",
|
"tpl!select_option",
|
||||||
"tpl!form_select",
|
"tpl!form_select",
|
||||||
@ -14,7 +16,7 @@
|
|||||||
"tpl!form_captcha"
|
"tpl!form_captcha"
|
||||||
], factory);
|
], factory);
|
||||||
}(this, function (
|
}(this, function (
|
||||||
$, dummy, _,
|
$, dummy, _, locales, moment,
|
||||||
tpl_field,
|
tpl_field,
|
||||||
tpl_select_option,
|
tpl_select_option,
|
||||||
tpl_form_select,
|
tpl_form_select,
|
||||||
@ -156,15 +158,11 @@
|
|||||||
// Translation machinery
|
// Translation machinery
|
||||||
// ---------------------
|
// ---------------------
|
||||||
__: function (str) {
|
__: function (str) {
|
||||||
if (typeof Jed === "undefined" || _.isUndefined(this.i18n) || this.i18n === 'en') {
|
if (typeof Jed === "undefined" || !utils.isConverseLocale(this.locale) || this.locale === 'en') {
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
// Translation factory
|
|
||||||
if (typeof this.i18n === "string") {
|
|
||||||
this.i18n = window.JSON.parse(this.i18n);
|
|
||||||
}
|
|
||||||
if (typeof this.jed === "undefined") {
|
if (typeof this.jed === "undefined") {
|
||||||
this.jed = new Jed(this.i18n);
|
this.jed = new Jed(window.JSON.parse(locales[this.locale]));
|
||||||
}
|
}
|
||||||
var t = this.jed.translate(str);
|
var t = this.jed.translate(str);
|
||||||
if (arguments.length>1) {
|
if (arguments.length>1) {
|
||||||
@ -201,34 +199,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
detectLocale: function (library_check) {
|
|
||||||
/* Determine which locale is supported by the user's system as well
|
|
||||||
* as by the relevant library (e.g. converse.js or moment.js).
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* (Function) library_check - returns a boolean indicating whether the locale is supported
|
|
||||||
*/
|
|
||||||
var locale, i;
|
|
||||||
if (window.navigator.userLanguage) {
|
|
||||||
locale = utils.isLocaleAvailable(window.navigator.userLanguage, library_check);
|
|
||||||
}
|
|
||||||
if (window.navigator.languages && !locale) {
|
|
||||||
for (i=0; i<window.navigator.languages.length && !locale; i++) {
|
|
||||||
locale = utils.isLocaleAvailable(window.navigator.languages[i], library_check);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (window.navigator.browserLanguage && !locale) {
|
|
||||||
locale = utils.isLocaleAvailable(window.navigator.browserLanguage, library_check);
|
|
||||||
}
|
|
||||||
if (window.navigator.language && !locale) {
|
|
||||||
locale = utils.isLocaleAvailable(window.navigator.language, library_check);
|
|
||||||
}
|
|
||||||
if (window.navigator.systemLanguage && !locale) {
|
|
||||||
locale = utils.isLocaleAvailable(window.navigator.systemLanguage, library_check);
|
|
||||||
}
|
|
||||||
return locale || 'en';
|
|
||||||
},
|
|
||||||
|
|
||||||
fadeIn: function (el, callback) {
|
fadeIn: function (el, callback) {
|
||||||
if ($.fx.off) {
|
if ($.fx.off) {
|
||||||
el.classList.remove('hidden');
|
el.classList.remove('hidden');
|
||||||
@ -446,13 +416,64 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
utils.detectLocale = function (library_check) {
|
||||||
|
/* Determine which locale is supported by the user's system as well
|
||||||
|
* as by the relevant library (e.g. converse.js or moment.js).
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* (Function) library_check - returns a boolean indicating whether
|
||||||
|
* the locale is supported.
|
||||||
|
*/
|
||||||
|
var locale, i;
|
||||||
|
if (window.navigator.userLanguage) {
|
||||||
|
locale = utils.isLocaleAvailable(window.navigator.userLanguage, library_check);
|
||||||
|
}
|
||||||
|
if (window.navigator.languages && !locale) {
|
||||||
|
for (i=0; i<window.navigator.languages.length && !locale; i++) {
|
||||||
|
locale = utils.isLocaleAvailable(window.navigator.languages[i], library_check);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.navigator.browserLanguage && !locale) {
|
||||||
|
locale = utils.isLocaleAvailable(window.navigator.browserLanguage, library_check);
|
||||||
|
}
|
||||||
|
if (window.navigator.language && !locale) {
|
||||||
|
locale = utils.isLocaleAvailable(window.navigator.language, library_check);
|
||||||
|
}
|
||||||
|
if (window.navigator.systemLanguage && !locale) {
|
||||||
|
locale = utils.isLocaleAvailable(window.navigator.systemLanguage, library_check);
|
||||||
|
}
|
||||||
|
return locale || 'en';
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.isConverseLocale = function (locale) {
|
||||||
|
if (!_.isString(locale)) { return false; }
|
||||||
|
return _.includes(_.keys(locales || {}), locale)
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.isMomentLocale = function (locale) {
|
||||||
|
if (!_.isString(locale)) { return false; }
|
||||||
|
return moment.locale() !== moment.locale(locale);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.getLocale = function (preferred_locale, isSupportedByLibrary) {
|
||||||
|
if (isSupportedByLibrary(preferred_locale)) {
|
||||||
|
return preferred_locale;
|
||||||
|
} else if (_.isObject(preferred_locale)) {
|
||||||
|
try {
|
||||||
|
return preferred_locale.locale_data.converse[""].lang;
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return utils.detectLocale(isSupportedByLibrary) || 'en';
|
||||||
|
};
|
||||||
|
|
||||||
utils.contains.not = function (attr, query) {
|
utils.contains.not = function (attr, query) {
|
||||||
return function (item) {
|
return function (item) {
|
||||||
return !(utils.contains(attr, query)(item));
|
return !(utils.contains(attr, query)(item));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
utils.createElementsFromString = function (element, html) {
|
utils.createElementsFromString = function (element, html) {
|
||||||
// http://stackoverflow.com/questions/9334645/create-node-from-markup-string
|
// http://stackoverflow.com/questions/9334645/create-node-from-markup-string
|
||||||
var frag = document.createDocumentFragment(),
|
var frag = document.createDocumentFragment(),
|
||||||
|
@ -80,7 +80,7 @@
|
|||||||
window.localStorage.clear();
|
window.localStorage.clear();
|
||||||
window.sessionStorage.clear();
|
window.sessionStorage.clear();
|
||||||
var converse = converse_api.initialize(_.extend({
|
var converse = converse_api.initialize(_.extend({
|
||||||
i18n: window.locales.en,
|
i18n: 'en',
|
||||||
auto_subscribe: false,
|
auto_subscribe: false,
|
||||||
bosh_service_url: 'localhost',
|
bosh_service_url: 'localhost',
|
||||||
connection: mock.mock_connection(),
|
connection: mock.mock_connection(),
|
||||||
|
Loading…
Reference in New Issue
Block a user