3 * Copyright (C) 2016 R.J.J.H. van Son (r.j.j.h.vanson@gmail.com)
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.
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.
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
19 var userLanguage = (navigator.language) ? navigator.language : navigator.userLanguage;
20 userLanguage = userLanguage.substr(0,2).toUpperCase();
22 function insert_and_update_options (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];
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];
43 selector.add(newOption);
50 function insert_and_update_simpleoptions (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];
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];
71 selector.add(newOption);
78 function set_mainpageLanguage (language) {
79 var labels = mainpage_tables[language];
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];
86 document.getElementById(x).textContent = labels[x][0];
87 document.getElementById(x).parentNode.parentNode.title = labels[x][1];
92 labels = selector_tables[language];
93 insert_and_update_options (labels);
95 labels = language_table;
96 insert_and_update_options (labels);
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;
105 localStorage.sgc3_language = JSON.stringify(language);
108 function set_configLanguage (language) {
109 var labels = config_tables[language];
111 if(document.getElementById(x)) {
112 document.getElementById(x).textContent = labels[x][0];
113 document.getElementById(x).parentNode.parentNode.title = labels[x][1];
117 labels = selector_tables[language];
118 insert_and_update_options (labels);
120 labels = language_table;
121 insert_and_update_options (labels);
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;
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);
150 function change_configLanguage () {
151 var index = document.getElementById("Language").selectedIndex;
153 var value = document.getElementById("Language").options[index].value;
154 userLanguage = value;
155 set_configLanguage (userLanguage);
157 set_configLanguage (userLanguage)
162 var mainpage_tables = {
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给出评分。"],
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"],
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の値で評価します。"],
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"],
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"],
230 var config_tables = {
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"],
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"],
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"],
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"],
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"],
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;
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;
401 var selector_tables = {
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: ["保存", "录音保存的位置。"],
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"],
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: ["アーカイブ", "現在の録音セッションの名前です。"],
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"],
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"],
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 = {
499 InstallUnzip: "只有安装了7-zip(7-zip.org)软件后,才可以读出zip压缩形式的.sgc文件。",
500 AddWordlist: "导入单词表",
501 SelectWordlist: "单词表",
505 Continue: "Continue",
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",
529 InstallUnzip: "zipで圧縮されている.sgc形式のファイルは7-zip(7-zip.org)がインストールされているときにだけ読み込みことができます。",
530 AddWordlist: "単語表から単語を追加します",
531 SelectWordlist: "単語表",
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",
556 Show: "Woord laten zien",
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",
565 var toneFeedback_tables = {
569 Long: "%%(first two tones)%",
570 NoSound: "没有录到任何声音。",
571 Low: "声音过低,无法识别(请检查声音设置是否准确)。",
572 High: "声音过高,但仍能识别(请检查声音设置是否准确)。",
573 Narrow: "音高变化太小,无法识别。",
574 Wide: "音高变化太大,但仍能识别。",
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: "轻声是从前一个声调的结尾处开始延续。",
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",
641 Long: "%%(first two tones)%",
642 NoSound: "音が録音されませんでした。",
643 Low: "声が低すぎるため認識できません(声の高さ設定が正しいか確認して下さい)。",
644 High: "認識は可能ですが、声が高すぎます(声の高さ設定が正しいか確認して下さい)。",
645 Narrow: "声の高さの変化がほとんどないため認識できません。",
646 Wide: "認識は可能ですが、声の変化の幅が大きすぎます。",
647 t6: "認識可能な声調ではありません。",
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: "軽声は一つ前の声調の終了点から継続されます。",
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",
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",
748 var evaluation_tables = {
765 Performance: "发音练习的结果",
767 ManualEntry: "手工输入要添加的单词",
788 Problematic: "Problematic",
798 Wordlist: "Wordlist",
799 Performance: "Pronunciation practice results",
800 Character: "Character",
801 ManualEntry: "Manual entry",
803 Translation: "Translation",
833 Performance: "発音練習結果",
835 ManualEntry: "単語の手動入力",
856 Problematic: "Anmerkungen",
863 Unknown: "Unbekannt",
866 Wordlist: "Wordliste",
867 Performance: "Übungsergebnisse",
868 Character: "Schriftzeichen",
869 ManualEntry: "Manuelle Eingabe",
871 Translation: "Übersetzung",
890 Problematic: "Aanmerkingen",
898 Commented: "Opmerk.",
900 Wordlist: "Woordenlijst",
901 Performance: "Oefenresultaten",
902 Character: "Karakter",
903 ManualEntry: "Handmatige invoer",
904 Example: "Voorbeeld",
905 Translation: "Vertaling",
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 ()
938 if(rawFile.readyState === 4)
940 if(rawFile.status === 200 || rawFile.status == 0)
942 var allText = rawFile.responseText;
943 handleData(file, allText, delimiter, name);
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
956 if(allTextLines[0].match(/\t/)) {
958 } else if(allTextLines[0].match(/;/)) {
960 } else if(allTextLines[0].match(/,/)) {
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);
970 for (var j=0; j<data.length; j++) {
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)) {
985 readDelimitedTextFile(file, processCSV, delimiter);