Skip to content

Commit 038b736

Browse files
author
Jianqing Gao
committed
build
1 parent b67cd4d commit 038b736

2 files changed

Lines changed: 161 additions & 0 deletions

File tree

dist/multi-language.js

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
* Author: Jianqing Gao
3+
* vip@jianqinggao.com
4+
* Date: Mar 4, 2021
5+
* Description: This document is created for supporting multilanguage sites.
6+
*/
7+
//each of this object contains one DOM and one of its possible translation
8+
class TranslatableElement
9+
{
10+
constructor(e, arr)
11+
{
12+
this.element = e;
13+
this.languages = arr;
14+
}
15+
}
16+
class MultiLanguage
17+
{
18+
/**
19+
* Construct a default MultiLanguage translator object. Assign default language and
20+
* replace all JSONs marked with localized.
21+
* @param {String} defaultLanguage The language that is default to your site and must be available across all elements.
22+
* @param {DOM} select The HTML DOM object of the selector to initalize. Optional.
23+
* @param {String} external The URL to the external JSON sheet
24+
* @param {String} externalJSON The content of external JSON. Note that
25+
* @returns {MultiLanguage} The construsted multilanguage object.
26+
*/
27+
constructor(defaultLanguage, externalJSON, select = null)
28+
{
29+
this.defaultLang = defaultLanguage;
30+
this.externalJSON = externalJSON;
31+
//an array of doms and their translation
32+
//this.localizedArr = [];
33+
this.registeredSelect = [];
34+
this.checkUserLanguage();
35+
this.registerSelect(select);
36+
37+
this.translate(this.getUserLanguage());
38+
}
39+
40+
/**
41+
* Add a new select to the listner. This select will also be able to control the global language and follow any changes.
42+
* @param {type} select
43+
* @returns {undefined}
44+
*/
45+
registerSelect(select)
46+
{
47+
if (select !== null && typeof select === "object")
48+
{
49+
var l = this.getUserLanguage();
50+
this.makeSelect(select, l);
51+
select.addEventListener("change", (e) => {
52+
this.translate(select.value);
53+
});
54+
}
55+
this.registeredSelect[this.registeredSelect.length] = select;
56+
}
57+
58+
makeSelect(select, option)
59+
{
60+
var opts = select.options;
61+
for (var i = 0, max = opts.length; i < max; i++)
62+
{
63+
if (opts[i].value == option)
64+
{
65+
select.selectedIndex = i;
66+
return true;
67+
}
68+
}
69+
return false;
70+
}
71+
/**
72+
* Translate all the supported elements to target language
73+
* @param {type} target
74+
* @returns {undefined}
75+
*/
76+
translate(target)
77+
{
78+
//save language preference
79+
this.setUserLanguage(target);
80+
//go through all elements
81+
//
82+
for(var i=0, max = this.externalJSON.length; i<max;i++)
83+
{
84+
//get the element to be translated
85+
var eleJSON = this.externalJSON[i];
86+
var ele = document.getElementById(eleJSON["id"]);
87+
if(ele!==null)
88+
{
89+
var targetLanguage = eleJSON["langs"][target];
90+
if(targetLanguage!==undefined)
91+
{
92+
this.setElementText(ele,targetLanguage);
93+
}else
94+
{
95+
this.setElementText(ele,eleJSON["langs"][this.defaultLang]);
96+
}
97+
}
98+
}
99+
100+
if (this.registeredSelect.length > 1)
101+
{
102+
for (var i = 0, max = this.registeredSelect.length; i < max; i++)
103+
{
104+
this.makeSelect(this.registeredSelect[i], target);
105+
}
106+
}
107+
108+
}
109+
110+
isElementInput(element)
111+
{
112+
return element.tagName == "TEXTAREA" || element.tagName == "INPUT";
113+
}
114+
115+
getElementText(element)
116+
{
117+
if (this.isElementInput(element))
118+
{
119+
return element.value;
120+
} else
121+
{
122+
return element.innerHTML;
123+
}
124+
}
125+
setElementText(element, text)
126+
{
127+
if (this.isElementInput(element))
128+
{
129+
element.value = text;
130+
} else
131+
{
132+
element.innerHTML = text;
133+
}
134+
}
135+
136+
getUserLanguage()
137+
{
138+
return localStorage.getItem("preferred-language");
139+
}
140+
141+
checkUserLanguage()
142+
{
143+
var l = this.getUserLanguage();
144+
if (l === null || l === "")
145+
{
146+
this.setUserLanguage(this.defaultLang);
147+
return false;
148+
}
149+
return true;
150+
}
151+
152+
setUserLanguage(target)
153+
{
154+
localStorage.setItem("preferred-language", target);
155+
}
156+
}
157+
158+

dist/multi-language.min.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)