123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global.i18nextBrowserLanguageDetector = factory());
- }(this, function () { 'use strict';
- var arr = [];
- var each = arr.forEach;
- var slice = arr.slice;
- function defaults(obj) {
- each.call(slice.call(arguments, 1), function (source) {
- if (source) {
- for (var prop in source) {
- if (obj[prop] === undefined) obj[prop] = source[prop];
- }
- }
- });
- return obj;
- }
- var cookie = {
- create: function create(name, value, minutes, domain) {
- var expires = void 0;
- if (minutes) {
- var date = new Date();
- date.setTime(date.getTime() + minutes * 60 * 1000);
- expires = '; expires=' + date.toGMTString();
- } else expires = '';
- domain = domain ? 'domain=' + domain + ';' : '';
- document.cookie = name + '=' + value + expires + ';' + domain + 'path=/';
- },
- read: function read(name) {
- var nameEQ = name + '=';
- var ca = document.cookie.split(';');
- for (var i = 0; i < ca.length; i++) {
- var c = ca[i];
- while (c.charAt(0) === ' ') {
- c = c.substring(1, c.length);
- }if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
- }
- return null;
- },
- remove: function remove(name) {
- this.create(name, '', -1);
- }
- };
- var cookie$1 = {
- name: 'cookie',
- lookup: function lookup(options) {
- var found = void 0;
- if (options.lookupCookie && typeof document !== 'undefined') {
- var c = cookie.read(options.lookupCookie);
- if (c) found = c;
- }
- return found;
- },
- cacheUserLanguage: function cacheUserLanguage(lng, options) {
- if (options.lookupCookie && typeof document !== 'undefined') {
- cookie.create(options.lookupCookie, lng, options.cookieMinutes, options.cookieDomain);
- }
- }
- };
- var querystring = {
- name: 'querystring',
- lookup: function lookup(options) {
- var found = void 0;
- if (typeof window !== 'undefined') {
- var query = window.location.search.substring(1);
- var params = query.split('&');
- for (var i = 0; i < params.length; i++) {
- var pos = params[i].indexOf('=');
- if (pos > 0) {
- var key = params[i].substring(0, pos);
- if (key === options.lookupQuerystring) {
- found = params[i].substring(pos + 1);
- }
- }
- }
- }
- return found;
- }
- };
- var hasLocalStorageSupport = void 0;
- try {
- hasLocalStorageSupport = window !== 'undefined' && window.localStorage !== null;
- var testKey = 'i18next.translate.boo';
- window.localStorage.setItem(testKey, 'foo');
- window.localStorage.removeItem(testKey);
- } catch (e) {
- hasLocalStorageSupport = false;
- }
- var localStorage = {
- name: 'localStorage',
- lookup: function lookup(options) {
- var found = void 0;
- if (options.lookupLocalStorage && hasLocalStorageSupport) {
- var lng = window.localStorage.getItem(options.lookupLocalStorage);
- if (lng) found = lng;
- }
- return found;
- },
- cacheUserLanguage: function cacheUserLanguage(lng, options) {
- if (options.lookupLocalStorage && hasLocalStorageSupport) {
- window.localStorage.setItem(options.lookupLocalStorage, lng);
- }
- }
- };
- var navigator$1 = {
- name: 'navigator',
- lookup: function lookup(options) {
- var found = [];
- if (typeof navigator !== 'undefined') {
- if (navigator.languages) {
- // chrome only; not an array, so can't use .push.apply instead of iterating
- for (var i = 0; i < navigator.languages.length; i++) {
- found.push(navigator.languages[i]);
- }
- }
- if (navigator.userLanguage) {
- found.push(navigator.userLanguage);
- }
- if (navigator.language) {
- found.push(navigator.language);
- }
- }
- return found.length > 0 ? found : undefined;
- }
- };
- var htmlTag = {
- name: 'htmlTag',
- lookup: function lookup(options) {
- var found = void 0;
- var htmlTag = options.htmlTag || (typeof document !== 'undefined' ? document.documentElement : null);
- if (htmlTag && typeof htmlTag.getAttribute === 'function') {
- found = htmlTag.getAttribute('lang');
- }
- return found;
- }
- };
- var path = {
- name: 'path',
- lookup: function lookup(options) {
- var found = void 0;
- if (typeof window !== 'undefined') {
- var language = window.location.pathname.match(/\/([a-zA-Z-]*)/g);
- if (language instanceof Array) {
- if (typeof options.lookupFromPathIndex === 'number') {
- if (typeof language[options.lookupFromPathIndex] !== 'string') {
- return undefined;
- }
- found = language[options.lookupFromPathIndex].replace('/', '');
- } else {
- found = language[0].replace('/', '');
- }
- }
- }
- return found;
- }
- };
- var subdomain = {
- name: 'subdomain',
- lookup: function lookup(options) {
- var found = void 0;
- if (typeof window !== 'undefined') {
- var language = window.location.pathname.match(/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/gi);
- if (language instanceof Array) {
- if (typeof options.lookupFromSubdomainIndex === 'number') {
- found = language[options.lookupFromSubdomainIndex].replace('http://', '').replace('https://', '').replace('.', '');
- } else {
- found = language[0].replace('http://', '').replace('https://', '').replace('.', '');
- }
- }
- }
- return found;
- }
- };
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
- function getDefaults() {
- return {
- order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag'],
- lookupQuerystring: 'lng',
- lookupCookie: 'i18next',
- lookupLocalStorage: 'i18nextLng',
- // cache user language
- caches: ['localStorage'],
- excludeCacheFor: ['cimode']
- //cookieMinutes: 10,
- //cookieDomain: 'myDomain'
- };
- }
- var Browser = function () {
- function Browser(services) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- _classCallCheck(this, Browser);
- this.type = 'languageDetector';
- this.detectors = {};
- this.init(services, options);
- }
- _createClass(Browser, [{
- key: 'init',
- value: function init(services) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var i18nOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- this.services = services;
- this.options = defaults(options, this.options || {}, getDefaults());
- // backwards compatibility
- if (this.options.lookupFromUrlIndex) this.options.lookupFromPathIndex = this.options.lookupFromUrlIndex;
- this.i18nOptions = i18nOptions;
- this.addDetector(cookie$1);
- this.addDetector(querystring);
- this.addDetector(localStorage);
- this.addDetector(navigator$1);
- this.addDetector(htmlTag);
- this.addDetector(path);
- this.addDetector(subdomain);
- }
- }, {
- key: 'addDetector',
- value: function addDetector(detector) {
- this.detectors[detector.name] = detector;
- }
- }, {
- key: 'detect',
- value: function detect(detectionOrder) {
- var _this = this;
- if (!detectionOrder) detectionOrder = this.options.order;
- var detected = [];
- detectionOrder.forEach(function (detectorName) {
- if (_this.detectors[detectorName]) {
- var lookup = _this.detectors[detectorName].lookup(_this.options);
- if (lookup && typeof lookup === 'string') lookup = [lookup];
- if (lookup) detected = detected.concat(lookup);
- }
- });
- var found = void 0;
- detected.forEach(function (lng) {
- if (found) return;
- var cleanedLng = _this.services.languageUtils.formatLanguageCode(lng);
- if (_this.services.languageUtils.isWhitelisted(cleanedLng)) found = cleanedLng;
- });
- if (!found) {
- var fallbacks = this.i18nOptions.fallbackLng;
- if (typeof fallbacks === 'string') fallbacks = [fallbacks];
- if (!fallbacks) fallbacks = [];
- if (Object.prototype.toString.apply(fallbacks) === '[object Array]') {
- found = fallbacks[0];
- } else {
- found = fallbacks[0] || fallbacks.default && fallbacks.default[0];
- }
- };
- return found;
- }
- }, {
- key: 'cacheUserLanguage',
- value: function cacheUserLanguage(lng, caches) {
- var _this2 = this;
- if (!caches) caches = this.options.caches;
- if (!caches) return;
- if (this.options.excludeCacheFor && this.options.excludeCacheFor.indexOf(lng) > -1) return;
- caches.forEach(function (cacheName) {
- if (_this2.detectors[cacheName]) _this2.detectors[cacheName].cacheUserLanguage(lng, _this2.options);
- });
- }
- }]);
- return Browser;
- }();
- Browser.type = 'languageDetector';
- return Browser;
- }));
|