Experimenting audioContext for Apple (Safari)
[sgc3.git] / internationalization_tables.js
blob0607b808e7ec66827a0429816d19068c789dc056
1 /* 
2  * SpeakGoodChinese 3
3  * Copyright (C) 2016 R.J.J.H. van Son (r.j.j.h.vanson@gmail.com)
4  * 
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You can find a copy of the GNU General Public License at
16  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
17  */
19 var userLanguage = (navigator.language) ? navigator.language : navigator.userLanguage;
20 userLanguage = userLanguage.substr(0,2).toUpperCase();
22 function insert_and_update_options (labels) {
23         for(x in labels) {
24                 if(document.getElementById(x) && ! x.match(/_/)) {
25                         document.getElementById(x).title = labels[x][1];
26                         var defaultText = document.getElementById(x+"Caption");
27                         if (defaultText) defaultText.textContent = labels[x][0];
28                         var defaultText2 = document.getElementById(x+"Caption2");
29                         if (defaultText2) defaultText2.textContent = labels[x][0];
30                 } else if (x.match(/_/)) {
31                         var Id = x.replace(/_[^_]*$/, "");
32                         var value = x.replace(/^[^_]*_/, "");
33                         if (document.getElementById(x)) {
34                                 document.getElementById(x).value = value;
35                                 document.getElementById(x).text = labels[x][0];
36                         } else {
37                                 if(document.getElementById(Id)) {
38                                         var selector = document.getElementById(Id);
39                                         var newOption = selector.options[0].cloneNode(true);
40                                         newOption.value = value;
41                                         newOption.text = labels[x][0];
42                                         newOption.id = x;
43                                         selector.add(newOption);
44                                 };
45                         };
46                 };
47         };
50 function insert_and_update_simpleoptions (labels) {
51         for(x in labels) {
52                 if(document.getElementById(x) && ! x.match(/_/)) {
53                         document.getElementById(x).title = labels[x];
54                         var defaultText = document.getElementById(x+"Caption");
55                         if (defaultText) defaultText.textContent = labels[x];
56                         var defaultText2 = document.getElementById(x+"Caption2");
57                         if (defaultText2) defaultText2.textContent = labels[x];
58                 } else if (x.match(/_/)) {
59                         var Id = x.replace(/_[^_]*$/, "");
60                         var value = x.replace(/^[^_]*_/, "");
61                         if (document.getElementById(x)) {
62                                 document.getElementById(x).value = value;
63                                 document.getElementById(x).text = labels[x];
64                         } else {
65                                 if(document.getElementById(Id)) {
66                                         var selector = document.getElementById(Id);
67                                         var newOption = selector.options[0].cloneNode(true);
68                                         newOption.value = value;
69                                         newOption.text = labels[x];
70                                         newOption.id = x;
71                                         selector.add(newOption);
72                                 };
73                         };
74                 };
75         };
78 function set_mainpageLanguage (language) {
79         var labels = mainpage_tables[language];
80         for(x in labels) {
81                 if(document.getElementById(x)) {
82                         if(document.getElementById(x).label) {
83                                 document.getElementById(x).label = labels[x][0];
84                                 document.getElementById(x).title = labels[x][1];
85                         } else {
86                                 document.getElementById(x).textContent = labels[x][0];
87                                 document.getElementById(x).parentNode.parentNode.title = labels[x][1];
88                         };
89                 };
90         };
91         
92         labels = selector_tables[language];
93         insert_and_update_options (labels);
94         
95         labels = language_table;
96         insert_and_update_options (labels);
97         
98         // Set selector index
99         for(var x = 0; x < document.getElementById("Language").options.length; ++ x) {
100                 if (document.getElementById("Language").options[x].value == language) {
101                         document.getElementById("Language").selectedIndex = x;
102                 };
103         };
104         
105         localStorage.sgc3_language = JSON.stringify(language);
108 function set_configLanguage (language) {
109         var labels = config_tables[language];
110         for(x in labels) {
111                 if(document.getElementById(x)) {
112                         document.getElementById(x).textContent = labels[x][0];
113                         document.getElementById(x).parentNode.parentNode.title = labels[x][1];
114                 };
115         };
116         
117         labels = selector_tables[language];
118         insert_and_update_options (labels);
119         
120         labels = language_table;
121         insert_and_update_options (labels);
122         
123         // Set selector index
124         if (document.getElementById("Language")) {
125                 for(var x = 0; x < document.getElementById("Language").options.length; ++ x) {
126                         if (document.getElementById("Language").options[x].value == language) {
127                                 document.getElementById("Language").selectedIndex = x;
128                         };
129                 };
130         };
131         localStorage.sgc3_language = JSON.stringify(language);
134 function set_selectWordsLanguage (language) {
135         var labels = config_tables[language];
136         insert_and_update_options (labels);
137         labels = feedback_tables[language];
138         insert_and_update_simpleoptions (labels);
142 function change_mainpageLanguage () {
143         var index = document.getElementById("Language").selectedIndex;
144         var value = document.getElementById("Language").options[index].value;
145         userLanguage = value;
146         set_mainpageLanguage (userLanguage);
147         return userLanguage;
150 function change_configLanguage () {
151         var index = document.getElementById("Language").selectedIndex;
152         if (index > 0) {
153                 var value = document.getElementById("Language").options[index].value;
154                 userLanguage = value;
155                 set_configLanguage (userLanguage);
156         } else {
157                 set_configLanguage (userLanguage)
158         };
159         return userLanguage;
162 var mainpage_tables = {
163         ZH: {
164                 Config: ["设置 S", "切换到设置页面。"],
165                 Record: ["录音", "录音。录音时间为4秒钟,注意“录音指示灯”。"],
166                 Play: ["播放", "播放您的发音。"],
167                 Example: ["参考发音", "播放软件提供的参考发音。"],
168                 Previous: ["上一个", "切换到上一个单词。"],
169                 Next: ["下一个", "切换到下一个单词。"],
170                 WordlistCaption: ["单词表", "更换单词表。"],
171                 SelectWords: ["选择单词", "选择要练习的单词"],
172                 WordlistUp: ["上一个", "切换到上一个单词表。"],
173                 WordlistDown: ["下一个", "切换到下一个单词表。"],
174                 GRADE: ["评分", "选择数字0-9给出评分。"],
175                 },
176         EN: {
177                 Config: ["Settings", "Go to settings page"],
178                 Record: ["Record", "Record your pronunciation. You have 4 seconds, watch the recording 'light'"],
179                 Play: ["Play", "Play back of your recorded pronunciation"],
180                 Example: ["Example", "Play example tone pronunciation"],
181                 Previous: ["Previous", "Previous word"],
182                 Next: ["Next", "Next word"],
183                 WordlistCaption: ["Word List", "Change word list"],
184                 SelectWords: ["Words", "Select words to practise"],
185                 WordlistUp: ["Previous", "Previous word list"],
186                 WordlistDown: ["Next", "Next word list"],
187                 GRADE: ["Grading", "Grading of pronunciation 0-9"],
188                 },
189         JA: {
190                 Config: ["設定 S", "設定画面に進みます。"],
191                 Record: ["録音", "声を録音します。録音されるのは4秒間です。録音中“録音ライト”が表示されます。"],
192                 Play: ["再生", "録音した声を再生します。"],
193                 Example: ["発音例", "発音例を再生します。"],
194                 Previous: ["戻る", "一つ前の単語に戻ります。"],
195                 Next: ["次へ", "次の単語に進みます。"],
196                 WordlistCaption: ["単語表", "単語表を変更します。"],
197                 SelectWords: ["単語の選択", "練習で使う単語を選択します"],
198                 WordlistUp: ["戻る", "一つ前の単語表に戻ります。"],
199                 WordlistDown: ["次へ", "次の単語表に進みます。"],
200                 GRADE: ["評価", "発音を0-9の値で評価します。"],
201                 },
202         DE: {
203                 Config: ["Einstellungen", "Zur Seite 'Einstellungen'"],
204                 Record: ["Aufnahme", "Machen Sie eine Sprachaufnahme. Sie haben 4 Sekunden bevor die Aufnahme beginnt; achten Sie auf das rote Licht."],
205                 Play: ["Wiedergabe", "Abspielen der Aufnahme"],
206                 Example: ["Vorbild", "Vorbild abspielen"],
207                 Previous: ["Zurück", "zum vorigen Abschnitt"],
208                 Next: ["Voraus", "zum nächsten Abschnitt"],
209                 WordlistCaption: ["Wordliste", "Ändere Wordliste"],
210                 SelectWords: ["Wörter", "Wähle die Wörter zum üben"],
211                 WordlistUp: ["vorige", "Zur voriger Liste"],
212                 WordlistDown: ["nächste", "Zur nächster Liste"],
213                 GRADE: ["Beurteilung", "Beurteilung Aussprache 0-9"],
214                 },
215         NL: {
216                 Config: ["Instellingen", "Ga naar de pagina met instellingen"],
217                 Record: ["Opnemen", 'Neem je uitspraak op. Je hebt 4 seconden, let op het rode "lampje"'],
218                 Play: ["Afspelen", "Speel je opgenomen uitspraak af"],
219                 Example: ["Voorbeeld", "Speel een voorbeeld van deze toon af"],
220                 Previous: ["Terug", "Vorige woord"],
221                 Next: ["Vooruit", "Volgende woord"],
222                 WordlistCaption: ["Woordenlijst", "Andere woordenlijst"],
223                 SelectWords: ["Woorden", "Kies de woorden om te oefenen"],
224                 WordlistUp: ["Vorige", "Vorige woordenlijst"],
225                 WordlistDown: ["Volgende", "Volgende woordenlijst"],
226                 GRADE: ["Beoordeling", "Beoordeling uitspraak 0-9"],
227         }
230 var config_tables = {
231         ZH: {
232                 Wordlists: ["单词表", "单词表"],
233                 WordlistCaption: ["单词表", "更换单词表。"],
234                 SelectWords: ["选择单词", "选择要练习的单词"],
235                 WordlistUp: ["上一个", "切换到上一个单词表。"],
236                 WordlistDown: ["下一个", "切换到下一个单词表。"],
237                 ShuffleLists: ["随机播放", "随机打乱单词表中的词,否则按顺序播放。"],
238                 AdaptiveLists: ["适应性", "只练习有难度的词,即发音错误两次以上的单词。"],
239                 UseSoundExample: ["实际发音", "如果提供了真人发音,选择此按键后,则播放真人发音,否则播放合成发音。"],
240                 Synthesis_eSpeak: ["合成音", "使用合成发音(需要eSpeak:www.espeak.org)。"],
241                 Voice: ["音质> ---", "选择合成音的种类"],
242                 Recognition: ["汉语水平", "可设置为高级汉语水平或母语者水平。"],
243                 StrictPost: ["水平", "进行审查发音时所使用的严格度(水平0-3)。水平最高时对发音的要求会非常严格。"],
244                 RecordingTimePost: ["(秒)", "录音时间(秒)"],
245                 OpenWordlist: ["打开单词表", "选择并打开单词表"],
246                 DeleteWordlist: ["删除单词表", "删除单词表,需要按下'y'键确认"],
247                 DeleteWordlistConfirm: ["确认", "确定要删除吗?"],
248                 Credits: ["关于 SGC3", "关于SpeakGoodChinese。"],
249                 DisplayNumbers: ["声调编码 u", "选择用数字显示声调,否则用声调符号显示。"],
250                 DisplayPinyin: ["拼音 P", "练习发音的过程中显示拼音。"],
251                 DisplayChar: ["汉字 C", "如果单词表提供了汉字,则显示汉字。"],
252                 DisplayTrans: ["翻译 T", "如果单词表提供了翻译,则显示翻译。"],
253                 SaveAudio: ["保存录音 K", "将录音保存到文件夹(只保存每个单词的最后一次发音)。"],
254                 ExportAudio: ["输出", "导出录音"],
255                 ImportAudio: ["输入", "进口录音"],
256                 DeleteAudio: ["删除", "Delete recordings in storage"],
257                 NewCollection: ["新", "Name of new collection of recordings"],
258                 ListPerf: ["发音练习的结果", "显示全部发音练习的结果。"],
259                 FactoryReset: ["擦除和复位", "Reset to original settings and delete all data"],
260                 },
261         EN: {
262                 Wordlists: ["Word lists", "Word lists"],
263                 WordlistCaption: ["Word List", "Change word list"],
264                 SelectWords: ["Words", "Select words to practise"],
265                 WordlistUp: ["Previous", "Previous word list"],
266                 WordlistDown: ["Next", "Next word list"],
267                 ShuffleLists: ["Shuffle", "Shuffle words in word lists (on) or use a fixed order (off)"],
268                 AdaptiveLists: ["Adaptive", "Practice only words that required more than two attempts"],
269                 UseSoundExample: ["Real example", "Use a real sound recording (on) if available or synthesized tones (off) as examples"],
270                 Synthesis_eSpeak: ["Synthesis", "Use a synthetic voice as example (you will use eSpeak: www.espeak.org)"],
271                 Voice: ["Voice> ---", "Select a synthetic voice"],
272                 Recognition: ["Proficiency", "Set to recognize advanced or native speakers"],
273                 StrictPost: ["Level", "How strict tone pronunciation will be checked (Level 0-3). The highest level is quite strict."], 
274                 RecordingTimePost: ["(sec)", "Time of recording in seconds"],
275                 OpenWordlist: ["Open List", "Select and read a single wordlist "],
276                 DeleteWordlist: ["Delete List", "Permanently delete the word list. You will be asked to confirm this action."],
277                 DeleteWordlistConfirm: ["Are you sure?", "Are you sure you want to proceed?"],
278                 Credits: ["About SGC3", "Information about SpeakGoodChinese"],
279                 DisplayNumbers: ["Tone Numbers", "Display pinyin with tone numbers (on) or tone symbols (off)"],
280                 DisplayPinyin: ["Pinyin", "Display pinyin word while practicing"],
281                 DisplayChar: ["Characters", "Display chinese characters if they are available"],
282                 DisplayTrans: ["Translation", "Display translation if available"],
283                 SaveAudio: ["Save Audio", "Store the recordings in a directory (last version of each pinyin word is kept)"],
284                 ExportAudio: ["Export", "Export stored recordings"],
285                 ImportAudio: ["Import", "Import recordings to storage"],
286                 DeleteAudio: ["Delete", "Delete recordings in storage"],
287                 NewCollection: ["New", "Name of new collection of recordings"],
288                 ListPerf: ["Performance", "Show performance during this session"],
289                 FactoryReset: ["Factory Reset", "Reset to original settings and delete all data"],
290                 },
291                         
292         JA: {
293                 Wordlists: ["単語表", "単語表"],
294                 WordlistCaption: ["単語表", "単語表を変更します。"],
295                 SelectWords: ["単語の選択", "練習で使う単語を選択します"],
296                 WordlistUp: ["戻る", "一つ前の単語表に戻ります。"],
297                 WordlistDown: ["次へ", "次の単語表に進みます。"],
298                 ShuffleLists: ["シャッフル", "オンにすると単語表はシャッフルされ、オフなら元の順序が維持されます。"],
299                 AdaptiveLists: ["順応モード", "二回以内で合格できなかった単語だけ表示されるようになります。"],
300                 UseSoundExample: ["実音声", "オンでかつ実音声が用意されていれば実音声を例として使用し、そうでないなら合成音声を使用します。"],
301                 Synthesis_eSpeak: ["合成音声", "合成音声を例として使用します(eSpeakが必要です:www.espeak.org)。"],
302                 Voice: ["声質> ---", "合成音声の声質を選択"],
303                 Recognition: ["中国語レベル", "上級者や母語者レベルに設定できます。"],
304                 StrictPost: ["レベル", "発音チェックの厳しさを設定します(レベル0-3)。最高レベルでは非常に厳しい基準でチェックされます。"],      
305                 RecordingTimePost: ["(秒)", "録音時間の秒数"],
306                 OpenWordlist: ["単語表読み込み", "単語表を選択し読み込みます"],
307                 DeleteWordlist: ["単語表削除", "単語表を消去します。“y”キーを押して確定して下さい"],
308                 DeleteWordlistConfirm: ["削除確認", "本当に削除しますか?"],
309                 Credits: ["SGC3 について", "SpeakGoodChineseについての基本情報を表示します。"],
310                 DisplayNumbers: ["声調番号 u", "オンにすると練習画面で声調番号が表示され、オフにすると声調符号が表示されます。"],
311                 DisplayPinyin: ["ピンイン P", "練習画面でピンインを表示します。"],
312                 DisplayChar: ["漢字 C", "可能ならば練習画面で漢字を表示します。"],
313                 DisplayTrans: ["翻訳 T", "可能ならば練習画面で単語の意味を表示します。"],
314                 SaveAudio: ["録音の保存", "録音データをディレクトリに保存します(各単語の最後の発音を保存)。"],
315                 ExportAudio: ["輸出する", "エクスポート保存された録音"],
316                 ImportAudio: ["輸入する", "オーディオ録音をインポートします"],
317                 DeleteAudio: ["削除する", "Delete recordings in storage"],
318                 NewCollection: ["新", "Name of new collection of recordings"],
319                 ListPerf: ["発音練習結果", "発音練習の結果を表示します。"],
320                 FactoryReset: ["ワイプとリセット", "Reset to original settings and delete all data"],
321                 },
322                 
323         DE: {
324                 Wordlists: ["Wortlisten", "Wortlisten"],
325                 WordlistCaption: ["Wordliste", "Ändere Wordliste"],
326                 SelectWords: ["Wörter", "Wähle die Wörter zum üben"],
327                 WordlistUp: ["vorige", "Zur voriger Liste"],
328                 WordlistDown: ["nächste", "Zur nächster Liste"],
329                 ShuffleLists: ["Shuffle", "Shuffle Wörter in Wortlisten (ein) oder eine feste Reihenvolge (aus)"],
330                 AdaptiveLists: ["Adaptiv", "Üben Sie nur Wörter die mehr als zwei Versuchen erforderten"],
331                 UseSoundExample: ["Audio Vorbild", "Gebrauche echte Aufnahmen zum Vorbild wenn anwesend (ein) oder synthetische Töne (aus)"],
332                 Synthesis_eSpeak: ["Synthese", "Gebrauche eine synthetische Stimme zum Vorbild (Sie gebrauchen eSpeak: www.espeak.org)"],
333                 Voice: ["Stimme> ---", "Wähle eine synthetische Stimme"],
334                 Recognition: ["Sprachkenntnisse", "Einstellung für fortgeschrittene Studenten"],
335                 StrictPost: ["Stufe", "Wie preziese die Aussprache der Töne geprüft wird (Stufe 0-3). Die högste Stufe fordert eine preciese Aussprage"],
336                 RecordingTimePost: ["(sec)", "Aufnahmezeit in Secunden"],
337                 OpenWordlist: ["Öfne Liste", "Wähle und öfne eine einzige Wortliste"],
338                 DeleteWordlist: ["Lössche Liste", "Lössche die Wortliste. Sie werden gefragd das Lösschen zu bestätigen."],
339                 DeleteWordlistConfirm: ["Sicher?", "Sind Sie sicher?"],
340                 Credits: ["über SGC3", "Informationen zur SpeakGoodChinese"],
341                 DisplayNumbers: ["Ton Zahlen", "Wiedergabe Pinyin mit zahlen der Töne (einn) oder symbole (aus)"],
342                 DisplayPinyin: ["Pinyin", "Wiedergabe Pinyin wörte während der Übungen"],
343                 DisplayChar: ["Schriftzeichen", "Wiedergabe chinesische Schriftzeichen wenn anwesend"],
344                 DisplayTrans: ["Übersetzung", "Übersetzung wenn anwesend"],
345                 SaveAudio: ["Audio", "Aufnahmen speichern in ein Verzeichnis (letste Aufnahme jedes pinyin Wort)"],
346                 ExportAudio: ["Exportiere", "Exportiere gespeicherte Aufnahmen"],
347                 ImportAudio: ["Importiere", "Importiere Aufnahmen"],
348                 DeleteAudio: ["Lössche", "Lössche Aufnahmen"],
349                 NewCollection: ["Neu", "Name einer neuen Collection von Aufnahmen"],
350                 ListPerf: ["Ergebnisse", "Ergebnisse dieser Sitzung zeigen"],
351                 FactoryReset: ["Werksreset", "Originaleinstellungen wiederherstellen und all Daten lösschen"],
352                 },              
353         NL: {
354                 Wordlists: ["Woordenlijsten", "Woordenlijsten"],
355                 WordlistCaption: ["Woordenlijst", "Andere woordenlijst"],
356                 SelectWords: ["Woorden", "Kies de woorden om te oefenen"],
357                 WordlistUp: ["Vorige", "Vorige woordenlijst"],
358                 WordlistDown: ["Volgende", "Volgende woordenlijst"],
359                 ShuffleLists: ["Woorden mixen", "Gebruik elke keer een andere volgorde van de woorden"],
360                 AdaptiveLists: ["Adaptief", "Oefen alleen woorden waarvoor meer dan twee pogingen nodig waren"],
361                 UseSoundExample: ["Spraakvoorbeeld", "Laat echte spraakopnamen (aan) of kunstmatige tonen (uit) horen als voorbeeld"],
362                 Synthesis_eSpeak: ["Synthese", "Gebruik een synthetische stem als voorbeeld (u genbruikt eSpeak: www.espeak.org)"],
363                 Voice: ["Stem> ---", "Kies een synthetische stem"],
364                 Recognition: ["Taalniveau", "Stel de herkenner in op gevorderde of moedertaal sprekers"],
365                 StrictPost:     ["Niveau", "Hoe strikt de uitspraak van de tonen gecontroleerd wordt (Niveau 0-3). Het hoogste niveau is strikt."],
366                 RecordingTimePost: ["(sec)", "Opnametijd in seconden"],
367                 OpenWordlist: ["Open Lijst", "Selecteer en lees een enkele woordlijst"],
368                 DeleteWordlist: ["Verwijder Lijst", "Verwijder de getoonde woordlijst permanent. U wordt gevraagd deze actie te bevestigen."],
369                 DeleteWordlistConfirm: ["Heel zeker?", "Bent u zeker dat u door wilt gaan?"],
370                 Credits: ["Over SGC3", "Informatie over SpeakGoodChinese"],
371                 DisplayNumbers: ["Toon Cijfers", "Laat toon nummers (aan) of toon symbolen (uit) zien"],
372                 DisplayPinyin: ["Pinyin", "Laat pinyin zien"],
373                 DisplayChar: ["Karakters", "Laat Chinese karakters zien als ze beschikbaar zijn"],
374                 DisplayTrans: ["Vertaling", "Geef vertaling al die beschikbaar is"],
375                 SaveAudio: ["Bewaar Audio", "Bewaar opnamen in een map (laatste versie van ieder pinyin woord)"],
376                 ExportAudio: ["Exporteer", "Exproteer de opgeslagen opnamen"],
377                 ImportAudio: ["Importeer", "Importeer opnamen naar opslag"],
378                 DeleteAudio: ["Verwijder", "Verwijder opnamen"],
379                 NewCollection: ["Nieuw", "Naam van nieuwe opnamengroep"],
380                 ListPerf: ["Resultaten", "Toon de resultaten van deze sessie"],
381                 FactoryReset: ["Wis alles", "Zet terug naar originele instellingen en verwijder alle data"],
382                 }
386 function getRegister () {
387         var index = document.getElementById("Register").selectedIndex;
388         var value = document.getElementById("Register").options[index].value;
389         if (index <= 0) value = 249;
390         return value;
393 function setRegister (value) {
394         for(var x = 0; x < document.getElementById("Register").options.length; ++ x) {
395                 if (document.getElementById("Register").options[x].value == value) {
396                         document.getElementById("Register").selectedIndex = x;
397                 };
398         };
401 var selector_tables = {
402         ZH: {
403                 Language: ["语言", "选择页面的显示语言。"],
404                 Register:       ["您的声音", "设置您的声音类型。"],
405                 Register_350:   ["女性 高 W", "如果发音人为女性且声音较高,那么选择此项。"],
406                 Register_300:   ["女性 中 i", "如果发音人为女性且声音高度适中,那么选择此项。"],
407                 Register_250:   ["女性 低 o", "如果发音人为女性且声音较低,那么选择此项。"],
408                 Register_249:   ["男性 高 M", "如果发音人为男性且声音较高,那么选择此项。"],
409                 Register_180:   ["男性 中 a", "如果发音人为男性且声音高度适中,那么选择此项。"],
410                 Register_150:   ["男性 低 L", "如果发音人为男性且声音较低,那么选择此项。"],
411                 Register_125:   ["男性 超低", "如果发音人为男性且声音很低,那么选择此项。"],
412                 Strict: ["水平", "进行审查发音时所使用的严格度(水平0-3)。水平最高时对发音的要求会非常严格。"],
413                 RecordingTime: ["记录", "录音时间(秒)"],
414                 AudioName: ["保存", "录音保存的位置。"],
415                 },
416         EN: {
417                 Language: ["Language", "Select a language"],
418                 Register: ["Your Voice", "Select the category that fits your voice"],
419                 Register_350: ["Woman High", "Pick this if you are a female with a high voice"],
420                 Register_300: ["Woman Mid", "Pick this if you are a female with a mid-range voice"],
421                 Register_250: ["Woman Low", "Pick this if you are a female with a low voice"],
422                 Register_249: ["Man High", "Pick this if you are a male with a high voice"],
423                 Register_180: ["Man Mid", "Pick this if you are a male with a mid-range voice"],
424                 Register_150: ["Man Low", "Pick this if you are a male with a low voice"],
425                 Register_125: ["Man Xtr Low", "Pick this if you are a male with a very low voice"],
426                 Strict: ["Level", "How strict tone pronunciation will be checked (Level 0-3). The highest level is quite strict."],     
427                 RecordingTime: ["Recording", "Time of recording in seconds"],
428                 AudioName: ["Archive", "Name of the active recording session"],
429                 },
430         JA: {
431                 Language: ["言語", "表示言語を設定します。"],
432                 Register:       ["発話者の声", "発話者の声のカテゴリーを設定します。"],
433                 Register_350:   ["女性 高め W", "発話者が女性でかつ声が高めのとき選択します。"],
434                 Register_300:   ["女性 中間 i", "発話者が女性でかつ声が中間の高さのとき選択します。"],
435                 Register_250:   ["女性 低め o", "発話者が女性でかつ声が低めのとき選択します。"],
436                 Register_249:   ["男性 高め M", "発話者が男性でかつ声が高めのとき選択します。"],
437                 Register_180:   ["男性 中間 a", "発話者が男性でかつ声が中間の高さのとき選択します。"],
438                 Register_150:   ["男性 低め L", "発話者が男性でかつ声が低めのとき選択します。"],
439                 Register_125:   ["男性 更に低め", "発話者が男性でかつ声が更に低めのとき選択します。"],
440                 Strict: ["レベル", "発音チェックの厳しさを設定します(レベル0-3)。最高レベルでは非常に厳しい基準でチェックされます。"],  
441                 RecordingTime: ["録音", "録音時間の秒数"],
442                 AudioName: ["アーカイブ", "現在の録音セッションの名前です。"],
443                 },
444         DE: {
445                 Language: ["Sprache", "Wähle die gewünschte Sprache"],
446                 Register:       ["Ihre Stimme", "Wähle die Category die past bei Ihrer Stimme"],
447                 Register_350:   ["Frau hoch", "Wähle diesen Knopf wenn Sie eine Frau mit eine hohe Stimme sind"],
448                 Register_300:   ["Frau mittel", "Wähle diesen Knopf wenn Sie eine Frau mit eine mittel-hohe Stimme sind"],
449                 Register_250:   ["Frau tief", "Wähle diesen Knopf wenn Sie eine Frau mit eine tiefe Stimme sind"],
450                 Register_249:   ["Man hoch", "Wähle diesen Knopf wenn Sie ein Mann mit eine hohe Stimme sind"],
451                 Register_180:   ["Man mittel", "Wähle diesen Knopf wenn Sie ein Mann mit eine mittle-hohe Stimme sind"],
452                 Register_150:   ["Man tief", "Wähle diesen Knopf wenn Sie ein Mann mit eine tiefe Stimme sind"],
453                 Register_125:   ["Man Xtr tief", "Wähle diesen Knopf  wenn Sie ein Mann mit eine sehr tiefe Stimme sind"],
454                 Strict: ["Stufe", "Wie preziese die Aussprache der Töne geprüft wird (Stufe 0-3). Die högste Stufe fordert eine preciese Aussprage"],
455                 RecordingTime: ["Aufnahme", "Aufnahmezeit in Secunden"],
456                 AudioName: ["Aufbewahren", "Name der aktieven Aufzeichnungssitzung"],
457                 },
458         NL: {
459                 Language: ["Taal", "Selecteer de gewenste taal"],
460                 Register:       ["Uw Stem", "Kies de categorie die past bij uw stem"],
461                 Register_350:   ["Vrouw Hoog", "Kies dit als u een vrouw bent met een hoge stem"],
462                 Register_300:   ["Vrouw Mid", "Kies dit als u een vrouw bent met een middel-hoge stem"],
463                 Register_250:   ["Vrouw Laag", "Kies dit als u een vrouw bent met een lage stem"],
464                 Register_249:   ["Man Hoog", "Kies dit als u een man bent met een hoge stem"],
465                 Register_180:   ["Man Mid", "Kies dit als u een man bent met een middel-lage stem"],
466                 Register_150:   ["Man Laag", "Kies dit als u een man bent met een lage stem"],
467                 Register_125:   ["Man Xtr Laag", "Kies dit als u een man bent met een zeer lage stem"],
468                 Strict: ["Niveau", "Hoe strikt de uitspraak van de tonen gecontroleerd wordt (Niveau 0-3). Het hoogste niveau is strikt."],
469                 RecordingTime: ["Opname", "Opnametijd in seconden"],
470                 AudioName: ["Bewaren", "Naam van de actieve opnamesessie"],
471                 },
474 var language_table = {
475         Language_ZH: ["汉语", "汉语版"],
476         Language_EN: ["English", "English language version"],
477         Language_JA: ["日本語", "日本語版"],
478         Language_DE: ["Deutsch", "Deutsche Version"],   
479         Language_NL: ["Nederlands", "Gebruik Nederlands"]       
482 if(!mainpage_tables[userLanguage]) {
483         userLanguage = undefined;
487 var feedback_tables = {
488         ZH: {
489                 Cancel: "取消",
490                 Continue: "继续",
491                 Next: ">",
492                 Previous: "<",
493                 Apply: "应用•",
494                 Clear: "清空",
495                 All: "全部",
496                 Show: "显示单词",
497                 Part: "部分",
498                 Tones: "声调",
499                 InstallUnzip: "只有安装了7-zip(7-zip.org)软件后,才可以读出zip压缩形式的.sgc文件。",
500                 AddWordlist: "导入单词表",
501                 SelectWordlist: "单词表",
502                 },
503         EN: {
504                 Cancel: "Cancel",
505                 Continue: "Continue",
506                 Next: ">",
507                 Previous: "<",
508                 Apply: "Apply•",
509                 Clear: "Clear",
510                 All: "All",
511                 Show: "Show word",
512                 Part: "Part",
513                 Tones: "Tones",
514                 InstallUnzip: "Files with .sgc en .zip extensions can only be read when you have installed the 7-Zip application (7-zip.org)",
515                 AddWordlist: "Add words from wordlist",
516                 SelectWordlist: "Switch to other wordlist",
517                 },
518         JA: {
519                 Cancel: "取り消し",
520                 Continue: "継続",
521                 Next: ">",
522                 Previous: "<",
523                 Apply: "適用•",
524                 Clear: "クリア",
525                 All: "全部",
526                 Show: "単語を表示",
527                 Part: "部分",
528                 Tones: "声調",
529                 InstallUnzip: "zipで圧縮されている.sgc形式のファイルは7-zip(7-zip.org)がインストールされているときにだけ読み込みことができます。",
530                 AddWordlist: "単語表から単語を追加します",
531                 SelectWordlist: "単語表",
532                 },
533         DE: {
534                 Cancel: "Zurück",
535                 Continue: "Weiter",
536                 Next: ">",
537                 Previous: "<",
538                 Apply: "Anwenden•",
539                 Clear: "Löschen",
540                 All: "Alles",
541                 Show: "Zeige Wort",
542                 Part: "Teil",
543                 Tones: "Töne",
544                 InstallUnzip: "Dateien mit der .sgc und .zip Erweiterung können nur gebraucht werden wenn sie das 7-Zip Programm installiert haben (7-zip.org)",
545                 AddWordlist: "Wörter aus Wortliste hinzufügen",
546                 SelectWordlist: "Wähle andere Wortliste",
547                 },
548         NL: {
549                 Cancel: "Terug",
550                 Continue: "Verder",
551                 Next: ">",
552                 Previous: "<",
553                 Apply: "Toepassen•",
554                 Clear: "Wissen",
555                 All: "Alles",
556                 Show: "Woord laten zien",
557                 Part: "Onderdeel",
558                 Tones: "Tonen",
559                 InstallUnzip: "Files met .sgc en .zip kunt u alleen lezen als u de 7-Zip applicatie geinstalleerd hebt (7-zip.org)",
560                 AddWordlist: "Woorden uit woordenlijst toevoegen",
561                 SelectWordlist: "Ga naar andere woordenlijst",
562         },
565 var toneFeedback_tables = {
566         ZH: {
567                 Correct: "正确",
568                 Wrong: "错误",
569                 Long: "%%(first two tones)%",
570                 NoSound: "没有录到任何声音。",
571                 Low: "声音过低,无法识别(请检查声音设置是否准确)。",
572                 High: "声音过高,但仍能识别(请检查声音设置是否准确)。",
573                 Narrow: "音高变化太小,无法识别。",
574                 Wide: "音高变化太大,但仍能识别。",
575                 t6: "无法识别此类声调。",
576                 t1: "一声是即高又平的声调。",
577                 t2: "二声是从中间高度开始一直上升的声调。",
578                 t3: "三声是从中间高度开始先降后升的声调。",
579                 t4: "四声是从高处一直下降的声调。",
580                 t0: "轻声是从前一个声调的结尾处开始延续。",
581                 t11: "读一声时,注意让声调保持既高又平。",
582                 t12: "二声是从中间高度开始一直上升的声调。",
583                 t13: "三声是从中间高度开始先降后升的声调。",
584                 t14: "四声是从高处一直下降的声调。",
585                 t10: "轻声是从前一个声调的结尾处开始延续。",
586                 t21: "读一声时,注意让声调保持既高又平。",
587                 t22: "二声是从中间高度开始一直上升的声调。",
588                 t23: "三声是从中间高度开始先降后升的声调。",
589                 t24: "四声是从高处一直下降的声调。",
590                 t20: "轻声是从前一个声调的结尾处开始延续。",
591                 t31: "读一声时,注意让声调保持既高又平。",
592                 t32: "二声是从中间高度开始一直上升的声调。",
593                 t33: "应该读成类似二声+三声组合的发音。",
594                 t34: "四声是从高处一直下降的声调。",
595                 t30: "轻声是从前一个声调的结尾处开始延续。",
596                 t41: "读一声时,注意让声调保持既高又平。",
597                 t42: "二声是从中间高度开始一直上升的声调。",
598                 t43: "三声是从中间高度开始先降后升的声调。",
599                 t44: "四声是从高处一直下降的声调。",
600                 t40: "轻声是从前一个声调的结尾处开始延续。",
601                 },
602         EN: {
603                 Correct: "Correct",
604                 Wrong: "Wrong",
605                 Long: "%%(first two tones)%",
606                 NoSound: "No sound recorded",
607                 Low: "Your tones were too low to be recognized (is you voice setting correct?)",
608                 High: "Your tones were too high but might be recognizable (is you voice setting correct?)",
609                 Narrow: "Your tone movements were too flat to be recognized",
610                 Wide: "Your tone movements were too wide but might be recognizable",
611                 t6: "Not a recognizable tone",
612                 t1: "The first tone is high and flat",
613                 t2: "The second tone starts mid-range and goes up",
614                 t3: "The third tone starts mid-range goes down and then up",
615                 t4: "The fourth tone starts high and goes down all the way",
616                 t0: "The neutral tone continues where the previous tone stops",
617                 t11: "Keep the tones high and flat",
618                 t12: "The second tone starts mid-range and goes up",
619                 t13: "The third tone starts mid-range goes down and then up",
620                 t14: "The fourth tone starts high and goes down all the way",
621                 t10: "The neutral tone continues where the previous tone stops",
622                 t21: "Keep the first tone high and flat",
623                 t22: "The second tone starts mid-range and goes up",
624                 t23: "The third tone starts mid-range goes down and then up",
625                 t24: "The fourth tone starts high and goes down all the way",
626                 t20: "The neutral tone continues where the previous tone stops",
627                 t31: "Keep the first tone high and flat",
628                 t32: "The second tone starts mid-range and goes up",
629                 t33: "Pronounce as a 2-3 combination",
630                 t34: "The fourth tone starts high and goes down all the way",
631                 t30: "The neutral tone continues where the previous tone stops",
632                 t41: "Keep the first tone high and flat",
633                 t42: "The second tone starts mid-range and goes up",
634                 t43: "The third tone starts mid-range goes down and then up",
635                 t44: "The fourth tone starts high and goes down all the way",
636                 t40: "The neutral tone continues where the previous tone stops",
637                 },
638         JA: {
639                 Correct: "正しい",
640                 Wrong: "間違い",
641                 Long: "%%(first two tones)%",
642                 NoSound: "音が録音されませんでした。",
643                 Low: "声が低すぎるため認識できません(声の高さ設定が正しいか確認して下さい)。",
644                 High: "認識は可能ですが、声が高すぎます(声の高さ設定が正しいか確認して下さい)。",
645                 Narrow: "声の高さの変化がほとんどないため認識できません。",
646                 Wide: "認識は可能ですが、声の変化の幅が大きすぎます。",
647                 t6: "認識可能な声調ではありません。",
648                 t1: "一声は高くかつ平らです。",
649                 t2: "二声は真ん中の高さから始まり上昇します。",
650                 t3: "三声は真ん中の高さから始まり一度下がってまた上昇します。",
651                 t4: "四声は高めから始まり下がり続けます。",
652                 t0: "軽声は一つ前の声調の終了点から継続されます。",
653                 t11: "一声ではピッチを高くかつ平らに維持して下さい。",
654                 t12: "二声は真ん中の高さから始まり上昇します。",
655                 t13: "三声は真ん中の高さから始まり一度下がってまた上昇します。",
656                 t14: "四声は高めから始まり下がり続けます。",
657                 t10: "軽声は一つ前の声調の終了点から継続されます。",
658                 t21: "一声ではピッチを高くかつ平らに維持して下さい。",
659                 t22: "二声は真ん中の高さから始まり上昇します。",
660                 t23: "三声は真ん中の高さから始まり一度下がってまた上昇します。",
661                 t24: "四声は高めから始まり下がり続けます。",
662                 t20: "軽声は一つ前の声調の終了点から継続されます。",
663                 t31: "一声ではピッチを高くかつ平らに維持して下さい。",
664                 t32: "二声は真ん中の高さから始まり上昇します。",
665                 t33: "二声+三声のように発音します。",
666                 t34: "四声は高めから始まり下がり続けます。",
667                 t30: "軽声は一つ前の声調の終了点から継続されます。",
668                 t41: "一声ではピッチを高くかつ平らに維持して下さい。",
669                 t42: "二声は真ん中の高さから始まり上昇します。",
670                 t43: "三声は真ん中の高さから始まり一度下がってまた上昇します。",
671                 t44: "四声は高めから始まり下がり続けます。",
672                 t40: "軽声は一つ前の声調の終了点から継続されます。",
673                 },
674         DE: {
675                 Correct: "Richtig",
676                 Wrong: "Falsch",
677                 Long: "%%(erste zwei Töne)%",
678                 NoSound: "Kein Ton aufgezeichnet",
679                 Low: "Ihre Töne waren zu niedrig, um erkennt zu werden (ist ihre Stimme richtig eingestellt?)",
680                 High: "Ihre Töne waren zu hoch, aber vielleicht zu erkennen (ist ihre Stimme richtig eingestellt?)",
681                 Narrow: "Ihre Tonbewegungen waren zu flach, um erkennt werden",
682                 Wide: "Ihre Tonbewegungen waren zu weidläufig, aber vielleicht erkennbar",
683                 t6: "kein erkennbarer Ton",
684                 t1: "Der erster Ton ist hoch und flach",
685                 t2: "Der zweiter Ton beginnt mittel-hoch und geht nach oben",
686                 t3: "Der dritter Ton beginnt mittel-hoch geht nach unten und dann nach oben",
687                 t4: "Der vierter Ton beginnt hoch und geht den ganzen Weg",
688                 t0: "Der neutraler Ton geht weiter, wo der voriger Ton aufhört",
689                 t11: "Halten Sie die Töne hoch und flach",
690                 t12: "Der zweiter Ton beginnt mittel-hoch und geht nach oben",
691                 t13: "Der dritter Ton beginnt mittel-hoch geht nach unten und dann nach oben",
692                 t14: "Der vierter Ton beginnt hoch und geht gans nach unten",
693                 t10: "Der neutraler Ton weiter, wo der voriger Ton aufhört",
694                 t21: "Halten Sie den ersten Ton hoch und flach",
695                 t22: "Der zweiter Ton beginnt mittel-hoch und geht nach oben",
696                 t23: "Der dritter Ton beginnt mittel-hoch geht nach unten und dann nach oben",
697                 t24: "Der vierter Ton beginnt hoch und geht gans nach unten",
698                 t20: "Der neutraler Ton weiter, wo der voriger Ton aufhört",
699                 t31: "Halten Sie den ersten Ton hoch und flach",
700                 t32: "Der zweiter Ton beginnt mittel-hoch und geht nach oben",
701                 t33: "Sprechen wie eine 2-3 Kombination",
702                 t34: "Der vierte Ton beginnt hoch und geht gans nach unten",
703                 t30: "Der neutraler Ton weiter, wo der voriger Ton aufhört",
704                 t41: "Halten Sie den ersten Ton hoch und flach",
705                 t42: "Der zweiter Ton beginnt mittel-hoch und geht nach oben",
706                 t43: "Der dritter Ton beginnt mittel-hoch geht nach unten und dann nach oben",
707                 t44: "Der vierter Ton beginnt hoch und geht ganz nach unten,",
708                 t40: "Der neutraler Ton weiter, wo der voriger Ton aufhört",
709                 },
710         NL: {
711                 Correct: "Goed",
712                 Wrong: "Fout",
713                 Long: "%%(eerste twee tonen)%",
714                 NoSound: "Geen geluid opgenomen",
715                 Low: "Uw tonen waren te laag uitgesproken om herkend te worden (is uw stem juist ingesteld?)",
716                 High: "Uw tonen waren te hoog uitgesproken maar misschien toch herkenbaar (is uw stem juist ingesteld?)",
717                 Narrow: "Uw toonbewegingen ware te vlak om herkend te worden",
718                 Wide: "Uw toonbewegingen waren overdreven maar misschien toch herkenbaar",
719                 t6: "Geen herkenbare toon",
720                 t1: "De eerste toon is hoog en vlak",
721                 t2: "De tweede toon begint in het midden en gaat omhoog",
722                 t3: "De derde toon begin in het midden, gaat helemaal omlaag en dan omhoog",
723                 t4: "De vierde toon begint hoog en gaat helemaal naar beneden",
724                 t0: "De neutrale toon gaat ongeveer verder waar de vorige toon stopt",
725                 t11: "Houd de tonen hoog en vlak",
726                 t12: "De tweede toon begint in het midden en gaat omhoog",
727                 t13: "De derde toon begin in het midden, gaat helemaal omlaag en dan omhoog",
728                 t14: "De vierde toon begint hoog en gaat helemaal naar beneden",
729                 t10: "De neutrale toon gaat ongeveer verder waar de vorige toon stopt",
730                 t21: "De eerste toon is hoog en vlak",
731                 t22: "De tweede toon begint in het midden en gaat omhoog",
732                 t23: "De derde toon begin in het midden, gaat helemaal omlaag en dan omhoog",
733                 t24: "De vierde toon begint hoog en gaat helemaal naar beneden",
734                 t20: "De neutrale toon gaat ongeveer verder waar de vorige toon stopt",
735                 t31: "Houd de tonen hoog en vlak",
736                 t32: "De tweede toon begint in het midden en gaat omhoog",
737                 t33: "Spreek twee derde tonen uit als een tweede toon gevolgd door een derde",
738                 t34: "De vierde toon begint hoog en gaat helemaal naar beneden",
739                 t30: "De neutrale toon gaat ongeveer verder waar de vorige toon stopt",
740                 t41: "Houd de tonen hoog en vlak",
741                 t42: "De tweede toon begint in het midden en gaat omhoog",
742                 t43: "De derde toon begin in het midden, gaat helemaal omlaag en dan omhoog",
743                 t44: "De vierde toon begint hoog en gaat helemaal naar beneden",
744                 t40: "De neutrale toon gaat ongeveer verder waar de vorige toon stopt",
745         },
748 var evaluation_tables = {
749         ZH: {
750                 Pinyin: "拼音",
751                 Level: "水平",
752                 Total: "总计",
753                 Correct: "正确",
754                 Problematic: "存在问题",
755                 Tones: "声调",
756                 Wrong: "错误",
757                 High: "高",
758                 Low: "低",
759                 Wide: "宽",
760                 Narrow: "窄",
761                 Unknown: "未知",
762                 Commented: "评语",
763                 Time: "时间",
764                 Wordlist: "单词表",
765                 Performance: "发音练习的结果",
766                 Character: "汉字",
767                 ManualEntry: "手工输入要添加的单词",
768                 Example: "参考发音",
769                 Translation: "翻译",
770                 Grade: "成绩",
771                 G1: "1",
772                 G2: "2",
773                 G3: "3",
774                 G4: "4",
775                 G5: "5",
776                 G6: "6",
777                 G7: "7",
778                 G8: "8",
779                 G9: "9",
780                 G10: "10",
781                 Print: "打印",
782                 },
783         EN: {
784                 Pinyin: "Pinyin",
785                 Level: "Level",
786                 Total: "Total",
787                 Correct: "Correct",
788                 Problematic: "Problematic",
789                 Tones: "Tones",
790                 Wrong: "Wrong",
791                 High: "High",
792                 Low: "Low",
793                 Wide: "Wide",
794                 Narrow: "Narrow",
795                 Unknown: "Unknown",
796                 Commented: "Comm.",
797                 Time: "Time",
798                 Wordlist: "Wordlist",
799                 Performance: "Pronunciation practice results",
800                 Character: "Character",
801                 ManualEntry: "Manual entry",
802                 Example: "Example",
803                 Translation: "Translation",
804                 Grade: "Grade",
805                 G1: "1",
806                 G2: "2",
807                 G3: "3",
808                 G4: "4",
809                 G5: "5",
810                 G6: "6",
811                 G7: "7",
812                 G8: "8",
813                 G9: "9",
814                 G10: "10",
815                 Print: "Print",
816                 },
817         JA: {
818                 Pinyin: "ピンイン",
819                 Level: "レベル",
820                 Total: "合計",
821                 Correct: "正解",
822                 Problematic: "問題あり",
823                 Tones: "声調",
824                 Wrong: "間違い",
825                 High: "高い",
826                 Low: "低い",
827                 Wide: "広い",
828                 Narrow: "狭い",
829                 Unknown: "未知",
830                 Commented: "コメント",
831                 Time: "日時",
832                 Wordlist: "単語表",
833                 Performance: "発音練習結果",
834                 Character: "漢字",
835                 ManualEntry: "単語の手動入力",
836                 Example: "発音例",
837                 Translation: "翻訳",
838                 Grade: "達成",
839                 G1: "1",
840                 G2: "2",
841                 G3: "3",
842                 G4: "4",
843                 G5: "5",
844                 G6: "6",
845                 G7: "7",
846                 G8: "8",
847                 G9: "9",
848                 G10: "10",
849                 Print: "印刷",
850                 },
851         DE: {
852                 Pinyin: "Pinyin",
853                 Level: "Stufe",
854                 Total: "Total",
855                 Correct: " Richtig",
856                 Problematic: "Anmerkungen",
857                 Tones: "Töne",
858                 Wrong: "Falsch",
859                 High: "Hoch",
860                 Low: "Niedrich",
861                 Wide: "Weidläufig",
862                 Narrow: "Flach",
863                 Unknown: "Unbekannt",
864                 Commented: "Comm.",
865                 Time: "Zeit",
866                 Wordlist: "Wordliste",
867                 Performance: "Übungsergebnisse",
868                 Character: "Schriftzeichen",
869                 ManualEntry: "Manuelle Eingabe",
870                 Example: "Vorbild",
871                 Translation: "Übersetzung",
872                 Grade: "Note",
873                 G1: "1",
874                 G2: "2",
875                 G3: "3",
876                 G4: "4",
877                 G5: "5",
878                 G6: "6",
879                 G7: "7",
880                 G8: "8",
881                 G9: "9",
882                 G10: "10",
883                 Print: "Drücken",
884                 },
885         NL: {
886                 Pinyin: "Pinyin",
887                 Level: "Niveau",
888                 Total: "Totaal",
889                 Correct: "Goed",
890                 Problematic: "Aanmerkingen",
891                 Tones: "Tonen",
892                 Wrong: "Fout",
893                 High: "Hoog",
894                 Low: "Laag",
895                 Wide: "Overdreven",
896                 Narrow: "Vlak",
897                 Unknown: "Onbekend",
898                 Commented: "Opmerk.",
899                 Time: "Tijd",
900                 Wordlist: "Woordenlijst",
901                 Performance: "Oefenresultaten",
902                 Character: "Karakter",
903                 ManualEntry: "Handmatige invoer",
904                 Example: "Voorbeeld",
905                 Translation: "Vertaling",
906                 Grade: "Cijfer",
907                 G1: "1",
908                 G2: "2",
909                 G3: "3",
910                 G4: "4",
911                 G5: "5",
912                 G6: "6",
913                 G7: "7",
914                 G8: "8",
915                 G9: "9",
916                 G10: "10",
917                 Print: "Print",
918                 },
923  * GENERAL FUNCTIONS 
924  * 
925  */
927 // Read from CSV URL/File.
928 // This should handel processing in handleData!!!
929 var csvDelimiter = ';';
930 function readDelimitedTextFile (file, handleData, delimiter, name=false)
932         var url = file.name ? window.URL.createObjectURL(file) : file;
934         var rawFile = new XMLHttpRequest();
935         rawFile.open("GET", url, true);
936         rawFile.onreadystatechange = function ()
937         {
938                 if(rawFile.readyState === 4)
939                 {
940                         if(rawFile.status === 200 || rawFile.status == 0)
941                         {
942                                 var allText = rawFile.responseText;
943                                 handleData(file, allText, delimiter, name);
944                         }
945                 }
946         }
947         rawFile.send(null);
950 function processCSV (file, allText, delimiter, name=false) {
951         var del = delimiter? delimiter : csvDelimiter;
952         var allTextLines = allText.split(/\r\n|\n/);
953         // Delimiter is unknown, guess
954         if (del == "?") {
955                 del = "\t";
956                 if(allTextLines[0].match(/\t/)) {
957                         del = "\t";
958                 } else if(allTextLines[0].match(/;/)) {
959                         del = ";";
960                 } else if(allTextLines[0].match(/,/)) {
961                         del = ",";
962                 };
963         };
964         var lines = [];
965         for (var i=0; i<allTextLines.length; i++) {
966                 // Skip comments and empty lines
967                 if (! allTextLines[i].match(/^\s*#/) && allTextLines[i].match(/[\w]/)) {
968                         var data = allTextLines[i].split(del);
969                         var tarr = [];
970                         for (var j=0; j<data.length; j++) {
971                                 tarr.push(data[j]);
972                         }
973                 lines.push(tarr);
974                 };
975         }
976         return lines;
979 // Read and write tab-separated-values tables
980 function readCSV (file) {
981         var delimiter = csvDelimiter;
982         if (file.name.match(/\.(tsv|Table)\s*$/i)) {
983                 delimiter = "\t";
984         };
985         readDelimitedTextFile(file, processCSV, delimiter);