151 lines
6.2 KiB
JavaScript
151 lines
6.2 KiB
JavaScript
"use strict";
|
|
$(function () {
|
|
'use strict';
|
|
var supportedLanguages = ['de', 'en', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pt', 'ru', 'zh'], rtlLanguages = ['he'], defaultLocale = 'en', nav = window.navigator, locale = (!window.navigator.userAgent.match(/Trident\/7\./) && (nav.languages && nav.languages[0] || nav.language)) || $.cookie('myitsm_locale'), localeForChangeCalendar = defaultLocale, localeForAngularResources = defaultLocale;
|
|
jQuery.ajaxSetup({ cache: true });
|
|
initAppWithMaps();
|
|
// 1. Load Map API configuration
|
|
function initAppWithMaps() {
|
|
$.getJSON('/smartit/rest/map_api_properties').always(function (data) {
|
|
// init specific adapter accoding to the api properties
|
|
bmcMaps.adapters.init(data)
|
|
.always(function () {
|
|
initLocale();
|
|
});
|
|
});
|
|
}
|
|
// 2. Get correct browser locale information
|
|
function initLocale() {
|
|
if (locale) {
|
|
localeForAngularResources = locale;
|
|
locale = normalizeLocale(locale);
|
|
initApplication();
|
|
}
|
|
else {
|
|
$.ajax('/smartit/rest/serverstates/acceptLanguage', {
|
|
cache: false,
|
|
success: function (data) {
|
|
locale = localeFromAcceptLanguage(data);
|
|
initApplication();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
// 3. Save locale information and bootstrap Angular app
|
|
function initApplication() {
|
|
window.myitsmLocale = locale;
|
|
window.showMeridian = shouldShowMeridian(locale);
|
|
$('html').attr('lang', locale);
|
|
if (/(msie) ([\w.]+)/.exec(navigator.userAgent.toLowerCase())) {
|
|
$.cookie('myitsm_locale', locale, { expires: 31 });
|
|
}
|
|
if (rtlLanguages.indexOf(locale) > -1) {
|
|
window.isRtl = true;
|
|
loadRtlCss();
|
|
}
|
|
$.when($.getScript(getAngularLocaleUrl(localeForAngularResources.toLowerCase())), $.getJSON('scripts/app/i18n/resources-locale_' + locale + '.json'), $.getScript(getAngularCustomLocaleUrl(localeForChangeCalendar.toLowerCase())))
|
|
.fail(function () {
|
|
return $.when($.getScript(getAngularLocaleUrl(defaultLocale)), $.getJSON('scripts/app/i18n/resources-locale_' + defaultLocale + '.json'), $.getScript(getAngularCustomLocaleUrl(defaultLocale))).then(startApp);
|
|
})
|
|
.then(startApp);
|
|
}
|
|
// loads RTL styles
|
|
function loadRtlCss() {
|
|
var rtlStyles = {
|
|
development: [
|
|
'styles/vendor/bootstrap/bootstrap-rtl.css',
|
|
'styles/css/smart-it-rtl.css'
|
|
],
|
|
distribution: [
|
|
'styles/vendor/css/vendor-rtl.min.css',
|
|
'styles/css/smart-it-rtl.min.css'
|
|
]
|
|
}, styles = '';
|
|
if (window.ENV) {
|
|
$.each(rtlStyles[window.ENV], function (i, css) {
|
|
styles += '<link rel="stylesheet" href="' + css + '" />';
|
|
});
|
|
$('head').append(styles);
|
|
}
|
|
}
|
|
function localeFromAcceptLanguage(acceptLanguage) {
|
|
// e.g. acceptLanguage = 'en-US,en;q=0.8,en-GB;q=0.6,es;q=0.4,es-419;q=0.2'
|
|
if (!acceptLanguage) {
|
|
return defaultLocale;
|
|
}
|
|
var localesStr = acceptLanguage.trim().toLowerCase().split(';');
|
|
for (var i = 0; i < localesStr.length; i++) {
|
|
var locales = localesStr[i].split(',');
|
|
for (var j = 0; j < locales.length; j++) {
|
|
var locale = locales[j];
|
|
// skip 'q=' param from Accept-Language Header
|
|
if (locale.search('q=') === -1) {
|
|
// try full locale e.g. 'en-us'
|
|
if (supportedLanguages.indexOf(locale) !== -1) {
|
|
localeForAngularResources = localeForChangeCalendar = locale;
|
|
return locale;
|
|
}
|
|
// try short locale e.g. 'en'
|
|
var localeLang = locale.substr(0, 2);
|
|
if (supportedLanguages.indexOf(localeLang) !== -1) {
|
|
localeForAngularResources = locale;
|
|
localeForChangeCalendar = locale.toLowerCase() === 'en-au' ? locale : localeLang;
|
|
return localeLang;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return defaultLocale;
|
|
}
|
|
function normalizeLocale(locale) {
|
|
if (locale) {
|
|
// try if we support long locale e.g. 'es-es'
|
|
if (supportedLanguages.indexOf(locale) !== -1) {
|
|
localeForChangeCalendar = locale;
|
|
return locale;
|
|
}
|
|
// try if we support short one e.g. 'es'
|
|
var localeLang = locale.substr(0, 2);
|
|
if (supportedLanguages.indexOf(localeLang) !== -1) {
|
|
localeForChangeCalendar = locale.toLowerCase() === 'en-us' ? locale : localeLang;
|
|
return localeLang;
|
|
}
|
|
}
|
|
return defaultLocale;
|
|
}
|
|
function startApp() {
|
|
window.appLocalilzation = arguments[1][0]; //resource locale JSON
|
|
angular.bootstrap(document.documentElement, ['myitsmApp']);
|
|
}
|
|
function getAngularLocaleUrl(lang) {
|
|
moment.locale(lang);
|
|
return 'scripts/vendor/angular-i18n/angular-locale_' + lang + '.js';
|
|
}
|
|
function getAngularCustomLocaleUrl(lang) {
|
|
return 'scripts/app/i18n-custom/angular-custom-locale_' + lang + '.js';
|
|
}
|
|
function shouldShowMeridian(locale) {
|
|
var d1 = new Date();
|
|
var d2 = new Date(d1);
|
|
d2.setHours(d1.getHours() + 12);
|
|
d1 = d1.toLocaleTimeString(locale).match(/\d+/);
|
|
d2 = d2.toLocaleTimeString(locale).match(/\d+/);
|
|
return !(d1[0] == 0 || d1[0] > 12 || d2[0] == 0 || d2[0] > 12); //jshint ignore:line
|
|
}
|
|
if (typeof String.prototype.trimLeft !== 'function') {
|
|
String.prototype.trimLeft = function () {
|
|
return this.replace(/^\s+/g, '');
|
|
};
|
|
}
|
|
if (typeof String.prototype.trim !== 'function') {
|
|
String.prototype.trim = function () {
|
|
return this.replace(/^\s+|\s+$/g, '');
|
|
};
|
|
}
|
|
if (typeof String.prototype.trimRight !== 'function') {
|
|
String.prototype.trimRight = function () {
|
|
return this.replace(/\s+$/g, '');
|
|
};
|
|
}
|
|
});
|