├── README.md ├── all-lang-code.txt ├── strings.xml ├── translated ├── values-af │ └── strings.xml ├── values-ak │ └── strings.xml └── values-sq │ └── strings.xml └── translator.py /README.md: -------------------------------------------------------------------------------- 1 | # android-localization-helper 2 | A python script that helps you create strings.xml for all languages in different hierarchical folder(using Google Translation API) 3 | 4 | # usage 5 | 6 | Syntax 7 | 8 | ``` 9 | python3.7 translator.py 10 | ``` 11 | 12 | Eg, 13 | ``` 14 | python3.7 translator.py en strings.xml 15 | ``` 16 | 17 | Output will be created in transalted/ folder with various langugaes folders. 18 | 19 | Paste them in your res/ folder of Android Project. 20 | 21 | # credits 22 | 23 | Combined effort from below repositories + Some Add Ons 24 | 25 | https://github.com/Ra-Na/GTranslate-strings-xml 26 | 27 | https://github.com/Swisyn/android-strings.xml-translator 28 | 29 | 30 | # other useful commands 31 | 32 | Extract only strings from strings.xml 33 | cut -d ">" -f2 strings.xml | cut -d "<" -f1 34 | 35 | Extract non translatable strings from strings.xml 36 | cat strings.xml|grep -v "translatable" | cut -d ">" -f2 | cut -d "<" -f1 37 | 38 | 39 | -------------------------------------------------------------------------------- /all-lang-code.txt: -------------------------------------------------------------------------------- 1 | "af", "ak", "sq", "am", "ar", "hy", "az", "eu", "be", "bem", "bn", "bh", "xx-bork", "bs", "br", "bg", "km", "ca", "chr", "ny", "zh-CN", "zh-TW", "co", "hr", "cs", "da", "nl", "xx-elmer", "en", "eo", "et", "ee", "fo", "tl", "fi", "fr", "fy", "gaa", "gl", "ka", "de", "el", "gn", "gu", "xx-hacker", "ht", "ha", "haw", "iw", "hi", "hu", "is", "ig", "id", "ia", "ga", "it", "ja", "jw", "kn", "kk", "rw", "rn", "xx-klingon", "kg", "ko", "kri", "ku", "ckb", "ky", "lo", "la", "lv", "ln", "lt", "loz", "lg", "ach", "mk", "mg", "ms", "ml", "mt", "mi", "mr", "mfe", "mo", "mn", "sr-ME", "ne", "pcm", "nso", "no", "nn", "oc", "or", "om", "ps", "fa", "xx-pirate", "pl", "pt-BR", "pt-PT", "pa", "qu", "ro", "rm", "nyn", "ru", "gd", "sr", "sh", "st", "tn", "crs", "sn", "sd", "si", "sk", "sl", "so", "es", "es-419", "su", "sw", "sv", "tg", "ta", "tt", "te", "th", "ti", "to", "lua", "tum", "tr", "tk", "tw", "ug", "uk", "ur", "uz", "vi", "cy", "wo", "xh", "yi", "yo", "zu" 2 | -------------------------------------------------------------------------------- /strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Hello cruel world! 3 | Mail to developer 4 | Tap on checkboxes to select items. 5 | Search 6 | Search in Design Ideas 7 | 8 | What can I search for? 9 | Do I have to have an account to search and view information? 10 | How do I search for products shown in a design? 11 | 12 | 13 | -------------------------------------------------------------------------------- /translated/values-af/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Hallo wrede wêreld! 3 | Pos na ontwikkelaar 4 | Tik op blokkies om items te kies. 5 | Soek 6 | Soek in Ontwerp Idees 7 | 8 | Waarvoor kan ek soek? 9 | Moet ek 'n rekening hê om inligting te soek en te sien? 10 | Hoe soek ek produkte wat in 'n ontwerp vertoon word? 11 | 12 | -------------------------------------------------------------------------------- /translated/values-ak/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Hello cruel world! 3 | Mail to developer 4 | Tap on checkboxes to select items. 5 | Search 6 | Search in Design Ideas 7 | 8 | What can I search for? 9 | Do I have to have an account to search and view information? 10 | How do I search for products shown in a design? 11 | 12 | -------------------------------------------------------------------------------- /translated/values-sq/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Përshëndetni botën mizore! 3 | Mail për zhvilluesin 4 | Prekni në kutitë e zgjedhjes për të zgjedhur artikujt. 5 | kërkim 6 | Kërko në Ide të Dizajnit 7 | 8 | Çfarë mund të kërkoj? 9 | A duhet të kem një llogari për të kërkuar dhe parë informacionin? 10 | Si mund të kërkoj për produktet e paraqitura në një dizajn? 11 | 12 | -------------------------------------------------------------------------------- /translator.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ### LANGUAGE CODES FOR REFERENCE 4 | 5 | # af Afrikaans 6 | # ak Akan 7 | # sq Albanian 8 | # am Amharic 9 | # ar Arabic 10 | # hy Armenian 11 | # az Azerbaijani 12 | # eu Basque 13 | # be Belarusian 14 | # bem Bemba 15 | # bn Bengali 16 | # bh Bihari 17 | # xx-bork Bork, bork, bork! 18 | # bs Bosnian 19 | # br Breton 20 | # bg Bulgarian 21 | # km Cambodian 22 | # ca Catalan 23 | # chr Cherokee 24 | # ny Chichewa 25 | # zh-CN Chinese (Simplified) 26 | # zh-TW Chinese (Traditional) 27 | # co Corsican 28 | # hr Croatian 29 | # cs Czech 30 | # da Danish 31 | # nl Dutch 32 | # xx-elmer Elmer Fudd 33 | # en English 34 | # eo Esperanto 35 | # et Estonian 36 | # ee Ewe 37 | # fo Faroese 38 | # tl Filipino 39 | # fi Finnish 40 | # fr French 41 | # fy Frisian 42 | # gaa Ga 43 | # gl Galician 44 | # ka Georgian 45 | # de German 46 | # el Greek 47 | # gn Guarani 48 | # gu Gujarati 49 | # xx-hacker Hacker 50 | # ht Haitian Creole 51 | # ha Hausa 52 | # haw Hawaiian 53 | # iw Hebrew 54 | # hi Hindi 55 | # hu Hungarian 56 | # is Icelandic 57 | # ig Igbo 58 | # id Indonesian 59 | # ia Interlingua 60 | # ga Irish 61 | # it Italian 62 | # ja Japanese 63 | # jw Javanese 64 | # kn Kannada 65 | # kk Kazakh 66 | # rw Kinyarwanda 67 | # rn Kirundi 68 | # xx-klingon Klingon 69 | # kg Kongo 70 | # ko Korean 71 | # kri Krio (Sierra Leone) 72 | # ku Kurdish 73 | # ckb Kurdish (Soranî) 74 | # ky Kyrgyz 75 | # lo Laothian 76 | # la Latin 77 | # lv Latvian 78 | # ln Lingala 79 | # lt Lithuanian 80 | # loz Lozi 81 | # lg Luganda 82 | # ach Luo 83 | # mk Macedonian 84 | # mg Malagasy 85 | # ms Malay 86 | # ml Malayalam 87 | # mt Maltese 88 | # mi Maori 89 | # mr Marathi 90 | # mfe Mauritian Creole 91 | # mo Moldavian 92 | # mn Mongolian 93 | # sr-ME Montenegrin 94 | # ne Nepali 95 | # pcm Nigerian Pidgin 96 | # nso Northern Sotho 97 | # no Norwegian 98 | # nn Norwegian (Nynorsk) 99 | # oc Occitan 100 | # or Oriya 101 | # om Oromo 102 | # ps Pashto 103 | # fa Persian 104 | # xx-pirate Pirate 105 | # pl Polish 106 | # pt-BR Portuguese (Brazil) 107 | # pt-PT Portuguese (Portugal) 108 | # pa Punjabi 109 | # qu Quechua 110 | # ro Romanian 111 | # rm Romansh 112 | # nyn Runyakitara 113 | # ru Russian 114 | # gd Scots Gaelic 115 | # sr Serbian 116 | # sh Serbo-Croatian 117 | # st Sesotho 118 | # tn Setswana 119 | # crs Seychellois Creole 120 | # sn Shona 121 | # sd Sindhi 122 | # si Sinhalese 123 | # sk Slovak 124 | # sl Slovenian 125 | # so Somali 126 | # es Spanish 127 | # es-419 Spanish (Latin American) 128 | # su Sundanese 129 | # sw Swahili 130 | # sv Swedish 131 | # tg Tajik 132 | # ta Tamil 133 | # tt Tatar 134 | # te Telugu 135 | # th Thai 136 | # ti Tigrinya 137 | # to Tonga 138 | # lua Tshiluba 139 | # tum Tumbuka 140 | # tr Turkish 141 | # tk Turkmen 142 | # tw Twi 143 | # ug Uighur 144 | # uk Ukrainian 145 | # ur Urdu 146 | # uz Uzbek 147 | # vi Vietnamese 148 | # cy Welsh 149 | # wo Wolof 150 | # xh Xhosa 151 | # yi Yiddish 152 | # yo Yoruba 153 | # zu Zulu 154 | 155 | # 156 | # SUBROUTINES 157 | # 158 | 159 | # This subroutine extracts the string including html tags 160 | # and may replace "root[i].text". 161 | # It cannot digest arbitrary encodings, so use it only if necessary. 162 | def findall_content(xml_string, tag): 163 | pattern = r"<(?:\w+:)?%(tag)s(?:[^>]*)>(.*)' 209 | after_trans=' " + language_to_translate + " =========================") 245 | 246 | # read xml structure 247 | tree = ET.parse(INFILE) 248 | root = tree.getroot() 249 | 250 | # cycle through elements 251 | for i in range(len(root)): 252 | # for each translatable string call the translation subroutine 253 | # and replace the string by its translation, 254 | # descend into each string array 255 | isTranslatable=root[i].get('translatable') 256 | print((str(i)+" =========================")) 257 | if(isTranslatable=='false'): 258 | print("Not translatable") 259 | if(root[i].tag=='string') & (isTranslatable!='false'): 260 | # Here you might want to replace root[i].text by the findall_content function 261 | # if you need to extract html tags 262 | # ~ totranslate="".join(findall_content(str(ET.tostring(root[i])),"string")) 263 | totranslate=root[i].text 264 | if(totranslate!=None): 265 | print(totranslate+"-->", end='') 266 | root[i].text=translate(totranslate,language_to_translate,INPUTLANGUAGE) 267 | print(root[i].text) 268 | if(root[i].tag=='string-array'): 269 | print("Entering string array...") 270 | for j in range(len(root[i])): 271 | # for each translatable string call the translation subroutine 272 | # and replace the string by its translation, 273 | isTranslatable=root[i][j].get('translatable') 274 | print((str(i)+" " + str(j) + " =========================")) 275 | if(isTranslatable=='false'): 276 | print("Not translatable") 277 | if(root[i][j].tag=='item') & (isTranslatable!='false'): 278 | # Here you might want to replace root[i].text by the findall_content function 279 | # if you need to extract html tags 280 | # ~ totranslate="".join(findall_content(str(ET.tostring(root[i][j])),"item")) 281 | totranslate=root[i][j].text 282 | if(totranslate!=None): 283 | print(totranslate+"-->", end='') 284 | root[i][j].text=translate(totranslate,language_to_translate,INPUTLANGUAGE) 285 | print(root[i][j].text) 286 | 287 | # write new xml file 288 | translated_file = translated_file_directory + "/strings.xml" 289 | tree.write(translated_file, encoding='utf-8') 290 | --------------------------------------------------------------------------------