diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fb58e1ae..a929cf7b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,6 +61,8 @@ To support a new language one needs to: - `hasABC` _(optional)_. Disables ABC mode for this language. Useful for languages where the writing system is not an alphabet, such as East Asian languages. Default: `yes`. - `hasSpaceBetweenWords` _(optional)_ set to `no` when the language does not use spaces between words. For example: Thai, Chinese, Japanese, Korean, and so on. The default is `yes`. - `hasUpperCase` _(optional)_ set to `no` when the language has no upper- and lowercase letters. For example: Arabic, Hebrew, East Asian languages, and so on. The default is `yes`. + - `iconABC` _(optional)_ is the name of the ABC icon for this language. The icon must be a Drawable resource in `app/src/main/res/drawable` folder. It must not include `.xml`. The icon will be shown in the system notification are when TT9 is in ABC mode and the respective option is on. + - `iconT9` _(optional)_ is the name of the Predictive mode icon for this language. Usage is similar to `iconABC`. - `name` _(optional)_ is automatically generated and equals the native name of the language (e.g. "English", "Deutsch", "Українська"). However, sometimes, the automatically selected name may be ambiguous. For example, both Portuguese in Portugal and Brazil will default to "Português", so assigning "Português brasileiro" would make it clear it's the language used in Brazil. - `numerals` _(optional)_ can be used to set a custom list of numerals. The list must contain exactly 10 characters equivalent to the digits from 0 to 9. For example, in Arabic you could use: `numerals: [٠,١,٢,٣,٤,٥,٦,٧,٨,٩]`. - `sounds` _(mandatory for non-alphabetic languages)_ is an array of elements in the format: `[sound,digits]`. It is used for East Asian or other languages where there are thousands of different characters, that can not be described in the layout property. `sounds` contains all possible vowel and consonant sounds and their respective digit combinations. There must be no repeating sounds. If a single Latin letter stands for a sound, the letter must be capital. If more than one letter is necessary to represent the sound, the first letter must be capital, while the rest must be small. For example, "A", "P", "Wo", "Ei", "Dd". The sounds are then used in the dictionary format with phonetic transcriptions. See `ChinesePinyin.yml` and `Korean.yml` and the respective dictionary files for an example. diff --git a/app/build-dictionaries.gradle b/app/build-dictionaries.gradle index c53e319c..77e86cc4 100644 --- a/app/build-dictionaries.gradle +++ b/app/build-dictionaries.gradle @@ -4,7 +4,7 @@ import java.util.zip.ZipOutputStream apply from: 'dictionary-tools.gradle' -ext.convertDictionaries = { definitionsInputDir, dictionariesInputDir, dictionariesOutputDir, dictionariesMetaDir -> +ext.convertDictionaries = { definitionsInputDir, dictionariesInputDir, dictionariesOutputDir, dictionariesMetaDir, iconsDir -> int errorCount = 0 def errorStream = fileTree(dir: definitionsInputDir).getFiles().parallelStream().map { definition -> @@ -12,7 +12,7 @@ ext.convertDictionaries = { definitionsInputDir, dictionariesInputDir, dictionar return "" } - def (_, sounds, prependSoundsToWords, noSyllables, locale, dictionaryFile, langFileErrorCount, langFileErrorMsg) = parseLanguageDefintion(definition, dictionariesInputDir) + def (_, sounds, prependSoundsToWords, noSyllables, locale, dictionaryFile, langFileErrorCount, langFileErrorMsg) = parseLanguageDefintion(definition, dictionariesInputDir, iconsDir) errorCount += langFileErrorCount if (!langFileErrorMsg.isEmpty()) { return langFileErrorMsg diff --git a/app/build.gradle b/app/build.gradle index 42d71b5c..977af9bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ tasks.register('validateLanguages') { outputs.dir LANGUAGE_VALIDATION_DIR doLast { - validateLanguageFiles(DEFINITIONS_INPUT_DIR, DICTIONARIES_INPUT_DIR, LANGUAGE_VALIDATION_DIR.get().asFile) + validateLanguageFiles(DEFINITIONS_INPUT_DIR, DICTIONARIES_INPUT_DIR, LANGUAGE_VALIDATION_DIR.get().asFile, ICONS_DIR) } } @@ -39,7 +39,7 @@ tasks.register('buildDictionaryDownloads') { mustRunAfter validateLanguages doLast { - convertDictionaries(DEFINITIONS_INPUT_DIR, DICTIONARIES_INPUT_DIR, DICTIONARIES_DOWNLOAD_DIR, DICTIONARY_META_OUTPUT_DIR) + convertDictionaries(DEFINITIONS_INPUT_DIR, DICTIONARIES_INPUT_DIR, DICTIONARIES_DOWNLOAD_DIR, DICTIONARY_META_OUTPUT_DIR, ICONS_DIR) } } diff --git a/app/constants.gradle b/app/constants.gradle index 0a97f17e..ca0e8f06 100644 --- a/app/constants.gradle +++ b/app/constants.gradle @@ -8,6 +8,7 @@ ext.DICTIONARIES_DOWNLOAD_DIR_NAME = 'downloads' ext.DICTIONARY_SIZES_DIR_NAME = 'dictionary-sizes' def APP_ROOT_DIR = "${project.rootDir}/app" +ext.ICONS_DIR = "${APP_ROOT_DIR}/src/main/res/drawable" def MAIN_ASSETS_DIR = "${APP_ROOT_DIR}/src/main/assets" def FULL_VERSION_ASSETS_DIR = "${APP_ROOT_DIR}/src/full/assets" diff --git a/app/languages/definitions/Arabic.yml b/app/languages/definitions/Arabic.yml index 48e88fe1..7db76128 100644 --- a/app/languages/definitions/Arabic.yml +++ b/app/languages/definitions/Arabic.yml @@ -1,6 +1,8 @@ locale: ar-JO currency: ﷼ dictionaryFile: ar-utf8.csv +iconABC: ic_lang_alifba +iconT9: ic_lang_ar abcString: أﺏﺕ hasUpperCase: no numerals: [٠,١,٢,٣,٤,٥,٦,٧,٨,٩] diff --git a/app/languages/definitions/BrazilianPortuguese.yml b/app/languages/definitions/BrazilianPortuguese.yml index eb4576b1..1b37825e 100644 --- a/app/languages/definitions/BrazilianPortuguese.yml +++ b/app/languages/definitions/BrazilianPortuguese.yml @@ -1,5 +1,7 @@ locale: pt-BR dictionaryFile: pt-BR-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_br name: Português / BR layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Bulgarian.yml b/app/languages/definitions/Bulgarian.yml index c003a606..debf6a40 100644 --- a/app/languages/definitions/Bulgarian.yml +++ b/app/languages/definitions/Bulgarian.yml @@ -1,5 +1,7 @@ locale: bg-BG dictionaryFile: bg-utf8.csv +iconABC: ic_lang_cyrillic +iconT9: ic_lang_bg layout: - [SPECIAL] # 0 - [PUNCTUATION_DE] # 1 diff --git a/app/languages/definitions/Catalan.yml b/app/languages/definitions/Catalan.yml index 249398e1..d504dfa5 100644 --- a/app/languages/definitions/Catalan.yml +++ b/app/languages/definitions/Catalan.yml @@ -1,5 +1,7 @@ locale: ca-ES dictionaryFile: ca-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_ca layout: - [SPECIAL] # 0 - [PUNCTUATION_FR, ·] # 1 diff --git a/app/languages/definitions/ChinesePinyin.yml b/app/languages/definitions/ChinesePinyin.yml index d16b2466..3aafe333 100644 --- a/app/languages/definitions/ChinesePinyin.yml +++ b/app/languages/definitions/ChinesePinyin.yml @@ -1,5 +1,6 @@ locale: zh-CN dictionaryFile: zh-pinyin.csv +iconT9: ic_lang_zh_pinyin name: 中文 / 简体 hasABC: no hasSpaceBetweenWords: no diff --git a/app/languages/definitions/Croatian.yml b/app/languages/definitions/Croatian.yml index 1752db1b..5cfb2e35 100644 --- a/app/languages/definitions/Croatian.yml +++ b/app/languages/definitions/Croatian.yml @@ -1,5 +1,7 @@ locale: hr-HR dictionaryFile: hr-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_hr layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Czech.yml b/app/languages/definitions/Czech.yml index 488bebcb..9edfcbc5 100644 --- a/app/languages/definitions/Czech.yml +++ b/app/languages/definitions/Czech.yml @@ -1,5 +1,7 @@ locale: cs-CZ dictionaryFile: cz-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_cz layout: - [SPECIAL] # 0 - [PUNCTUATION_DE] # 1 diff --git a/app/languages/definitions/Danish.yml b/app/languages/definitions/Danish.yml index b9f631d4..6f4af9d3 100644 --- a/app/languages/definitions/Danish.yml +++ b/app/languages/definitions/Danish.yml @@ -1,5 +1,7 @@ locale: da-DK dictionaryFile: da-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_da layout: - [SPECIAL] # 0 - [PUNCTUATION_FR] # 1 diff --git a/app/languages/definitions/Dutch.yml b/app/languages/definitions/Dutch.yml index e9863f21..ccec8c01 100644 --- a/app/languages/definitions/Dutch.yml +++ b/app/languages/definitions/Dutch.yml @@ -1,5 +1,7 @@ locale: nl-NL dictionaryFile: nl-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_nl layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/English.yml b/app/languages/definitions/English.yml index 9f32f427..7cc72991 100644 --- a/app/languages/definitions/English.yml +++ b/app/languages/definitions/English.yml @@ -1,5 +1,7 @@ locale: en dictionaryFile: en-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_en layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Estonian.yml b/app/languages/definitions/Estonian.yml index a128def2..521d6007 100644 --- a/app/languages/definitions/Estonian.yml +++ b/app/languages/definitions/Estonian.yml @@ -1,5 +1,7 @@ locale: et-EE dictionaryFile: et-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_et layout: - [SPECIAL] # 0 - [PUNCTUATION_DE] # 1 diff --git a/app/languages/definitions/Farsi.yml b/app/languages/definitions/Farsi.yml index cd2cf824..2ac2237a 100644 --- a/app/languages/definitions/Farsi.yml +++ b/app/languages/definitions/Farsi.yml @@ -1,6 +1,8 @@ locale: fa-IR currency: ﷼ dictionaryFile: fa-utf8.csv +iconABC: ic_lang_alifba +iconT9: ic_lang_fa abcString: أﺏﺕ hasUpperCase: no numerals: [۰,۱,۲,۳,۴,۵,۶,۷,۸,۹] diff --git a/app/languages/definitions/Finnish.yml b/app/languages/definitions/Finnish.yml index b53ea8da..12525680 100644 --- a/app/languages/definitions/Finnish.yml +++ b/app/languages/definitions/Finnish.yml @@ -1,5 +1,7 @@ locale: fi-FI dictionaryFile: fi-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_su layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/French.yml b/app/languages/definitions/French.yml index ff0a4e7c..12540808 100644 --- a/app/languages/definitions/French.yml +++ b/app/languages/definitions/French.yml @@ -1,5 +1,7 @@ locale: fr-FR dictionaryFile: fr-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_fr layout: - [SPECIAL] # 0 - [PUNCTUATION_FR] # 1 diff --git a/app/languages/definitions/German.yml b/app/languages/definitions/German.yml index fb05af52..342a6cf0 100644 --- a/app/languages/definitions/German.yml +++ b/app/languages/definitions/German.yml @@ -1,5 +1,7 @@ locale: de-DE dictionaryFile: de-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_de layout: - [SPECIAL] # 0 - [PUNCTUATION_DE] # 1 diff --git a/app/languages/definitions/Greek.yml b/app/languages/definitions/Greek.yml index e328a107..abb24b4d 100644 --- a/app/languages/definitions/Greek.yml +++ b/app/languages/definitions/Greek.yml @@ -1,5 +1,7 @@ locale: el-GR dictionaryFile: gr-utf8.csv +iconABC: ic_lang_alfabeta +iconT9: ic_lang_el layout: - [SPECIAL] # 0 - [PUNCTUATION_GR] # 1 diff --git a/app/languages/definitions/Gujarati.yml b/app/languages/definitions/Gujarati.yml index 5402ad81..ce40af21 100644 --- a/app/languages/definitions/Gujarati.yml +++ b/app/languages/definitions/Gujarati.yml @@ -1,6 +1,8 @@ locale: gu-IN currency: ૱ dictionaryFile: gu-utf8.csv +iconABC: ic_lang_gu_abc +iconT9: ic_lang_gu abcString: કખગ hasUpperCase: no layout: diff --git a/app/languages/definitions/Hebrew.yml b/app/languages/definitions/Hebrew.yml index 0cc7b604..b39c916f 100644 --- a/app/languages/definitions/Hebrew.yml +++ b/app/languages/definitions/Hebrew.yml @@ -1,6 +1,8 @@ locale: iw-IL currency: ₪ dictionaryFile: he-utf8.csv +iconABC: ic_lang_alefbet +iconT9: ic_lang_he abcString: אבג hasUpperCase: no layout: diff --git a/app/languages/definitions/Hindi.yml b/app/languages/definitions/Hindi.yml index dac0144a..dd8e84ec 100644 --- a/app/languages/definitions/Hindi.yml +++ b/app/languages/definitions/Hindi.yml @@ -1,6 +1,8 @@ locale: hi-IN currency: ₹ dictionaryFile: hi-utf8.csv +iconABC: ic_lang_hi_abc +iconT9: ic_lang_hi abcString: कखग hasUpperCase: no layout: diff --git a/app/languages/definitions/Hinglish.yml b/app/languages/definitions/Hinglish.yml index 7ac7171d..2c08c9fd 100644 --- a/app/languages/definitions/Hinglish.yml +++ b/app/languages/definitions/Hinglish.yml @@ -1,5 +1,7 @@ locale: en-IN dictionaryFile: hing-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_hn name: Hinglish layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Hungarian.yml b/app/languages/definitions/Hungarian.yml index e26dae7d..1b09c60f 100644 --- a/app/languages/definitions/Hungarian.yml +++ b/app/languages/definitions/Hungarian.yml @@ -1,5 +1,7 @@ locale: hu-HU dictionaryFile: hu-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_mg abcString: abc layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Indonesian.yml b/app/languages/definitions/Indonesian.yml index 774c984d..51677719 100644 --- a/app/languages/definitions/Indonesian.yml +++ b/app/languages/definitions/Indonesian.yml @@ -1,5 +1,7 @@ locale: in-ID dictionaryFile: id-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_id name: Bahasa Indonesia layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Irish.yml b/app/languages/definitions/Irish.yml index 23bb5ca3..fdf36ac7 100644 --- a/app/languages/definitions/Irish.yml +++ b/app/languages/definitions/Irish.yml @@ -1,5 +1,7 @@ locale: ga-IE dictionaryFile: ga-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_ga layout: - [SPECIAL] # 0 - [PUNCTUATION_IE] # 1 diff --git a/app/languages/definitions/Italian.yml b/app/languages/definitions/Italian.yml index 8415c193..f782a4c4 100644 --- a/app/languages/definitions/Italian.yml +++ b/app/languages/definitions/Italian.yml @@ -1,5 +1,7 @@ locale: it-IT dictionaryFile: it-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_it layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Japanese.yml b/app/languages/definitions/Japanese.yml index 59b4997f..391529de 100644 --- a/app/languages/definitions/Japanese.yml +++ b/app/languages/definitions/Japanese.yml @@ -1,6 +1,7 @@ locale: ja-JP dictionaryFile: ja-romaji.csv name: 日本語 / ローマ字 +iconT9: ic_lang_kanji hasABC: no hasSpaceBetweenWords: no hasUpperCase: no diff --git a/app/languages/definitions/Kiswahili.yml b/app/languages/definitions/Kiswahili.yml index 3117b78f..4d1f5ed1 100644 --- a/app/languages/definitions/Kiswahili.yml +++ b/app/languages/definitions/Kiswahili.yml @@ -1,5 +1,7 @@ locale: sw-TZ dictionaryFile: sw-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_sw layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Korean.yml b/app/languages/definitions/Korean.yml index bf027e36..81dc4b4e 100644 --- a/app/languages/definitions/Korean.yml +++ b/app/languages/definitions/Korean.yml @@ -1,6 +1,7 @@ locale: ko-KR currency: ₩ dictionaryFile: ko-utf8.csv +iconT9: ic_lang_ko hasABC: no hasUpperCase: no layout: # only used for the virtual key labels diff --git a/app/languages/definitions/Latvian.yml b/app/languages/definitions/Latvian.yml index ac0c9ef6..0eed43bb 100644 --- a/app/languages/definitions/Latvian.yml +++ b/app/languages/definitions/Latvian.yml @@ -1,5 +1,7 @@ locale: lv-LV dictionaryFile: lv-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_lv abcString: abc layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Lithuanian.yml b/app/languages/definitions/Lithuanian.yml index 4788e232..c42d45ca 100644 --- a/app/languages/definitions/Lithuanian.yml +++ b/app/languages/definitions/Lithuanian.yml @@ -1,5 +1,7 @@ locale: lt-LT dictionaryFile: lt-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_lt layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Norwegian.yml b/app/languages/definitions/Norwegian.yml index 1b0d316d..ef135688 100644 --- a/app/languages/definitions/Norwegian.yml +++ b/app/languages/definitions/Norwegian.yml @@ -1,5 +1,7 @@ locale: nb-NO dictionaryFile: nb-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_no layout: - [SPECIAL] # 0 - [PUNCTUATION_FR] # 1 diff --git a/app/languages/definitions/Polish.yml b/app/languages/definitions/Polish.yml index bddd1c19..ccd0080f 100644 --- a/app/languages/definitions/Polish.yml +++ b/app/languages/definitions/Polish.yml @@ -1,5 +1,7 @@ locale: pl-PL dictionaryFile: pl-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_pl layout: - [SPECIAL] # 0 - [PUNCTUATION_DE] # 1 diff --git a/app/languages/definitions/Portuguese.yml b/app/languages/definitions/Portuguese.yml index 1a3c1c47..07afd3f1 100644 --- a/app/languages/definitions/Portuguese.yml +++ b/app/languages/definitions/Portuguese.yml @@ -1,5 +1,7 @@ locale: pt-PT dictionaryFile: pt-PT-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_pt name: Português / PT layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Romanian.yml b/app/languages/definitions/Romanian.yml index f82cfe3d..95468cc4 100644 --- a/app/languages/definitions/Romanian.yml +++ b/app/languages/definitions/Romanian.yml @@ -1,5 +1,7 @@ locale: ro-RO dictionaryFile: ro-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_ro layout: - [SPECIAL] # 0 - [PUNCTUATION_FR] # 1 diff --git a/app/languages/definitions/Russian.yml b/app/languages/definitions/Russian.yml index 911ea204..9d765819 100644 --- a/app/languages/definitions/Russian.yml +++ b/app/languages/definitions/Russian.yml @@ -1,6 +1,8 @@ locale: ru-RU currency: ₽ dictionaryFile: ru-utf8.csv +iconABC: ic_lang_cyrillic +iconT9: ic_lang_ru layout: - [SPECIAL] # 0 - [PUNCTUATION_FR] # 1 diff --git a/app/languages/definitions/Slovenian.yml b/app/languages/definitions/Slovenian.yml index 5f14a4a9..84c2cea9 100644 --- a/app/languages/definitions/Slovenian.yml +++ b/app/languages/definitions/Slovenian.yml @@ -1,5 +1,7 @@ locale: sl-SI dictionaryFile: sl-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_sl layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Spanish.yml b/app/languages/definitions/Spanish.yml index d1fe3f7e..24a8db37 100644 --- a/app/languages/definitions/Spanish.yml +++ b/app/languages/definitions/Spanish.yml @@ -1,5 +1,7 @@ locale: es-ES dictionaryFile: es-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_es layout: - [SPECIAL] # 0 - [PUNCTUATION_FR, ¡, ¿] # 1 diff --git a/app/languages/definitions/Swedish.yml b/app/languages/definitions/Swedish.yml index 1da86742..e2f765ed 100644 --- a/app/languages/definitions/Swedish.yml +++ b/app/languages/definitions/Swedish.yml @@ -1,5 +1,7 @@ locale: sv-SE dictionaryFile: sv-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_sv layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Tamazight.yml b/app/languages/definitions/Tamazight.yml index ff3ac980..4d7dd3f4 100644 --- a/app/languages/definitions/Tamazight.yml +++ b/app/languages/definitions/Tamazight.yml @@ -1,5 +1,8 @@ locale: zgh-MA dictionaryFile: tamazight-utf8.txt +iconABC: ic_lang_tifinagh +iconT9: ic_lang_tm_tifinagh +hasUpperCase: no layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/TamazightLatin.yml b/app/languages/definitions/TamazightLatin.yml index ce4830c6..d53bc0cd 100644 --- a/app/languages/definitions/TamazightLatin.yml +++ b/app/languages/definitions/TamazightLatin.yml @@ -1,6 +1,8 @@ locale: zgh-DZ # zgh = Morroccan Tamazight, DZ = Algeria. We combine these just to get a unique ID. name: Tamaziɣt / MA dictionaryFile: tamazight-latin-utf8.txt +iconABC: ic_lang_latin +iconT9: ic_lang_tm layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Thai.yml b/app/languages/definitions/Thai.yml index cbeb79fe..0529cee6 100644 --- a/app/languages/definitions/Thai.yml +++ b/app/languages/definitions/Thai.yml @@ -1,6 +1,8 @@ locale: th-TH currency: ฿ dictionaryFile: th-utf8.csv +iconABC: ic_lang_th_abc +iconT9: ic_lang_th abcString: กขค hasSpaceBetweenWords: no hasUpperCase: no diff --git a/app/languages/definitions/Turkish.yml b/app/languages/definitions/Turkish.yml index 6410d4f1..7386e0f0 100644 --- a/app/languages/definitions/Turkish.yml +++ b/app/languages/definitions/Turkish.yml @@ -1,6 +1,8 @@ locale: tr-TR currency: ₺ dictionaryFile: tr-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_tr layout: - [SPECIAL] # 0 - [PUNCTUATION] # 1 diff --git a/app/languages/definitions/Ukrainian.yml b/app/languages/definitions/Ukrainian.yml index 4eb44644..27f2107d 100644 --- a/app/languages/definitions/Ukrainian.yml +++ b/app/languages/definitions/Ukrainian.yml @@ -1,6 +1,8 @@ locale: uk-UA currency: ₴ dictionaryFile: uk-utf8.csv +iconABC: ic_lang_cyrillic +iconT9: ic_lang_uk layout: - [SPECIAL] # 0 - [PUNCTUATION_FR] # 1 diff --git a/app/languages/definitions/Vietnamese.yml b/app/languages/definitions/Vietnamese.yml index b3b2da36..3be6360e 100644 --- a/app/languages/definitions/Vietnamese.yml +++ b/app/languages/definitions/Vietnamese.yml @@ -1,6 +1,8 @@ locale: vi-VN currency: ₫ dictionaryFile: vi-utf8.csv +iconABC: ic_lang_latin +iconT9: ic_lang_vi abcString: abc layout: - [SPECIAL] # 0 diff --git a/app/languages/definitions/Yiddish.yml b/app/languages/definitions/Yiddish.yml index 11a38ff7..6ae71c4c 100644 --- a/app/languages/definitions/Yiddish.yml +++ b/app/languages/definitions/Yiddish.yml @@ -1,5 +1,7 @@ locale: ji-JI dictionaryFile: ji-utf8.csv +iconABC: ic_lang_alefbet +iconT9: ic_lang_ji abcString: אבג hasUpperCase: no layout: diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index 88d6c3e3..92be7420 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -314,6 +314,7 @@ public abstract class HotkeyHandler extends CommandHandler { } getSuggestions(null); + setStatusIcon(mInputMode, mLanguage); statusBar.setText(mInputMode); suggestionOps.setRTL(isLanguageRTL); mainView.render(); @@ -341,6 +342,8 @@ public abstract class HotkeyHandler extends CommandHandler { suggestionOps.scheduleDelayedAccept(mInputMode.getAutoAcceptTimeout()); // restart the timer nextInputMode(); + + setStatusIcon(mInputMode, mLanguage); statusBar.setText(mInputMode); mainView.render(); @@ -366,6 +369,7 @@ public abstract class HotkeyHandler extends CommandHandler { if (!nextTextCase()) { return false; } + setStatusIcon(mInputMode, mLanguage); statusBar.setText(mInputMode); mainView.render(); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java index 48bb9aaf..f577cf4b 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -140,6 +140,7 @@ public class TraditionalT9 extends MainViewHandler { } if (isDead || !super.onStart(connection, field)) { + setStatusIcon(mInputMode, mLanguage); return false; } @@ -172,7 +173,6 @@ public class TraditionalT9 extends MainViewHandler { stopVoiceInput(); onFinishTyping(); suggestionOps.clear(); - setStatusIcon(mInputMode); statusBar.setText(mInputMode); if (isInputViewShown()) { @@ -190,6 +190,13 @@ public class TraditionalT9 extends MainViewHandler { } + @Override + protected void onFinishTyping() { + super.onFinishTyping(); + setStatusIcon(mInputMode, mLanguage); + } + + /** * On Android 11+ the IME is sometimes not killed when the user switches to a different one. * Here we attempt to detect if we are disabled, then hide and kill ourselves. diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java index 13d29e14..42aaba95 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java @@ -2,10 +2,10 @@ package io.github.sspanak.tt9.ime; import android.view.inputmethod.InputMethodManager; -import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.ime.modes.InputMode; -import io.github.sspanak.tt9.ime.modes.InputModeKind; +import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; +import io.github.sspanak.tt9.ui.StatusIcon; import io.github.sspanak.tt9.ui.main.ResizableMainView; import io.github.sspanak.tt9.ui.tray.StatusBar; import io.github.sspanak.tt9.util.sys.DeviceInfo; @@ -43,7 +43,7 @@ abstract class UiHandler extends AbstractHandler { } else { getSuggestionOps().setDarkTheme(); } - setStatusIcon(inputMode); + setStatusIcon(inputMode, getFinalContext().getLanguage()); statusBar.setText(inputMode); mainView.hideCommandPalette(); mainView.render(); @@ -55,11 +55,12 @@ abstract class UiHandler extends AbstractHandler { } - protected void setStatusIcon(InputMode mode) { - if (!InputModeKind.isPassthrough(mode) && settings.isStatusIconEnabled()) { - showStatusIcon(R.drawable.ic_keyboard); - } else { + protected void setStatusIcon(InputMode mode, Language language) { + int resId = StatusIcon.getResource(this, settings, mode, language); + if (resId == 0) { hideStatusIcon(); + } else { + showStatusIcon(resId); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java index da9deefc..d70f4fbf 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java @@ -19,6 +19,8 @@ abstract public class Language { protected boolean hasSpaceBetweenWords = true; protected boolean hasUpperCase = true; protected boolean hasTranscriptionsEmbedded = false; + protected String iconABC = ""; + protected String iconT9 = ""; protected boolean isTranscribed = false; protected Locale locale = Locale.ROOT; protected String name; @@ -107,6 +109,14 @@ abstract public class Language { return hasTranscriptionsEmbedded; } + final public String getIconABC() { + return iconABC; + } + + final public String getIconT9() { + return iconT9; + } + final public boolean isTranscribed() { return isTranscribed; } diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/LanguageDefinition.java b/app/src/main/java/io/github/sspanak/tt9/languages/LanguageDefinition.java index e61d368b..46657cd2 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/LanguageDefinition.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/LanguageDefinition.java @@ -28,6 +28,8 @@ public class LanguageDefinition { public boolean hasABC = true; public boolean hasSpaceBetweenWords = true; public boolean hasUpperCase = true; + public String iconABC = ""; + public String iconT9 = ""; public boolean isTranscribed = false; public final ArrayList> layout = new ArrayList<>(); public String locale = ""; @@ -148,6 +150,12 @@ public class LanguageDefinition { case "hasUpperCase": hasUpperCase = parseYamlBoolean(value); return; + case "iconABC": + iconABC = value; + return; + case "iconT9": + iconT9 = value; + return; case "sounds": isTranscribed = true; return; diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java b/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java index 49a9416f..1af08074 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java @@ -37,6 +37,8 @@ public class NaturalLanguage extends TranscribedLanguage { lang.hasSpaceBetweenWords = definition.hasSpaceBetweenWords; lang.hasUpperCase = definition.hasUpperCase; lang.hasTranscriptionsEmbedded = definition.filterBySounds; + lang.iconABC = definition.iconABC; + lang.iconT9 = definition.iconT9; lang.isTranscribed = definition.isTranscribed; lang.name = definition.name.isEmpty() ? lang.name : definition.name; lang.numerals = definition.numerals; diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java b/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java new file mode 100644 index 00000000..74051b91 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java @@ -0,0 +1,91 @@ +package io.github.sspanak.tt9.ui; + +import android.content.Context; + +import androidx.annotation.Nullable; + +import java.util.HashMap; + +import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.ime.modes.InputMode; +import io.github.sspanak.tt9.ime.modes.InputModeKind; +import io.github.sspanak.tt9.languages.Language; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; + +public class StatusIcon { + private static final HashMap cache = new HashMap<>(); + private final int resourceId; + + + private StatusIcon(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + resourceId = resolveResourcePerMode(ctx, settings, mode, language); + } + + + private int resolveResourcePerMode(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + if (language == null || mode == null || settings == null || InputModeKind.isPassthrough(mode) || !settings.isStatusIconEnabled()) { + return 0; + } + + if (InputModeKind.isHiragana(mode)) { + return R.drawable.ic_lang_hiragana; + } else if (InputModeKind.isKatakana(mode)) { + return R.drawable.ic_lang_katakana; + } else if (InputModeKind.is123(mode)) { + return R.drawable.ic_lang_123; + } else if (InputModeKind.isABC(mode)) { + return resolveResource(ctx, language.getIconABC(), language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + } else if (InputModeKind.isPredictive(mode)) { + return resolveResource(ctx, language.getIconT9(), language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + } + + return R.drawable.ic_keyboard; + } + + + private int resolveResource(Context ctx, String name, int textCase) { + if (ctx == null || name == null) { + return 0; + } + + switch (textCase) { + case InputMode.CASE_UPPER: + name += "_up"; + break; + case InputMode.CASE_LOWER: + name += "_lo"; + break; + case InputMode.CASE_CAPITALIZE: + name += "_cp"; + break; + } + + return ctx.getResources().getIdentifier("drawable/" + name, null, ctx.getPackageName()); + } + + + @Nullable + private static String getCacheKey(@Nullable InputMode mode, @Nullable Language language) { + if (mode == null || language == null) { + return null; + } + + return mode.getId() + "_" + language.getId() + "_" + (language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + } + + + public static int getResource(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + final String cacheKey = getCacheKey(mode, language); + Integer resId = cache.containsKey(cacheKey) ? cache.get(cacheKey) : Integer.valueOf(0); + if (resId != null && resId != 0) { + return resId; + } + + resId = new StatusIcon(ctx, settings, mode, language).resourceId; + if (resId != 0) { + cache.put(cacheKey, resId); + } + + return resId; + } +} diff --git a/app/src/main/res/drawable/ic_lang_123.xml b/app/src/main/res/drawable/ic_lang_123.xml new file mode 100644 index 00000000..302539b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_123.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_alefbet.xml b/app/src/main/res/drawable/ic_lang_alefbet.xml new file mode 100644 index 00000000..a64d6583 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_alefbet.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_alfabeta_lo.xml b/app/src/main/res/drawable/ic_lang_alfabeta_lo.xml new file mode 100644 index 00000000..ad80b5c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_alfabeta_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_alfabeta_up.xml b/app/src/main/res/drawable/ic_lang_alfabeta_up.xml new file mode 100644 index 00000000..7ddbb0b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_alfabeta_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_alifba.xml b/app/src/main/res/drawable/ic_lang_alifba.xml new file mode 100644 index 00000000..6495a86a --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_alifba.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ar.xml b/app/src/main/res/drawable/ic_lang_ar.xml new file mode 100644 index 00000000..f0187ddd --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ar.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_bg_cp.xml b/app/src/main/res/drawable/ic_lang_bg_cp.xml new file mode 100644 index 00000000..92493f81 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_bg_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_bg_lo.xml b/app/src/main/res/drawable/ic_lang_bg_lo.xml new file mode 100644 index 00000000..c990689f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_bg_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_bg_up.xml b/app/src/main/res/drawable/ic_lang_bg_up.xml new file mode 100644 index 00000000..04542ed2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_bg_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_br_cp.xml b/app/src/main/res/drawable/ic_lang_br_cp.xml new file mode 100644 index 00000000..bdbd0d39 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_br_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_br_lo.xml b/app/src/main/res/drawable/ic_lang_br_lo.xml new file mode 100644 index 00000000..8636cabd --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_br_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_br_up.xml b/app/src/main/res/drawable/ic_lang_br_up.xml new file mode 100644 index 00000000..88f0ec7b --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_br_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ca_cp.xml b/app/src/main/res/drawable/ic_lang_ca_cp.xml new file mode 100644 index 00000000..e2cdb0ff --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ca_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ca_lo.xml b/app/src/main/res/drawable/ic_lang_ca_lo.xml new file mode 100644 index 00000000..c89ff943 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ca_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ca_up.xml b/app/src/main/res/drawable/ic_lang_ca_up.xml new file mode 100644 index 00000000..3a479818 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ca_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_cyrillic_lo.xml b/app/src/main/res/drawable/ic_lang_cyrillic_lo.xml new file mode 100644 index 00000000..d69e746c --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_cyrillic_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_cyrillic_up.xml b/app/src/main/res/drawable/ic_lang_cyrillic_up.xml new file mode 100644 index 00000000..c9240d2f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_cyrillic_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_cz_cp.xml b/app/src/main/res/drawable/ic_lang_cz_cp.xml new file mode 100644 index 00000000..4d989d94 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_cz_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_cz_lo.xml b/app/src/main/res/drawable/ic_lang_cz_lo.xml new file mode 100644 index 00000000..6066671f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_cz_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_cz_up.xml b/app/src/main/res/drawable/ic_lang_cz_up.xml new file mode 100644 index 00000000..6977fcb6 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_cz_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_da_cp.xml b/app/src/main/res/drawable/ic_lang_da_cp.xml new file mode 100644 index 00000000..5bbc0147 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_da_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_da_lo.xml b/app/src/main/res/drawable/ic_lang_da_lo.xml new file mode 100644 index 00000000..5f2a699f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_da_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_da_up.xml b/app/src/main/res/drawable/ic_lang_da_up.xml new file mode 100644 index 00000000..90049124 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_da_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_de_cp.xml b/app/src/main/res/drawable/ic_lang_de_cp.xml new file mode 100644 index 00000000..a05f5d9b --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_de_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_de_lo.xml b/app/src/main/res/drawable/ic_lang_de_lo.xml new file mode 100644 index 00000000..c7e4a578 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_de_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_de_up.xml b/app/src/main/res/drawable/ic_lang_de_up.xml new file mode 100644 index 00000000..189f8431 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_de_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_el_cp.xml b/app/src/main/res/drawable/ic_lang_el_cp.xml new file mode 100644 index 00000000..1ad94a5d --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_el_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_el_lo.xml b/app/src/main/res/drawable/ic_lang_el_lo.xml new file mode 100644 index 00000000..9ff50094 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_el_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_el_up.xml b/app/src/main/res/drawable/ic_lang_el_up.xml new file mode 100644 index 00000000..01a2b34f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_el_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_en_cp.xml b/app/src/main/res/drawable/ic_lang_en_cp.xml new file mode 100644 index 00000000..b7f50880 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_en_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_en_lo.xml b/app/src/main/res/drawable/ic_lang_en_lo.xml new file mode 100644 index 00000000..5c9e9c8c --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_en_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_en_up.xml b/app/src/main/res/drawable/ic_lang_en_up.xml new file mode 100644 index 00000000..788318ad --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_en_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_es_cp.xml b/app/src/main/res/drawable/ic_lang_es_cp.xml new file mode 100644 index 00000000..99238abd --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_es_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_es_lo.xml b/app/src/main/res/drawable/ic_lang_es_lo.xml new file mode 100644 index 00000000..d9e54cf6 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_es_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_es_up.xml b/app/src/main/res/drawable/ic_lang_es_up.xml new file mode 100644 index 00000000..6d8b59f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_es_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_et_cp.xml b/app/src/main/res/drawable/ic_lang_et_cp.xml new file mode 100644 index 00000000..67abb8e1 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_et_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_et_lo.xml b/app/src/main/res/drawable/ic_lang_et_lo.xml new file mode 100644 index 00000000..2ba2e635 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_et_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_et_up.xml b/app/src/main/res/drawable/ic_lang_et_up.xml new file mode 100644 index 00000000..4d3b99d8 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_et_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_fa.xml b/app/src/main/res/drawable/ic_lang_fa.xml new file mode 100644 index 00000000..94fd6d75 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_fa.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_fr_cp.xml b/app/src/main/res/drawable/ic_lang_fr_cp.xml new file mode 100644 index 00000000..9448dfb9 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_fr_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_fr_lo.xml b/app/src/main/res/drawable/ic_lang_fr_lo.xml new file mode 100644 index 00000000..9e1af5c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_fr_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_fr_up.xml b/app/src/main/res/drawable/ic_lang_fr_up.xml new file mode 100644 index 00000000..cabc6655 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_fr_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ga_cp.xml b/app/src/main/res/drawable/ic_lang_ga_cp.xml new file mode 100644 index 00000000..7a3e1aaa --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ga_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ga_lo.xml b/app/src/main/res/drawable/ic_lang_ga_lo.xml new file mode 100644 index 00000000..f81e056a --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ga_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ga_up.xml b/app/src/main/res/drawable/ic_lang_ga_up.xml new file mode 100644 index 00000000..800782af --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ga_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_gu.xml b/app/src/main/res/drawable/ic_lang_gu.xml new file mode 100644 index 00000000..49a422b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_gu.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_gu_abc.xml b/app/src/main/res/drawable/ic_lang_gu_abc.xml new file mode 100644 index 00000000..517972d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_gu_abc.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_he.xml b/app/src/main/res/drawable/ic_lang_he.xml new file mode 100644 index 00000000..34a74829 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_he.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hi.xml b/app/src/main/res/drawable/ic_lang_hi.xml new file mode 100644 index 00000000..883b75fd --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hi.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hi_abc.xml b/app/src/main/res/drawable/ic_lang_hi_abc.xml new file mode 100644 index 00000000..e783a570 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hi_abc.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hiragana.xml b/app/src/main/res/drawable/ic_lang_hiragana.xml new file mode 100644 index 00000000..b84accf9 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hiragana.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hn_cp.xml b/app/src/main/res/drawable/ic_lang_hn_cp.xml new file mode 100644 index 00000000..018c6104 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hn_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hn_lo.xml b/app/src/main/res/drawable/ic_lang_hn_lo.xml new file mode 100644 index 00000000..82342319 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hn_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hn_up.xml b/app/src/main/res/drawable/ic_lang_hn_up.xml new file mode 100644 index 00000000..3bd172ce --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hn_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hr_cp.xml b/app/src/main/res/drawable/ic_lang_hr_cp.xml new file mode 100644 index 00000000..7126c5c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hr_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hr_lo.xml b/app/src/main/res/drawable/ic_lang_hr_lo.xml new file mode 100644 index 00000000..f1697779 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hr_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_hr_up.xml b/app/src/main/res/drawable/ic_lang_hr_up.xml new file mode 100644 index 00000000..6011c69b --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_hr_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_id_cp.xml b/app/src/main/res/drawable/ic_lang_id_cp.xml new file mode 100644 index 00000000..ef8b3122 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_id_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_id_lo.xml b/app/src/main/res/drawable/ic_lang_id_lo.xml new file mode 100644 index 00000000..8feddbcf --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_id_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_id_up.xml b/app/src/main/res/drawable/ic_lang_id_up.xml new file mode 100644 index 00000000..4cb3e425 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_id_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_it_cp.xml b/app/src/main/res/drawable/ic_lang_it_cp.xml new file mode 100644 index 00000000..bfa4c0f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_it_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_it_lo.xml b/app/src/main/res/drawable/ic_lang_it_lo.xml new file mode 100644 index 00000000..9b624a87 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_it_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_it_up.xml b/app/src/main/res/drawable/ic_lang_it_up.xml new file mode 100644 index 00000000..3e98654a --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_it_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ji.xml b/app/src/main/res/drawable/ic_lang_ji.xml new file mode 100644 index 00000000..51903587 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ji.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_kanji.xml b/app/src/main/res/drawable/ic_lang_kanji.xml new file mode 100644 index 00000000..0ed31426 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_kanji.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_katakana.xml b/app/src/main/res/drawable/ic_lang_katakana.xml new file mode 100644 index 00000000..b4995a70 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_katakana.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ko.xml b/app/src/main/res/drawable/ic_lang_ko.xml new file mode 100644 index 00000000..46675d91 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ko.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_latin_lo.xml b/app/src/main/res/drawable/ic_lang_latin_lo.xml new file mode 100644 index 00000000..d5840c7f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_latin_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_latin_up.xml b/app/src/main/res/drawable/ic_lang_latin_up.xml new file mode 100644 index 00000000..7ddbb0b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_latin_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_lt_cp.xml b/app/src/main/res/drawable/ic_lang_lt_cp.xml new file mode 100644 index 00000000..4ae00c47 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_lt_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_lt_lo.xml b/app/src/main/res/drawable/ic_lang_lt_lo.xml new file mode 100644 index 00000000..beb97835 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_lt_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_lt_up.xml b/app/src/main/res/drawable/ic_lang_lt_up.xml new file mode 100644 index 00000000..928ee8b7 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_lt_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_lv_cp.xml b/app/src/main/res/drawable/ic_lang_lv_cp.xml new file mode 100644 index 00000000..c37df481 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_lv_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_lv_lo.xml b/app/src/main/res/drawable/ic_lang_lv_lo.xml new file mode 100644 index 00000000..e1c0a840 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_lv_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_lv_up.xml b/app/src/main/res/drawable/ic_lang_lv_up.xml new file mode 100644 index 00000000..6f55e0e6 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_lv_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_mg_cp.xml b/app/src/main/res/drawable/ic_lang_mg_cp.xml new file mode 100644 index 00000000..2a1ec0c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_mg_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_mg_lo.xml b/app/src/main/res/drawable/ic_lang_mg_lo.xml new file mode 100644 index 00000000..8db7a7bb --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_mg_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_mg_up.xml b/app/src/main/res/drawable/ic_lang_mg_up.xml new file mode 100644 index 00000000..7ad45c5c --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_mg_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_nl_cp.xml b/app/src/main/res/drawable/ic_lang_nl_cp.xml new file mode 100644 index 00000000..086917b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_nl_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_nl_lo.xml b/app/src/main/res/drawable/ic_lang_nl_lo.xml new file mode 100644 index 00000000..d395dc41 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_nl_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_nl_up.xml b/app/src/main/res/drawable/ic_lang_nl_up.xml new file mode 100644 index 00000000..22ae17e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_nl_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_no_cp.xml b/app/src/main/res/drawable/ic_lang_no_cp.xml new file mode 100644 index 00000000..e14f31a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_no_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_no_lo.xml b/app/src/main/res/drawable/ic_lang_no_lo.xml new file mode 100644 index 00000000..813f2348 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_no_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_no_up.xml b/app/src/main/res/drawable/ic_lang_no_up.xml new file mode 100644 index 00000000..c68160b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_no_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_pl_cp.xml b/app/src/main/res/drawable/ic_lang_pl_cp.xml new file mode 100644 index 00000000..53fd7fbd --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_pl_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_pl_lo.xml b/app/src/main/res/drawable/ic_lang_pl_lo.xml new file mode 100644 index 00000000..1a9c7d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_pl_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_pl_up.xml b/app/src/main/res/drawable/ic_lang_pl_up.xml new file mode 100644 index 00000000..8690d05f --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_pl_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_pt_cp.xml b/app/src/main/res/drawable/ic_lang_pt_cp.xml new file mode 100644 index 00000000..0d301140 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_pt_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_pt_lo.xml b/app/src/main/res/drawable/ic_lang_pt_lo.xml new file mode 100644 index 00000000..d31c4d39 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_pt_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_pt_up.xml b/app/src/main/res/drawable/ic_lang_pt_up.xml new file mode 100644 index 00000000..a461f0d8 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_pt_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ro_cp.xml b/app/src/main/res/drawable/ic_lang_ro_cp.xml new file mode 100644 index 00000000..8fe72067 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ro_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ro_lo.xml b/app/src/main/res/drawable/ic_lang_ro_lo.xml new file mode 100644 index 00000000..455a08ae --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ro_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ro_up.xml b/app/src/main/res/drawable/ic_lang_ro_up.xml new file mode 100644 index 00000000..4746c856 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ro_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ru_cp.xml b/app/src/main/res/drawable/ic_lang_ru_cp.xml new file mode 100644 index 00000000..d2894bed --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ru_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ru_lo.xml b/app/src/main/res/drawable/ic_lang_ru_lo.xml new file mode 100644 index 00000000..56ffa98c --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ru_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_ru_up.xml b/app/src/main/res/drawable/ic_lang_ru_up.xml new file mode 100644 index 00000000..2b381552 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_ru_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sl_cp.xml b/app/src/main/res/drawable/ic_lang_sl_cp.xml new file mode 100644 index 00000000..cbcd1016 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sl_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sl_lo.xml b/app/src/main/res/drawable/ic_lang_sl_lo.xml new file mode 100644 index 00000000..8570f1d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sl_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sl_up.xml b/app/src/main/res/drawable/ic_lang_sl_up.xml new file mode 100644 index 00000000..2663c746 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sl_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_su_cp.xml b/app/src/main/res/drawable/ic_lang_su_cp.xml new file mode 100644 index 00000000..c0456875 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_su_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_su_lo.xml b/app/src/main/res/drawable/ic_lang_su_lo.xml new file mode 100644 index 00000000..10e0a658 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_su_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_su_up.xml b/app/src/main/res/drawable/ic_lang_su_up.xml new file mode 100644 index 00000000..1fd5cee0 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_su_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sv_cp.xml b/app/src/main/res/drawable/ic_lang_sv_cp.xml new file mode 100644 index 00000000..514bced7 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sv_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sv_lo.xml b/app/src/main/res/drawable/ic_lang_sv_lo.xml new file mode 100644 index 00000000..9419cf35 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sv_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sv_up.xml b/app/src/main/res/drawable/ic_lang_sv_up.xml new file mode 100644 index 00000000..8c6ba812 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sv_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sw_cp.xml b/app/src/main/res/drawable/ic_lang_sw_cp.xml new file mode 100644 index 00000000..aa3a543b --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sw_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sw_lo.xml b/app/src/main/res/drawable/ic_lang_sw_lo.xml new file mode 100644 index 00000000..1941f215 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sw_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_sw_up.xml b/app/src/main/res/drawable/ic_lang_sw_up.xml new file mode 100644 index 00000000..c51bb4a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_sw_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_th.xml b/app/src/main/res/drawable/ic_lang_th.xml new file mode 100644 index 00000000..7c4a39c5 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_th.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_th_abc.xml b/app/src/main/res/drawable/ic_lang_th_abc.xml new file mode 100644 index 00000000..d545f732 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_th_abc.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tifinagh.xml b/app/src/main/res/drawable/ic_lang_tifinagh.xml new file mode 100644 index 00000000..c232ac12 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tifinagh.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tm_cp.xml b/app/src/main/res/drawable/ic_lang_tm_cp.xml new file mode 100644 index 00000000..4c3e3e0a --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tm_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tm_lo.xml b/app/src/main/res/drawable/ic_lang_tm_lo.xml new file mode 100644 index 00000000..f538c013 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tm_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tm_tifinagh.xml b/app/src/main/res/drawable/ic_lang_tm_tifinagh.xml new file mode 100644 index 00000000..b52838c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tm_tifinagh.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tm_up.xml b/app/src/main/res/drawable/ic_lang_tm_up.xml new file mode 100644 index 00000000..23d61f46 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tm_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tr_cp.xml b/app/src/main/res/drawable/ic_lang_tr_cp.xml new file mode 100644 index 00000000..8c3a0662 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tr_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tr_lo.xml b/app/src/main/res/drawable/ic_lang_tr_lo.xml new file mode 100644 index 00000000..456f948a --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tr_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_tr_up.xml b/app/src/main/res/drawable/ic_lang_tr_up.xml new file mode 100644 index 00000000..3655e76e --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_tr_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_uk_cp.xml b/app/src/main/res/drawable/ic_lang_uk_cp.xml new file mode 100644 index 00000000..d7458d75 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_uk_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_uk_lo.xml b/app/src/main/res/drawable/ic_lang_uk_lo.xml new file mode 100644 index 00000000..a8a850b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_uk_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_uk_up.xml b/app/src/main/res/drawable/ic_lang_uk_up.xml new file mode 100644 index 00000000..49c666a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_uk_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_vi_cp.xml b/app/src/main/res/drawable/ic_lang_vi_cp.xml new file mode 100644 index 00000000..9a13312c --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_vi_cp.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_vi_lo.xml b/app/src/main/res/drawable/ic_lang_vi_lo.xml new file mode 100644 index 00000000..9c0decd7 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_vi_lo.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_vi_up.xml b/app/src/main/res/drawable/ic_lang_vi_up.xml new file mode 100644 index 00000000..5afbfc31 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_vi_up.xml @@ -0,0 +1 @@ + diff --git a/app/src/main/res/drawable/ic_lang_zh_pinyin.xml b/app/src/main/res/drawable/ic_lang_zh_pinyin.xml new file mode 100644 index 00000000..476957f7 --- /dev/null +++ b/app/src/main/res/drawable/ic_lang_zh_pinyin.xml @@ -0,0 +1 @@ + diff --git a/app/validate-languages.gradle b/app/validate-languages.gradle index 2ccef770..da228d31 100644 --- a/app/validate-languages.gradle +++ b/app/validate-languages.gradle @@ -1,7 +1,7 @@ apply from: 'dictionary-tools.gradle' -ext.validateLanguageFiles = { definitionsDir, dictionariesDir, validationDir -> +ext.validateLanguageFiles = { definitionsDir, dictionariesDir, validationDir, iconsDir -> int errorCount = 0 def errorStream = fileTree(dir: definitionsDir).getFiles().parallelStream().map { definition -> @@ -13,7 +13,7 @@ ext.validateLanguageFiles = { definitionsDir, dictionariesDir, validationDir -> return "Too many errors! Skipping: ${definition}\n" } - def (alphabet, sounds, _, isAlphabeticLanguage, locale, dictionaryFile, langFileErrorCount, langFileErrorMsg) = parseLanguageDefintion(definition, dictionariesDir) + def (alphabet, sounds, _, isAlphabeticLanguage, locale, dictionaryFile, langFileErrorCount, langFileErrorMsg) = parseLanguageDefintion(definition, dictionariesDir, iconsDir) def languageHash = DictionaryTools.getLanguageHash(definition, dictionaryFile) def validationFile = new File("${validationDir}/${definition.name.replace(".yml", "")}.txt") @@ -46,7 +46,7 @@ ext.validateLanguageFiles = { definitionsDir, dictionariesDir, validationDir -> } -ext.parseLanguageDefintion = { File languageFile, String dictionariesDir -> +ext.parseLanguageDefintion = { File languageFile, String dictionariesDir, String iconsDir -> String alphabet = '' int layoutKey = 0 HashMap sounds = new HashMap<>() @@ -60,11 +60,16 @@ ext.parseLanguageDefintion = { File languageFile, String dictionariesDir -> boolean hasABC = true boolean hasLayout = false boolean hasSounds = false + boolean hasUpperCase = true boolean filterBySounds = false boolean areNumeralsValid = true + String iconABC = "" + String iconT9 = "" String localeString = "" String dictionaryFileName = "" + final String INVALID_FILE = "Language '${languageFile.name}' is invalid." + for (String rawLine : languageFile.readLines()) { if ( rawLine.matches("^[a-zA-Z].*") @@ -75,6 +80,7 @@ ext.parseLanguageDefintion = { File languageFile, String dictionariesDir -> && !rawLine.startsWith("hasABC") && !rawLine.startsWith("hasSpaceBetweenWords") && !rawLine.startsWith("hasUpperCase") + && !rawLine.startsWith("iconABC") && !rawLine.startsWith("iconT9") && !rawLine.startsWith("layout") && !rawLine.startsWith("locale") && !rawLine.startsWith("name") @@ -86,7 +92,7 @@ ext.parseLanguageDefintion = { File languageFile, String dictionariesDir -> def property = parts.length > 0 ? parts[0] : rawLine errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. Found unknown property: '${property}'.\n" + errorMsg += "${INVALID_FILE} Found unknown property: '${property}'.\n" } String line = rawLine.replaceFirst("#[\\s\\S]+\$", "") @@ -116,6 +122,18 @@ ext.parseLanguageDefintion = { File languageFile, String dictionariesDir -> hasABC = line.endsWith("yes") } + if (line.startsWith("hasUpperCase")) { + hasUpperCase = !line.endsWith("no") + } + + if (line.startsWith("iconABC")) { + iconABC = line.replaceFirst("^icon[^:]+:", "").trim() + } + + if (line.startsWith("iconT9")) { + iconT9 = line.replaceFirst("^icon[^:]+:", "").trim() + } + if (line.startsWith("numerals")) { areNumeralsValid = line.matches("^numerals:\\s*\\[(.,\\s*?){9}.\\]") } @@ -156,40 +174,56 @@ ext.parseLanguageDefintion = { File languageFile, String dictionariesDir -> } } + if (alphabet.isEmpty()) { + errorCount++ + errorMsg += "${INVALID_FILE} No language characters found. Make sure 'layout' contains series of characters per each key in the format: ' - [a, b, c]' and so on\n" + } + + if (!areNumeralsValid) { + errorCount++ + errorMsg += "${INVALID_FILE} 'numerals' property must contain a comma-separated list of 10 characters representing the digits from 0 to 9.\n" + } + if (!hasABC && !abcString.isEmpty()) { errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. hasABC must be 'true' when abcString is provided.\n" + errorMsg += "${INVALID_FILE} hasABC must be 'true' when abcString is provided.\n" } if (!hasLayout) { errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. Missing 'layout' property.\n" - } - - if (alphabet.isEmpty()) { - errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. No language characters found. Make sure 'layout' contains series of characters per each key in the format: ' - [a, b, c]' and so on\n" + errorMsg += "${INVALID_FILE} Missing 'layout' property.\n" } if (hasSounds && sounds.isEmpty()) { errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. 'sounds' property must contain series of phonetic transcriptions per digit sequence in the format: ' - [Yae,1221]' and so on.\n" + errorMsg += "${INVALID_FILE} 'sounds' property must contain series of phonetic transcriptions per digit sequence in the format: ' - [Yae,1221]' and so on.\n" } - if (filterBySounds && !hasSounds) { + if (!hasSounds && filterBySounds) { errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. 'filterBySounds' property can only be used with 'sounds' property.\n" + errorMsg += "${INVALID_FILE} 'filterBySounds' property can only be used with 'sounds' property.\n" + } + + if (!iconABC.isEmpty()) { + String iconError = validateIcon(INVALID_FILE, iconsDir, iconABC, true, hasABC, hasUpperCase) + if (iconError) { + errorCount++ + errorMsg += iconError + } + } + + if (!iconT9.isEmpty()) { + String iconError = validateIcon(INVALID_FILE, iconsDir, iconT9, false, hasABC, hasUpperCase) + if (iconError) { + errorCount++ + errorMsg += iconError + } } if (!localeString.matches("^[a-z]{2,3}(?:-[A-Z]{2})?\$")) { errorCount++ def msg = localeString.isEmpty() ? "Missing 'locale' property." : "Unrecognized locale format: '${localeString}'" - errorMsg += "Language '${languageFile.name}' is invalid. ${msg}\n" - } - - if (!areNumeralsValid) { - errorCount++ - errorMsg += "Language '${languageFile.name}' is invalid. 'numerals' property must contain a comma-separated list of 10 characters representing the digits from 0 to 9.\n" + errorMsg += "${INVALID_FILE} ${msg}\n" } dictionaryFile = new File("$dictionariesDir/${dictionaryFileName}") @@ -364,6 +398,33 @@ static def validateFrequency(int frequency, int maxFrequency, String dictionaryF } +static def validateIcon(String INVALID_FILE, String iconsDir, String iconName, boolean isABCIcon, boolean hasABC, boolean hasUpperCase) { + def icons = [] + + if (!hasABC && isABCIcon) { + return "${INVALID_FILE} hasABC must be 'true' when iconABC is provided.\n" + } + + if (hasUpperCase) { + icons.add(new File(iconsDir, "${iconName}_up.xml")) + icons.add(new File(iconsDir, "${iconName}_lo.xml")) + if (!isABCIcon) { + icons.add(new File(iconsDir, "${iconName}_cp.xml")) + } + } else { + icons.add(new File(iconsDir, "${iconName}.xml")) + } + + for (File icon : icons) { + if (!icon.exists()) { + return "${INVALID_FILE} Missing icon: '${icon.path}'.\n" + } + } + + return '' +} + + static def validateWord(String word, String validCharacters, boolean isAlphabeticLanguage, int lineNumber, String errorMsgPrefix) { int errorCount = 0 def errors = '' diff --git a/scripts/iconz/generate-all.sh b/scripts/iconz/generate-all.sh new file mode 100755 index 00000000..f62f1e8f --- /dev/null +++ b/scripts/iconz/generate-all.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +generate_async() { + local count=$# + local suffix=${!count} + + # Get all arguments except the last (used as Python args) + local args=("${@:1:count-1}") + + # Run Python with args and output to XML named after suffix + python generate-v3.py "${args[@]}" > "ic_lang_${suffix}.xml" & +} + +generate_all_cases() { + font_file=$1 + lang_code=$2 + file_code=$3 + alignment_lo=$4 + alignment_cp=$5 + alignment_up=$6 + + generate_async $font_file ${lang_code} ${alignment_lo} ${file_code}_lo + generate_async $font_file $(echo $lang_code | awk '{print toupper($0)}') ${alignment_up} ${file_code}_up + generate_async $font_file $(echo $lang_code | awk '{print toupper(substr($0,1,1)) substr($0,2)}') ${alignment_cp} ${file_code}_cp +} + +# 123 +generate_async NotoSans-Bold.ttf 12 -0.15 123 + +# ABC +generate_async NotoSans-Bold.ttf ab -0.15 latin_lo +generate_async NotoSans-Bold.ttf AB -0.15 latin_up +generate_async NotoSans-Bold.ttf аб -0.15 cyrillic_lo +generate_async NotoSans-Bold.ttf АБ -0.15 cyrillic_up + +# Arabic / Farsi +generate_async NotoSansArabic-Bold.ttf ع -0.05 ar +generate_async NotoSansArabic-Bold.ttf ف -0.3 fa +generate_async NotoSansArabic-Bold.ttf أﺏ -0.15 alifba + +# CJK +generate_async NotoSansJP-Bold.ttf あ -0.15 hiragana +generate_async NotoSansJP-Bold.ttf ア -0.15 katakana +generate_async NotoSansJP-Bold.ttf 漢 -0.17 kanji +generate_async NotoSansKR-Bold.ttf 한 -0.17 ko +generate_async NotoSansSC-Bold.ttf 拼 -0.17 zh_pinyin + +# Greek +generate_all_cases "NotoSans-Bold.ttf" "ελ" "el" -0.12 -0.12 -0.15 +generate_async NotoSans-Bold.ttf αβ alfabeta_lo +generate_async NotoSans-Bold.ttf ΑΒ -0.15 alfabeta_up + +# Hebrew / Yiddish +generate_async NotoSansHebrew-Bold יי -0.2 ji +generate_async NotoSansHebrew-Bold אב -0.2 he +generate_async NotoSansHebrew-Bold עב -0.17 alefbet + +# Hindi +generate_async NotoSansDevanagari-Bold.ttf ह -0.05 hi +generate_async NotoSansDevanagari-Bold.ttf कख -0.1 hi_abc + +# Gujarati +generate_async NotoSansGujarati-Bold.ttf ગુ -0.1 gu +generate_async NotoSansGujarati-Bold.ttf કખ -0.1 gu_abc + +# Tamazight / Tifinagh +generate_async NotoSansTifinagh.ttf ⵜⵎ -0.15 tm_tifinagh +generate_async NotoSansTifinagh.ttf ⴰⴱ -0.15 tifinagh + +# Thai +generate_async NotoSansThai-Bold.ttf ไท -0.15 th +generate_async NotoSansThai-Bold.ttf กข -0.15 th_abc + +generate_all_cases "NotoSans-Bold.ttf" "br" "br" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "бг" "bg" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "ca" "ca" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "hr" "hr" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "cz" "cz" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "da" "da" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "nl" "nl" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "en" "en" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "ee" "et" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "su" "su" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "fr" "fr" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "de" "de" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "hn" "hn" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "mg" "mg" -0.1 -0.1 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "id" "id" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "ga" "ga" -0.1 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "it" "it" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "sw" "sw" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "lv" "lv" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "lt" "lt" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "no" "no" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "pl" "pl" -0.08 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "pt" "pt" -0.08 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "ro" "ro" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "ру" "ru" -0.08 -0.08 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "sl" "sl" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "es" "es" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "sv" "sv" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "tm" "tm" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "tr" "tr" -0.15 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "уk" "uk" -0.05 -0.15 -0.15 +generate_all_cases "NotoSans-Bold.ttf" "vi" "vi" -0.15 -0.15 -0.15 + +wait diff --git a/scripts/iconz/generate-v3.py b/scripts/iconz/generate-v3.py new file mode 100644 index 00000000..77ff9cda --- /dev/null +++ b/scripts/iconz/generate-v3.py @@ -0,0 +1,76 @@ +import sys +from PIL import Image, ImageDraw, ImageFont +import io +import re + +# Configurations +OUTPUT_WIDTH_DP = 24 +OUTPUT_HEIGHT_DP = 16 +CANVAS_WIDTH = 48 +CANVAS_HEIGHT = 32 +FONT_SCALE = 1.0 +PADDING = 0.0 +VERTICAL_ADJUST = 0 + +if len(sys.argv) < 3: + print(f"Usage: {sys.argv[0]} FONT_FILE TEXT [VERTICAL_ADJUST]") + sys.exit(1) + +font_path = sys.argv[1] +text = sys.argv[2] + +if len(sys.argv) >= 4: + try: + VERTICAL_ADJUST += float(sys.argv[3]) + except ValueError: + print("Error: VERTICAL_ADJUST must be a float.") + sys.exit(1) + +# Create image +img = Image.new('RGBA', (CANVAS_WIDTH, CANVAS_HEIGHT), (0, 0, 0, 0)) +draw = ImageDraw.Draw(img) + +usable_width = CANVAS_WIDTH * (1 - PADDING * 2) +usable_height = CANVAS_HEIGHT * (1 - PADDING * 2) +font_size = int(min(usable_width, usable_height) * FONT_SCALE) +font = ImageFont.truetype(font_path, font_size) + +_, _, text_width, text_height = draw.textbbox((0, 0), text, font=font) + +offset_x = CANVAS_WIDTH * PADDING +offset_y = CANVAS_HEIGHT * PADDING +text_x = offset_x + (usable_width - text_width) / 2 +text_y = offset_y + (usable_height - text_height) / 2 + (CANVAS_HEIGHT * VERTICAL_ADJUST) + +draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255, 255)) + +# Output XML to STDOUT +output = io.StringIO() +output.write('\n') +output.write('\n') + +for y in range(CANVAS_HEIGHT): + x = 0 + while x < CANVAS_WIDTH: + r, g, b, a = img.getpixel((x, y)) + if a > 128: + color = (r, g, b) + start_x = x + while x < CANVAS_WIDTH: + r2, g2, b2, a2 = img.getpixel((x, y)) + if a2 <= 128 or (r2, g2, b2) != color: + break + x += 1 + width = x - start_x + color_hex = f"#{r:02X}{g:02X}{b:02X}" + output.write(f' \n') + else: + x += 1 + +output.write('\n') + +print(re.sub(r'\s+', ' ', output.getvalue()).replace('> <', '><').strip()) diff --git a/scripts/iconz/requirements.txt b/scripts/iconz/requirements.txt new file mode 100644 index 00000000..73259b7d --- /dev/null +++ b/scripts/iconz/requirements.txt @@ -0,0 +1 @@ +pillow==11.2.1