Skip to content

Commit 7830138

Browse files
Vairgrysfuzhenn
andauthored
Adding translator class to handle multiple languages (#2131)
* Adding translator class to handle multiple languages * Cleanup translator.js wrong sectioned comments --------- Co-authored-by: Fu Zhen <fuzhen@maptalks.org>
1 parent a4b9f17 commit 7830138

File tree

6 files changed

+164
-14
lines changed

6 files changed

+164
-14
lines changed

src/lang/languages/en-US.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"distancetool": {
3+
"start": "Start",
4+
"units": {
5+
"mile": " mi",
6+
"feet": " ft",
7+
"kilometer": " km",
8+
"meter": " m"
9+
}
10+
},
11+
"areatool": {
12+
"units": {
13+
"mile": " mi²",
14+
"feet": " ft²",
15+
"kilometer": " km²",
16+
"meter": ""
17+
}
18+
}
19+
}

src/lang/languages/es-MX.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"distancetool": {
3+
"start": "Inicio",
4+
"units": {
5+
"mile": " mi",
6+
"feet": " ft",
7+
"kilometer": " km",
8+
"meter": " m"
9+
}
10+
},
11+
"areatool": {
12+
"units": {
13+
"mile": " mi²",
14+
"feet": " ft²",
15+
"kilometer": " km²",
16+
"meter": ""
17+
}
18+
}
19+
}

src/lang/languages/zh-CN.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"distancetool": {
3+
"start": "起点",
4+
"units": {
5+
"mile": "",
6+
"feet": " 公里",
7+
"kilometer": " 英尺",
8+
"meter": " 英里"
9+
}
10+
},
11+
"areatool": {
12+
"units": {
13+
"mile": " 平方英里",
14+
"feet": " 平方英尺",
15+
"kilometer": " 平方公里",
16+
"meter": " 平方米"
17+
}
18+
}
19+
}

src/lang/translator.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import Class from '../core/Class';
2+
3+
import zhCn from '../lang/languages/zh-CN.json';
4+
import esMX from '../lang/languages/es-MX.json';
5+
import enUS from '../lang/languages/en-US.json';
6+
7+
/**
8+
* Maptalks text's language
9+
*/
10+
export class TranslatorError extends Error {
11+
constructor(msg) {
12+
super('Translator: ' + msg);
13+
this.name = 'TranslatorError';
14+
}
15+
}
16+
17+
class Translator extends Class {
18+
constructor(lang) {
19+
super();
20+
21+
this.languages = {
22+
'zh-CN': zhCn,
23+
'es-MX': esMX,
24+
'en-US': enUS
25+
};
26+
this.nodes = {};
27+
this.setLang(lang || 'zh-CN');
28+
}
29+
30+
/**
31+
* Method to update the language of maptalks
32+
* @param {string} lang - Available Langs (zh-CN, en-US, es-MX)
33+
* @example setLang('zh-CN')
34+
*/
35+
setLang(lang) {
36+
const newLanguageNodes = this.languages[lang];
37+
if (!newLanguageNodes) throw new TranslatorError('Setted Lang does not exist');
38+
this.nodes = newLanguageNodes;
39+
}
40+
41+
_validateNestedProps(nestedProps) {
42+
nestedProps.forEach(p => {
43+
if (p === '') throw new TranslatorError('Any of sides of a dot "." cannot be empty');
44+
});
45+
}
46+
/**
47+
* method to return the text of the current language available on lang json's
48+
* @param {string} textNode - Accesible property with the current language text.
49+
* @return {string} Text to show in screen
50+
* @example document.write(translate('areatool.units.kilometer'))
51+
*/
52+
translate(textNode = null) {
53+
if (textNode == null)
54+
throw new TranslatorError('Missing parameter textNode');
55+
if (typeof textNode === 'string') {
56+
let translatedText = null;
57+
if (textNode.includes('.')) {
58+
const nestedProps = textNode.split('.');
59+
if (nestedProps.length > 3) throw new TranslatorError(`Translate function can only access through 3 nested properties, trying to access -> ${nestedProps.length}`);
60+
this._validateNestedProps(nestedProps);
61+
62+
try {
63+
let translatedText = null;
64+
switch (nestedProps.length) {
65+
case 2 :
66+
translatedText = this.nodes[nestedProps[0]][nestedProps[1]];
67+
break;
68+
case 3 :
69+
translatedText = this.nodes[nestedProps[0]][nestedProps[1]][nestedProps[2]];
70+
break;
71+
}
72+
return translatedText;
73+
} catch (err) {
74+
throw new TranslatorError('Unable to find the text translated in lang json' + err.message);
75+
}
76+
} else {
77+
translatedText = this.nodes[textNode];
78+
return translatedText;
79+
}
80+
} else {
81+
throw new TranslatorError('Param passed has to be a String');
82+
}
83+
}
84+
}
85+
86+
export default Translator;

src/map/tool/AreaTool.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Size from '../../geo/Size';
22
import { Geometry, Marker, Label } from '../../geometry';
33
import DistanceTool from './DistanceTool';
4+
import Translator from '../../lang/translator';
45

56
/**
67
* @property {options} options
@@ -22,7 +23,8 @@ const options = {
2223
'lineDasharray': '',
2324
'polygonFill': '#ffffff',
2425
'polygonOpacity': 0.5
25-
}
26+
},
27+
'language' : 'zh-CN'
2628
};
2729

2830
/**
@@ -62,6 +64,7 @@ class AreaTool extends DistanceTool {
6264
super(options);
6365
// this.on('enable', this._afterEnable, this)
6466
// .on('disable', this._afterDisable, this);
67+
this.translator = new Translator(this.options['language']);
6568
this._measureLayers = [];
6669
}
6770

@@ -74,16 +77,17 @@ class AreaTool extends DistanceTool {
7477
area = map.getProjection().measureArea(toMeasure);
7578
}
7679
this._lastMeasure = area;
80+
7781
const result = this._formatLabelContent(area);
7882
if (result) {
7983
return result;
8084
}
81-
let units;
82-
if (this.options['language'] === 'zh-CN') {
83-
units = [' 平方米', ' 平方公里', ' 平方英尺', ' 平方英里'];
84-
} else {
85-
units = [' sq.m', ' sq.km', ' sq.ft', ' sq.mi'];
86-
}
85+
const units = [
86+
this.translator.translate('areatool.units.meter'),
87+
this.translator.translate('areatool.units.kilometer'),
88+
this.translator.translate('areatool.units.feet'),
89+
this.translator.translate('areatool.units.mile')];
90+
8791
let content = '';
8892
const decimals = this.options['decimalPlaces'];
8993
if (this.options['metric']) {

src/map/tool/DistanceTool.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Geometry from '../../geometry/Geometry';
55
import Marker from '../../geometry/Marker';
66
import Label from '../../geometry/Label';
77
import VectorLayer from '../../layer/VectorLayer';
8+
import Translator from '../../lang/translator';
89
import DrawTool from './DrawTool';
910

1011
/**
@@ -113,6 +114,7 @@ class DistanceTool extends DrawTool {
113114
this.on('enable', this._afterEnable, this)
114115
.on('disable', this._afterDisable, this);
115116
this._measureLayers = [];
117+
this.translator = new Translator(this.options['language']);
116118
}
117119

118120
/**
@@ -196,16 +198,17 @@ class DistanceTool extends DrawTool {
196198
length = map.getProjection().measureLength(toMeasure);
197199
}
198200
this._lastMeasure = length;
201+
199202
const result = this._formatLabelContent(length);
200203
if (result) {
201204
return result;
202205
}
203-
let units;
204-
if (this.options['language'] === 'zh-CN') {
205-
units = [' 米', ' 公里', ' 英尺', ' 英里'];
206-
} else {
207-
units = [' m', ' km', ' feet', ' mile'];
208-
}
206+
const units = [
207+
this.translator.translate('distancetool.units.meter'),
208+
this.translator.translate('distancetool.units.kilometer'),
209+
this.translator.translate('distancetool.units.feet'),
210+
this.translator.translate('distancetool.units.mile')
211+
];
209212
let content = '';
210213
const decimals = this.options['decimalPlaces'];
211214
if (this.options['metric']) {
@@ -266,7 +269,7 @@ class DistanceTool extends DrawTool {
266269
});
267270
//调用_setPrjCoordinates主要是为了解决repeatworld下,让它能标注在其他世界的问题
268271
marker._setPrjCoordinates(prjCoord);
269-
const content = (this.options['language'] === 'zh-CN' ? '起点' : 'start');
272+
const content = this.translator.translate('distancetool.start');
270273
const startLabel = new Label(content, param['coordinate'], this.options['labelOptions']);
271274
startLabel._setPrjCoordinates(prjCoord);
272275
this._lastVertex = startLabel;

0 commit comments

Comments
 (0)