wangzhibo
2026-08-16 ae6f40460dcd56af6c5f60ba52c883854c3bac55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
package nodomain.freeyourgadget.gadgetbridge.util.language;
 
import android.content.SharedPreferences;
 
import org.junit.Test;
 
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
 
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.test.TestBase;
import nodomain.freeyourgadget.gadgetbridge.util.language.impl.CzechTransliterator;
import nodomain.freeyourgadget.gadgetbridge.util.language.impl.ExtendedAsciiTransliterator;
import nodomain.freeyourgadget.gadgetbridge.util.language.impl.FlattenToAsciiTransliterator;
 
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TRANSLITERATION_LANGUAGES;
 
/**
 * Tests LanguageUtils
 */
public class LanguageUtilsTest extends TestBase {
 
    private GBDevice dummyGBDevice;
 
    @Override
    public void setUp() throws Exception {
        super.setUp();
        dummyGBDevice = createDummyGDevice("00:00:00:00:10");
    }
 
 
    @Test
    public void testStringTransliterateCyrillic() throws Exception {
        final Transliterator transliterator = LanguageUtils.getTransliterator("russian");
 
        // input with cyrillic and diacritic letters
        String input = "Прõсто текčт";
        String output = transliterator.transliterate(input);
        String result = "Prosto tekct";
 
        assertEquals("Transliteration failed", result, output);
    }
 
    @Test
    public void testStringTransliterateSerbian() throws Exception {
        final Transliterator transliterator = LanguageUtils.getTransliterator("serbian");
 
        final Map<String, String> tests = new LinkedHashMap<String, String>() {{
            put("Тхе qицк брон фоx јумпед овер тхе лаз* дог", "The qick bron fox jumped over the laz* dog");
            put("Српска ћирилица", "Srpska cirilica");
            put("Novak Đoković", "Novak Djokovic");
            put("Џ, Њ and Љ", "Dz, Nj and Lj");
            put("Љуљачка", "Ljuljacka");
            put("Наковањ", "Nakovanj");
            put("Качкаваљ", "Kackavalj");
            put("Чачак", "Cacak");
            put("Ч, ч", "C, c");
            put("Ћ, ћ", "C, c");
            put("Ж, ж", "Z, z");
            put("Ш, ш", "S, s");
            put("Ђ, ђ", "Dj, dj");
            put("Џ, џ", "Dz, dz");
            put("Њ, њ", "Nj, nj");
            put("Љ, љ", "Lj, lj");
        }};
 
        for (final Map.Entry<String, String> e : tests.entrySet()) {
            assertEquals("Transliteration failed for " + e.getKey(), e.getValue(), transliterator.transliterate(e.getKey()));
        }
    }
 
    @Test
    public void testStringTransliterateHebrew() throws Exception {
        final Transliterator transliterator = LanguageUtils.getTransliterator("hebrew");
 
        String input = "בדיקה עברית";
        String output = transliterator.transliterate(input);
        String result = "bdykh 'bryth";
 
        assertEquals("Transliteration failed", result, output);
    }
 
    @Test
    public void testStringTransliterateArabic() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("arabic");
 
        String pangram = "نص حكيم له سر قاطع وذو شأن عظيم مكتوب على ثوب أخضر ومغلف بجلد أزرق";
        String pangramExpected = "n9 7kym lh sr qa63 wthw sh2n 36'ym mktwb 3la thwb 259'r wm3'lf bjld 2zrq";
        String pangramActual = transliterator.transliterate(pangram);
        assertEquals("Arabic pangram transliteration failed", pangramExpected, pangramActual);
 
        String taMarbutah = "ﺓ";
        String taMarbutahExpected = "";
        String taMarbutahActual = transliterator.transliterate(taMarbutah);
        assertEquals("ta marbutah transliteration failed", taMarbutahExpected, taMarbutahActual);
 
        String hamza = "ءأؤإئآ";
        String hamzaExpected = "222222";
        String hamzaActual = transliterator.transliterate(hamza);
        assertEquals("hamza transliteration failed", hamzaExpected, hamzaActual);
 
        String easternArabicNumeralsArabic = "٠١٢٣٤٥٦٧٨٩";
        String easternArabicNumeralsExpected = "0123456789";
        assertEquals("Eastern Arabic numerals (Arabic) failed", easternArabicNumeralsExpected,
                transliterator.transliterate(easternArabicNumeralsArabic));
    }
 
    public void testStringTransliteratePersian() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("persian");
 
        String farsi = "گچپژ";
        String farsiExpected = "gchpzh";
        String farsiActual = transliterator.transliterate(farsi);
        assertEquals("Farsi transiteration failed", farsiExpected, farsiActual);
 
        String easternArabicNumeralsFarsi = "۰۱۲۳۴۵۶۷۸۹";
        String easternArabicNumeralsExpected = "0123456789";
 
        assertEquals("Eastern Arabic numerals (Farsi) failed", easternArabicNumeralsExpected,
                transliterator.transliterate(easternArabicNumeralsFarsi));
    }
 
    @Test
    public void testStringTransliterateBengali() throws Exception {
        final Transliterator transliterator = LanguageUtils.getTransliterator("bengali");
 
        // input with cyrillic and diacritic letters
        String[] inputs = {"অনিরুদ্ধ", "বিজ্ঞানযাত্রা চলছে চলবে।", "আমি সব দেখেশুনে ক্ষেপে গিয়ে করি বাঙলায় চিৎকার!",
                "আমার জাভা কোড is so bad! কী আর বলবো!"};
        String[] outputs = {"oniruddho", "biggaanJaatraa cholchhe cholbe.",
                "aami sob dekheshune kkhepe giye kori baanglaay chitkaar!",
                "aamaar jaabhaa koD is so bad! kii aar bolbo!"};
 
        String result;
 
        for (int i = 0; i < inputs.length; i++) {
            result = transliterator.transliterate(inputs[i]);
            assertEquals("Transliteration failed", outputs[i], result);
        }
    }
 
    @Test
    public void testStringTransliterateKorean() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("korean");
 
        // A familiar phrase with no special provisions.
        String hello = "안녕하세요";
        String helloExpected = "annyeonghaseyo";
        String helloActual = transliterator.transliterate(hello);
        assertEquals("Korean hello transliteration failed", helloExpected, helloActual);
 
        // Korean pangram. Includes some ASCII punctuation which should not be changed by
        // transliteration.
        //
        // Translation: "Chocolate!? What I wanted was some rice puffs and clothes." "Child, why are
        // you complaining again?"
        String pangram = "\"웬 초콜릿? 제가 원했던 건 뻥튀기 쬐끔과 의류예요.\" \"얘야, 왜 또 불평?\"";
        String pangramExpected = "\"wen chokollit? jega wonhaetdeon geon ppeongtwigi jjoekkeumgwa uiryuyeyo.\" \"yaeya, wae tto bulpyeong?\"";
        String pangramActual = transliterator.transliterate(pangram);
        assertEquals("Korean pangram transliteration failed", pangramExpected, pangramActual);
 
        // Several words excercising special provisions, from Wikipedia.
        String special = "좋고, 놓다, 잡혀, 낳지";
        String specialExpected = "joko, nota, japhyeo, nachi";
        String specialActual = transliterator.transliterate(special);
        assertEquals("Korean special provisions transliteration failed", specialExpected, specialActual);
 
        // Isolated jamo.
        String isolatedJamo = "ㅋㅋㅋ";
        String isolatedJamoExpected = "kkk";
        String isolatedJamoActual = transliterator.transliterate(isolatedJamo);
        assertEquals("Korean isolated jamo transliteration failed", isolatedJamoExpected, isolatedJamoActual);
 
        // Korean transliteration shouldn't touch non-Hangul composites.
        String german = "schön";
        String germanExpected = german;
        String germanActual = transliterator.transliterate(german);
        assertEquals("Korean transliteration modified a non-Hangul composite", germanExpected, germanActual);
    }
 
    @Test
    public void testStringTransliterateLatvian() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("latvian");
 
        String input = "ā č ē ģ ī ķ ļ ņ š ū ž Ā Č Ē Ģ Ī Ķ Ļ Ņ Š Ū Ž";
        String output = transliterator.transliterate(input);
        String expected = "a c e g i k l n s u z A C E G I K L N S U Z";
        assertEquals("latvian translation failed", expected, output);
 
        input = "aāa cčc eēe gģg iīi kķk lļl nņn sšs uūu zžz AĀA CČC EĒE GĢG IĪI KĶK LĻL NŅN SŠS UŪU ZŽZ";
        output = transliterator.transliterate(input);
        expected = "aaa ccc eee ggg iii kkk lll nnn sss uuu zzz AAA CCC EEE GGG III KKK LLL NNN SSS UUU ZZZ";
        assertEquals("latvian translation failed", expected, output);
    }
 
    @Test
    public void testStringTransliterateLithuanian() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("lithuanian");
 
        String input = "ą č ę ė į š ų ū ž";
        String output = transliterator.transliterate(input);
        String expected = "a c e e i s u u z";
        assertEquals("lithuanian translation failed", expected, output);
 
        input = "aąa cčc eęe eėe iįi sšs uųu uūu zžz";
        output = transliterator.transliterate(input);
        expected = "aaa ccc eee eee iii sss uuu uuu zzz";
        assertEquals("lithuanian translation failed", expected, output);
    }
 
    @Test
    public void testStringTransliterateGeorgian() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("georgian");
 
        String input = "ა ბ ტ თ ჟ ყ წ ჭ ჰ";
        String output = transliterator.transliterate(input);
        String expected = "a b t T J y w W h";
        assertEquals("georgian transliteration failed", expected, output);
    }
 
    @Test
    public void testStringTransliterateHungarian() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("hungarian");
 
        String input = "á é í ó ö ő ü ű";
        String output = transliterator.transliterate(input);
        String expected = "a e i o o o u u";
        assertEquals("hungarian transliteration failed", expected, output);
    }
 
    @Test
    public void testStringTransliterateCommonSymbols() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("common_symbols");
 
        String input = "© ® ™ ° « – » “ ” 〜 ² ³ ₅";
        String output = transliterator.transliterate(input);
        String expected = "(c) (r) (tm) * < - > \" \" ~ 2 3 5";
        assertEquals("common symbols translation failed", expected, output);
 
        input = "a©a b®b c™c d°d e«e f–f g»g h“h i”i j〜j k²k l³l m₅m";
        output = transliterator.transliterate(input);
        expected = "a(c)a b(r)b c(tm)c d*d e<e f-f g>g h\"h i\"i j~j k2k l3l m5m";
        assertEquals("common symbols translation failed", expected, output);
    }
 
    @Test
    public void testStringTransliterateCroatian() {
        final Transliterator transliterator = LanguageUtils.getTransliterator("croatian");
 
        String input = "č ć đ š ž";
        String output = transliterator.transliterate(input);
        String expected = "c c d s z";
        assertEquals("croatian transliteration failed", expected, output);
    }
 
    @Test
    public void testFlattenToAscii() throws Exception {
        final FlattenToAsciiTransliterator transliterator = new FlattenToAsciiTransliterator();
        String input = "ä ș ț ă fine";
        String output = transliterator.transliterate(input);
        String expected = "a s t a fine";
        assertEquals("flatten to ascii transliteration failed", expected, output);
    }
 
    @Test
    public void testMultitransliterator() throws Exception {
        final MultiTransliterator multiTransliterator = new MultiTransliterator(Arrays.asList(
                new CzechTransliterator(),
                new ExtendedAsciiTransliterator(),
                new FlattenToAsciiTransliterator()
        ));
        assertEquals("Zlutoucky kun upel \"dabelske\" \"ody\"", multiTransliterator.transliterate("Žluťoučký kůň úpěl »ďábelské« „ódy“"));
        assertEquals("300 Kc", multiTransliterator.transliterate("300\u00A0Kč"));
    }
 
    @Test
    public void testTransliterateOption() throws Exception {
        enableTransliteration(false);
        assertNull("Transliteration option fail! Expected 'Off' by default, but result is 'On'",
                getTransliteration());
 
        enableTransliteration(true);
        assertNotNull("Transliteration option fail! Expected 'On', but result is 'Off'", getTransliteration());
    }
 
    private void enableTransliteration(boolean enable) {
        SharedPreferences devicePrefs = GBApplication.getDeviceSpecificSharedPrefs(dummyGBDevice.getAddress());
        SharedPreferences.Editor editor = devicePrefs.edit();
        if (enable) {
            editor.putString(PREF_TRANSLITERATION_LANGUAGES, "extended_ascii,scandinavian,german,russian,hebrew,greek,ukranian,arabic,persian,lithuanian,polish,estonian,icelandic,czech,turkish,bengali,korean,georgian,croatian");
        } else {
            editor.remove(PREF_TRANSLITERATION_LANGUAGES);
        }
        editor.apply();
    }
 
    private Transliterator getTransliteration() {
        return LanguageUtils.getTransliterator(dummyGBDevice);
    }
}