15
"""Updates a .rc file with new translations"""
17
from __future__ import annotations
20
from gettext import GNUTranslations, NullTranslations
23
from typing import Optional, TextIO, Union
25
from po_utils.rcfile import (
32
from po_utils.utilities import quote, unquote
36
"af": ("LANG_AFRIKAANS", "SUBLANG_NEUTRAL"),
37
"af_ZA": ("LANG_AFRIKAANS", "SUBLANG_AFRIKAANS_SOUTH_AFRICA"),
38
"am": ("LANG_AMHARIC", "SUBLANG_NEUTRAL"),
39
"am_ET": ("LANG_AMHARIC", "SUBLANG_AMHARIC_ETHIOPIA"),
40
"ar": ("LANG_ARABIC", "SUBLANG_NEUTRAL"),
41
"ar_AE": ("LANG_ARABIC", "SUBLANG_ARABIC_UAE"),
42
"ar_BH": ("LANG_ARABIC", "SUBLANG_ARABIC_BAHRAIN"),
43
"ar_DZ": ("LANG_ARABIC", "SUBLANG_ARABIC_ALGERIA"),
44
"ar_EG": ("LANG_ARABIC", "SUBLANG_ARABIC_EGYPT"),
45
"ar_IQ": ("LANG_ARABIC", "SUBLANG_ARABIC_IRAQ"),
46
"ar_JO": ("LANG_ARABIC", "SUBLANG_ARABIC_JORDAN"),
47
"ar_KW": ("LANG_ARABIC", "SUBLANG_ARABIC_KUWAIT"),
48
"ar_LB": ("LANG_ARABIC", "SUBLANG_ARABIC_LEBANON"),
49
"ar_LY": ("LANG_ARABIC", "SUBLANG_ARABIC_LIBYA"),
50
"ar_MA": ("LANG_ARABIC", "SUBLANG_ARABIC_MOROCCO"),
51
"ar_OM": ("LANG_ARABIC", "SUBLANG_ARABIC_OMAN"),
52
"ar_QA": ("LANG_ARABIC", "SUBLANG_ARABIC_QATAR"),
53
"ar_SA": ("LANG_ARABIC", "SUBLANG_ARABIC_SAUDI_ARABIA"),
54
"ar_SY": ("LANG_ARABIC", "SUBLANG_ARABIC_SYRIA"),
55
"ar_TN": ("LANG_ARABIC", "SUBLANG_ARABIC_TUNISIA"),
56
"ar_YE": ("LANG_ARABIC", "SUBLANG_ARABIC_YEMEN"),
57
"arn": ("LANG_MAPUDUNGUN", "SUBLANG_NEUTRAL"),
58
"arn_CL": ("LANG_MAPUDUNGUN", "SUBLANG_MAPUDUNGUN_CHILE"),
59
"as": ("LANG_ASSAMESE", "SUBLANG_NEUTRAL"),
60
"as_IN": ("LANG_ASSAMESE", "SUBLANG_ASSAMESE_INDIA"),
61
"az": ("LANG_AZERBAIJANI", "SUBLANG_NEUTRAL"),
62
"az_Cyrl_AZ": ("LANG_AZERBAIJANI", "SUBLANG_AZERBAIJANI_AZERBAIJAN_CYRILLIC"),
63
"az_Latn_AZ": ("LANG_AZERBAIJANI", "SUBLANG_AZERBAIJANI_AZERBAIJAN_LATIN"),
64
"ba": ("LANG_BASHKIR", "SUBLANG_NEUTRAL"),
65
"ba_RU": ("LANG_BASHKIR", "SUBLANG_BASHKIR_RUSSIA"),
66
"be": ("LANG_BELARUSIAN", "SUBLANG_NEUTRAL"),
67
"be_BY": ("LANG_BELARUSIAN", "SUBLANG_BELARUSIAN_BELARUS"),
68
"bg": ("LANG_BULGARIAN", "SUBLANG_NEUTRAL"),
69
"bg_BG": ("LANG_BULGARIAN", "SUBLANG_BULGARIAN_BULGARIA"),
70
"bn": ("LANG_BENGALI", "SUBLANG_NEUTRAL"),
71
"bn_BD": ("LANG_BENGALI", "SUBLANG_BENGALI_BANGLADESH"),
72
"bn_IN": ("LANG_BENGALI", "SUBLANG_BENGALI_INDIA"),
73
"bo": ("LANG_TIBETAN", "SUBLANG_NEUTRAL"),
74
"bo_CN": ("LANG_TIBETAN", "SUBLANG_TIBETAN_PRC"),
75
"br": ("LANG_BRETON", "SUBLANG_NEUTRAL"),
76
"br_FR": ("LANG_BRETON", "SUBLANG_BRETON_FRANCE"),
77
"bs_Cyrl_BA": ("LANG_BOSNIAN", "SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC"),
78
"bs_Latn_BA": ("LANG_BOSNIAN", "SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN"),
79
"ca": ("LANG_CATALAN", "SUBLANG_NEUTRAL"),
80
"ca_ES": ("LANG_CATALAN", "SUBLANG_CATALAN_CATALAN"),
81
"ca_ES_valencia": ("LANG_VALENCIAN", "SUBLANG_VALENCIAN_VALENCIA"),
82
"chr": ("LANG_CHEROKEE", "SUBLANG_NEUTRAL"),
83
"chr_Cher_US": ("LANG_CHEROKEE", "SUBLANG_CHEROKEE_CHEROKEE"),
84
"co": ("LANG_CORSICAN", "SUBLANG_NEUTRAL"),
85
"co_FR": ("LANG_CORSICAN", "SUBLANG_CORSICAN_FRANCE"),
86
"cs": ("LANG_CZECH", "SUBLANG_NEUTRAL"),
87
"cs_CZ": ("LANG_CZECH", "SUBLANG_CZECH_CZECH_REPUBLIC"),
88
"cy": ("LANG_WELSH", "SUBLANG_NEUTRAL"),
89
"cy_GB": ("LANG_WELSH", "SUBLANG_WELSH_UNITED_KINGDOM"),
90
"da": ("LANG_DANISH", "SUBLANG_NEUTRAL"),
91
"da_DK": ("LANG_DANISH", "SUBLANG_DANISH_DENMARK"),
92
"de": ("LANG_GERMAN", "SUBLANG_NEUTRAL"),
93
"de_AT": ("LANG_GERMAN", "SUBLANG_GERMAN_AUSTRIAN"),
94
"de_CH": ("LANG_GERMAN", "SUBLANG_GERMAN_SWISS"),
95
"de_DE": ("LANG_GERMAN", "SUBLANG_GERMAN"),
96
"de_LI": ("LANG_GERMAN", "SUBLANG_GERMAN_LIECHTENSTEIN"),
97
"de_LU": ("LANG_GERMAN", "SUBLANG_GERMAN_LUXEMBOURG"),
98
"dsb_DE": ("LANG_LOWER_SORBIAN", "SUBLANG_LOWER_SORBIAN_GERMANY"),
99
"dv": ("LANG_DIVEHI", "SUBLANG_NEUTRAL"),
100
"dv_MV": ("LANG_DIVEHI", "SUBLANG_DIVEHI_MALDIVES"),
101
"el": ("LANG_GREEK", "SUBLANG_NEUTRAL"),
102
"el_GR": ("LANG_GREEK", "SUBLANG_GREEK_GREECE"),
103
"en": ("LANG_ENGLISH", "SUBLANG_NEUTRAL"),
104
"en_029": ("LANG_ENGLISH", "SUBLANG_ENGLISH_CARIBBEAN"),
105
"en_AU": ("LANG_ENGLISH", "SUBLANG_ENGLISH_AUS"),
106
"en_BZ": ("LANG_ENGLISH", "SUBLANG_ENGLISH_BELIZE"),
107
"en_CA": ("LANG_ENGLISH", "SUBLANG_ENGLISH_CAN"),
108
"en_GB": ("LANG_ENGLISH", "SUBLANG_ENGLISH_UK"),
109
"en_IE": ("LANG_ENGLISH", "SUBLANG_ENGLISH_EIRE"),
110
"en_IN": ("LANG_ENGLISH", "SUBLANG_ENGLISH_INDIA"),
111
"en_JM": ("LANG_ENGLISH", "SUBLANG_ENGLISH_JAMAICA"),
112
"en_MY": ("LANG_ENGLISH", "SUBLANG_ENGLISH_MALAYSIA"),
113
"en_NZ": ("LANG_ENGLISH", "SUBLANG_ENGLISH_NZ"),
114
"en_PH": ("LANG_ENGLISH", "SUBLANG_ENGLISH_PHILIPPINES"),
115
"en_SG": ("LANG_ENGLISH", "SUBLANG_ENGLISH_SINGAPORE"),
116
"en_TT": ("LANG_ENGLISH", "SUBLANG_ENGLISH_TRINIDAD"),
117
"en_US": ("LANG_ENGLISH", "SUBLANG_ENGLISH_US"),
118
"en_ZA": ("LANG_ENGLISH", "SUBLANG_ENGLISH_SOUTH_AFRICA"),
119
"en_ZW": ("LANG_ENGLISH", "SUBLANG_ENGLISH_ZIMBABWE"),
120
"es": ("LANG_SPANISH", "SUBLANG_NEUTRAL"),
121
"es_AR": ("LANG_SPANISH", "SUBLANG_SPANISH_ARGENTINA"),
122
"es_BO": ("LANG_SPANISH", "SUBLANG_SPANISH_BOLIVIA"),
123
"es_CL": ("LANG_SPANISH", "SUBLANG_SPANISH_CHILE"),
124
"es_CO": ("LANG_SPANISH", "SUBLANG_SPANISH_COLOMBIA"),
125
"es_CR": ("LANG_SPANISH", "SUBLANG_SPANISH_COSTA_RICA"),
126
"es_DO": ("LANG_SPANISH", "SUBLANG_SPANISH_DOMINICAN_REPUBLIC"),
127
"es_EC": ("LANG_SPANISH", "SUBLANG_SPANISH_ECUADOR"),
128
"es_ES": ("LANG_SPANISH", "SUBLANG_SPANISH_MODERN"),
129
"es_ES_tradnl": ("LANG_SPANISH", "SUBLANG_SPANISH"),
130
"es_GT": ("LANG_SPANISH", "SUBLANG_SPANISH_GUATEMALA"),
131
"es_HN": ("LANG_SPANISH", "SUBLANG_SPANISH_HONDURAS"),
132
"es_MX": ("LANG_SPANISH", "SUBLANG_SPANISH_MEXICAN"),
133
"es_NI": ("LANG_SPANISH", "SUBLANG_SPANISH_NICARAGUA"),
134
"es_PA": ("LANG_SPANISH", "SUBLANG_SPANISH_PANAMA"),
135
"es_PE": ("LANG_SPANISH", "SUBLANG_SPANISH_PERU"),
136
"es_PR": ("LANG_SPANISH", "SUBLANG_SPANISH_PUERTO_RICO"),
137
"es_PY": ("LANG_SPANISH", "SUBLANG_SPANISH_PARAGUAY"),
138
"es_SV": ("LANG_SPANISH", "SUBLANG_SPANISH_EL_SALVADOR"),
139
"es_US": ("LANG_SPANISH", "SUBLANG_SPANISH_US"),
140
"es_UY": ("LANG_SPANISH", "SUBLANG_SPANISH_URUGUAY"),
141
"es_VE": ("LANG_SPANISH", "SUBLANG_SPANISH_VENEZUELA"),
142
"et": ("LANG_ESTONIAN", "SUBLANG_NEUTRAL"),
143
"et_EE": ("LANG_ESTONIAN", "SUBLANG_ESTONIAN_ESTONIA"),
144
"eu": ("LANG_BASQUE", "SUBLANG_NEUTRAL"),
145
"eu_ES": ("LANG_BASQUE", "SUBLANG_BASQUE_BASQUE"),
146
"fa": ("LANG_PERSIAN", "SUBLANG_NEUTRAL"),
147
"fa_IR": ("LANG_PERSIAN", "SUBLANG_PERSIAN_IRAN"),
148
"ff": ("LANG_FULAH", "SUBLANG_NEUTRAL"),
149
"ff_Latn_SN": ("LANG_FULAH", "SUBLANG_FULAH_SENEGAL"),
150
"fi": ("LANG_FINNISH", "SUBLANG_NEUTRAL"),
151
"fi_FI": ("LANG_FINNISH", "SUBLANG_FINNISH_FINLAND"),
152
"fil": ("LANG_FILIPINO", "SUBLANG_NEUTRAL"),
153
"fil_PH": ("LANG_FILIPINO", "SUBLANG_FILIPINO_PHILIPPINES"),
154
"fo": ("LANG_FAEROESE", "SUBLANG_NEUTRAL"),
155
"fo_FO": ("LANG_FAEROESE", "SUBLANG_FAEROESE_FAROE_ISLANDS"),
156
"fr": ("LANG_FRENCH", "SUBLANG_NEUTRAL"),
157
"fr_BE": ("LANG_FRENCH", "SUBLANG_FRENCH_BELGIAN"),
158
"fr_CA": ("LANG_FRENCH", "SUBLANG_FRENCH_CANADIAN"),
159
"fr_CH": ("LANG_FRENCH", "SUBLANG_FRENCH_SWISS"),
160
"fr_FR": ("LANG_FRENCH", "SUBLANG_FRENCH"),
161
"fr_LU": ("LANG_FRENCH", "SUBLANG_FRENCH_LUXEMBOURG"),
162
"fr_MC": ("LANG_FRENCH", "SUBLANG_FRENCH_MONACO"),
163
"fy": ("LANG_FRISIAN", "SUBLANG_NEUTRAL"),
164
"fy_NL": ("LANG_FRISIAN", "SUBLANG_FRISIAN_NETHERLANDS"),
165
"ga": ("LANG_IRISH", "SUBLANG_NEUTRAL"),
166
"ga_IE": ("LANG_IRISH", "SUBLANG_IRISH_IRELAND"),
167
"gd": ("LANG_SCOTTISH_GAELIC", "SUBLANG_NEUTRAL"),
168
"gd_GB": ("LANG_SCOTTISH_GAELIC", "SUBLANG_SCOTTISH_GAELIC"),
169
"gl": ("LANG_GALICIAN", "SUBLANG_NEUTRAL"),
170
"gl_ES": ("LANG_GALICIAN", "SUBLANG_GALICIAN_GALICIAN"),
171
"gsw": ("LANG_ALSATIAN", "SUBLANG_NEUTRAL"),
172
"gsw_FR": ("LANG_ALSATIAN", "SUBLANG_ALSATIAN_FRANCE"),
173
"gu": ("LANG_GUJARATI", "SUBLANG_NEUTRAL"),
174
"gu_IN": ("LANG_GUJARATI", "SUBLANG_GUJARATI_INDIA"),
175
"ha": ("LANG_HAUSA", "SUBLANG_NEUTRAL"),
176
"ha_Latn_NG": ("LANG_HAUSA", "SUBLANG_HAUSA_NIGERIA_LATIN"),
177
"haw": ("LANG_HAWAIIAN", "SUBLANG_NEUTRAL"),
178
"haw_US": ("LANG_HAWAIIAN", "SUBLANG_HAWAIIAN_US"),
179
"he": ("LANG_HEBREW", "SUBLANG_NEUTRAL"),
180
"he_IL": ("LANG_HEBREW", "SUBLANG_HEBREW_ISRAEL"),
181
"hi": ("LANG_HINDI", "SUBLANG_NEUTRAL"),
182
"hi_IN": ("LANG_HINDI", "SUBLANG_HINDI_INDIA"),
183
"hr": ("LANG_BOSNIAN", "SUBLANG_NEUTRAL"),
184
"hr_BA": ("LANG_CROATIAN", "SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN"),
185
"hr_HR": ("LANG_CROATIAN", "SUBLANG_CROATIAN_CROATIA"),
186
"hsb": ("LANG_LOWER_SORBIAN", "SUBLANG_NEUTRAL"),
187
"hsb_DE": ("LANG_UPPER_SORBIAN", "SUBLANG_UPPER_SORBIAN_GERMANY"),
188
"hu": ("LANG_HUNGARIAN", "SUBLANG_NEUTRAL"),
189
"hu_HU": ("LANG_HUNGARIAN", "SUBLANG_HUNGARIAN_HUNGARY"),
190
"hy": ("LANG_ARMENIAN", "SUBLANG_NEUTRAL"),
191
"hy_AM": ("LANG_ARMENIAN", "SUBLANG_ARMENIAN_ARMENIA"),
192
"id": ("LANG_INDONESIAN", "SUBLANG_NEUTRAL"),
193
"id_ID": ("LANG_INDONESIAN", "SUBLANG_INDONESIAN_INDONESIA"),
194
"ig": ("LANG_IGBO", "SUBLANG_NEUTRAL"),
195
"ig_NG": ("LANG_IGBO", "SUBLANG_IGBO_NIGERIA"),
196
"ii": ("LANG_YI", "SUBLANG_NEUTRAL"),
197
"ii_CN": ("LANG_YI", "SUBLANG_YI_PRC"),
198
"is": ("LANG_ICELANDIC", "SUBLANG_NEUTRAL"),
199
"is_IS": ("LANG_ICELANDIC", "SUBLANG_ICELANDIC_ICELAND"),
200
"it": ("LANG_ITALIAN", "SUBLANG_NEUTRAL"),
201
"it_CH": ("LANG_ITALIAN", "SUBLANG_ITALIAN_SWISS"),
202
"it_IT": ("LANG_ITALIAN", "SUBLANG_ITALIAN"),
203
"iu": ("LANG_INUKTITUT", "SUBLANG_NEUTRAL"),
204
"iu_Cans_CA": ("LANG_INUKTITUT", "SUBLANG_INUKTITUT_CANADA"),
205
"iu_Latn_CA": ("LANG_INUKTITUT", "SUBLANG_INUKTITUT_CANADA_LATIN"),
206
"ja": ("LANG_JAPANESE", "SUBLANG_NEUTRAL"),
207
"ja_JP": ("LANG_JAPANESE", "SUBLANG_JAPANESE_JAPAN"),
208
"ka": ("LANG_GEORGIAN", "SUBLANG_NEUTRAL"),
209
"ka_GE": ("LANG_GEORGIAN", "SUBLANG_GEORGIAN_GEORGIA"),
210
"kk": ("LANG_KAZAK", "SUBLANG_NEUTRAL"),
211
"kk_KZ": ("LANG_KAZAK", "SUBLANG_KAZAK_KAZAKHSTAN"),
212
"kl": ("LANG_GREENLANDIC", "SUBLANG_NEUTRAL"),
213
"kl_GL": ("LANG_GREENLANDIC", "SUBLANG_GREENLANDIC_GREENLAND"),
214
"km": ("LANG_KHMER", "SUBLANG_NEUTRAL"),
215
"km_KH": ("LANG_KHMER", "SUBLANG_KHMER_CAMBODIA"),
216
"kn": ("LANG_KANNADA", "SUBLANG_NEUTRAL"),
217
"kn_IN": ("LANG_KANNADA", "SUBLANG_KANNADA_INDIA"),
218
"ko": ("LANG_KOREAN", "SUBLANG_NEUTRAL"),
219
"ko_KR": ("LANG_KOREAN", "SUBLANG_KOREAN"),
220
"kok": ("LANG_KONKANI", "SUBLANG_NEUTRAL"),
221
"kok_IN": ("LANG_KONKANI", "SUBLANG_KONKANI_INDIA"),
222
"ks": ("LANG_KASHMIRI", "SUBLANG_NEUTRAL"),
223
"ks_Deva_IN": ("LANG_KASHMIRI", "SUBLANG_KASHMIRI_SASIA"),
224
"ku": ("LANG_CENTRAL_KURDISH", "SUBLANG_NEUTRAL"),
225
"ku_Arab_IQ": ("LANG_CENTRAL_KURDISH", "SUBLANG_CENTRAL_KURDISH_IRAQ"),
226
"ky": ("LANG_KYRGYZ", "SUBLANG_NEUTRAL"),
227
"ky_KG": ("LANG_KYRGYZ", "SUBLANG_KYRGYZ_KYRGYZSTAN"),
228
"lb": ("LANG_LUXEMBOURGISH", "SUBLANG_NEUTRAL"),
229
"lb_LU": ("LANG_LUXEMBOURGISH", "SUBLANG_LUXEMBOURGISH_LUXEMBOURG"),
230
"lo": ("LANG_LAO", "SUBLANG_NEUTRAL"),
231
"lo_LA": ("LANG_LAO", "SUBLANG_LAO_LAO"),
232
"lt": ("LANG_LITHUANIAN", "SUBLANG_NEUTRAL"),
233
"lt_LT": ("LANG_LITHUANIAN", "SUBLANG_LITHUANIAN"),
234
"lv": ("LANG_LATVIAN", "SUBLANG_NEUTRAL"),
235
"lv_LV": ("LANG_LATVIAN", "SUBLANG_LATVIAN_LATVIA"),
236
"mi": ("LANG_MAORI", "SUBLANG_NEUTRAL"),
237
"mi_NZ": ("LANG_MAORI", "SUBLANG_MAORI_NEW_ZEALAND"),
238
"mk": ("LANG_MACEDONIAN", "SUBLANG_NEUTRAL"),
239
"mk_MK": ("LANG_MACEDONIAN", "SUBLANG_MACEDONIAN_MACEDONIA"),
240
"ml": ("LANG_MALAYALAM", "SUBLANG_NEUTRAL"),
241
"mn": ("LANG_MONGOLIAN", "SUBLANG_NEUTRAL"),
242
"mn_MN": ("LANG_MONGOLIAN", "SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA"),
243
"mn_Mong_CN": ("LANG_MONGOLIAN", "SUBLANG_MONGOLIAN_PRC"),
244
"mni": ("LANG_MANIPURI", "SUBLANG_NEUTRAL"),
245
"moh": ("LANG_MOHAWK", "SUBLANG_NEUTRAL"),
246
"moh_CA": ("LANG_MOHAWK", "SUBLANG_MOHAWK_MOHAWK"),
247
"mr": ("LANG_MARATHI", "SUBLANG_NEUTRAL"),
248
"mr_IN": ("LANG_MARATHI", "SUBLANG_MARATHI_INDIA"),
249
"ms": ("LANG_MALAY", "SUBLANG_NEUTRAL"),
250
"ms_BN": ("LANG_MALAY", "SUBLANG_MALAY_BRUNEI_DARUSSALAM"),
251
"ms_MY": ("LANG_MALAY", "SUBLANG_MALAY_MALAYSIA"),
252
"mt": ("LANG_MALTESE", "SUBLANG_NEUTRAL"),
253
"mt_MT": ("LANG_MALTESE", "SUBLANG_MALTESE_MALTA"),
254
"nb": ("LANG_NORWEGIAN", "SUBLANG_NEUTRAL"),
255
"nb_NO": ("LANG_NORWEGIAN", "SUBLANG_NORWEGIAN_BOKMAL"),
256
"ne": ("LANG_NEPALI", "SUBLANG_NEUTRAL"),
257
"ne_IN": ("LANG_NEPALI", "SUBLANG_NEPALI_INDIA"),
258
"ne_NP": ("LANG_NEPALI", "SUBLANG_NEPALI_NEPAL"),
259
"nl": ("LANG_DUTCH", "SUBLANG_NEUTRAL"),
260
"nl_BE": ("LANG_DUTCH", "SUBLANG_DUTCH_BELGIAN"),
261
"nl_NL": ("LANG_DUTCH", "SUBLANG_DUTCH"),
262
"nn_NO": ("LANG_NORWEGIAN", "SUBLANG_NORWEGIAN_NYNORSK"),
263
"nso": ("LANG_SOTHO", "SUBLANG_NEUTRAL"),
264
"nso_ZA": ("LANG_SOTHO", "SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA"),
265
"oc": ("LANG_OCCITAN", "SUBLANG_NEUTRAL"),
266
"oc_FR": ("LANG_OCCITAN", "SUBLANG_OCCITAN_FRANCE"),
267
"or": ("LANG_ODIA", "SUBLANG_NEUTRAL"),
268
"or_IN": ("LANG_ODIA", "SUBLANG_ODIA_INDIA"),
269
"pa": ("LANG_PUNJABI", "SUBLANG_NEUTRAL"),
270
"pa_Arab_PK": ("LANG_PUNJABI", "SUBLANG_PUNJABI_PAKISTAN"),
271
"pa_IN": ("LANG_PUNJABI", "SUBLANG_PUNJABI_INDIA"),
272
"pl": ("LANG_POLISH", "SUBLANG_NEUTRAL"),
273
"pl_PL": ("LANG_POLISH", "SUBLANG_POLISH_POLAND"),
274
"prs": ("LANG_DARI", "SUBLANG_NEUTRAL"),
275
"prs_AF": ("LANG_DARI", "SUBLANG_DARI_AFGHANISTAN"),
276
"ps": ("LANG_PASHTO", "SUBLANG_NEUTRAL"),
277
"ps_AF": ("LANG_PASHTO", "SUBLANG_PASHTO_AFGHANISTAN"),
278
"pt": ("LANG_PORTUGUESE", "SUBLANG_PORTUGUESE"),
279
"pt_BR": ("LANG_PORTUGUESE", "SUBLANG_PORTUGUESE_BRAZILIAN"),
280
"pt_PT": ("LANG_PORTUGUESE", "SUBLANG_PORTUGUESE"),
281
"quc": ("LANG_KICHE", "SUBLANG_NEUTRAL"),
282
"quc_Latn_GT": ("LANG_KICHE", "SUBLANG_KICHE_GUATEMALA"),
283
"quz": ("LANG_QUECHUA", "SUBLANG_NEUTRAL"),
284
"quz_BO": ("LANG_QUECHUA", "SUBLANG_QUECHUA_BOLIVIA"),
285
"quz_EC": ("LANG_QUECHUA", "SUBLANG_QUECHUA_ECUADOR"),
286
"quz_PE": ("LANG_QUECHUA", "SUBLANG_QUECHUA_PERU"),
287
"rm": ("LANG_ROMANSH", "SUBLANG_NEUTRAL"),
288
"rm_CH": ("LANG_ROMANSH", "SUBLANG_ROMANSH_SWITZERLAND"),
289
"ro": ("LANG_ROMANIAN", "SUBLANG_NEUTRAL"),
290
"ro_RO": ("LANG_ROMANIAN", "SUBLANG_ROMANIAN_ROMANIA"),
291
"ru": ("LANG_RUSSIAN", "SUBLANG_NEUTRAL"),
292
"ru_RU": ("LANG_RUSSIAN", "SUBLANG_RUSSIAN_RUSSIA"),
293
"rw": ("LANG_KINYARWANDA", "SUBLANG_NEUTRAL"),
294
"rw_RW": ("LANG_KINYARWANDA", "SUBLANG_KINYARWANDA_RWANDA"),
295
"sa": ("LANG_SANSKRIT", "SUBLANG_NEUTRAL"),
296
"sa_IN": ("LANG_SANSKRIT", "SUBLANG_SANSKRIT_INDIA"),
297
"sah": ("LANG_SAKHA", "SUBLANG_NEUTRAL"),
298
"sah_RU": ("LANG_SAKHA", "SUBLANG_SAKHA_RUSSIA"),
299
"sd": ("LANG_SINDHI", "SUBLANG_NEUTRAL"),
300
"sd_Arab_PK": ("LANG_SINDHI", "SUBLANG_SINDHI_PAKISTAN"),
301
"sd_Deva_IN": ("LANG_SINDHI", "SUBLANG_SINDHI_INDIA"),
302
"se": ("LANG_SAMI", "SUBLANG_NEUTRAL"),
303
"se_FI": ("LANG_SAMI", "SUBLANG_SAMI_NORTHERN_FINLAND"),
304
"se_NO": ("LANG_SAMI", "SUBLANG_SAMI_NORTHERN_NORWAY"),
305
"se_SE": ("LANG_SAMI", "SUBLANG_SAMI_NORTHERN_SWEDEN"),
306
"si": ("LANG_SINHALESE", "SUBLANG_NEUTRAL"),
307
"si_LK": ("LANG_SINHALESE", "SUBLANG_SINHALESE_SRI_LANKA"),
308
"sk": ("LANG_SLOVAK", "SUBLANG_NEUTRAL"),
309
"sk_SK": ("LANG_SLOVAK", "SUBLANG_SLOVAK_SLOVAKIA"),
310
"sl": ("LANG_SLOVENIAN", "SUBLANG_NEUTRAL"),
311
"sl_SI": ("LANG_SLOVENIAN", "SUBLANG_SLOVENIAN_SLOVENIA"),
312
"sma_NO": ("LANG_SAMI", "SUBLANG_SAMI_SOUTHERN_NORWAY"),
313
"sma_SE": ("LANG_SAMI", "SUBLANG_SAMI_SOUTHERN_SWEDEN"),
314
"smj_NO": ("LANG_SAMI", "SUBLANG_SAMI_LULE_NORWAY"),
315
"smj_SE": ("LANG_SAMI", "SUBLANG_SAMI_LULE_SWEDEN"),
316
"smn_FI": ("LANG_SAMI", "SUBLANG_SAMI_INARI_FINLAND"),
317
"sms_FI": ("LANG_SAMI", "SUBLANG_SAMI_SKOLT_FINLAND"),
318
"sq": ("LANG_ALBANIAN", "SUBLANG_NEUTRAL"),
319
"sq_AL": ("LANG_ALBANIAN", "SUBLANG_ALBANIAN_ALBANIA"),
320
"sr_Cyrl_BA": ("LANG_SERBIAN", "SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC"),
321
"sr_Cyrl_CS": ("LANG_SERBIAN", "SUBLANG_SERBIAN_CYRILLIC"),
322
"sr_Cyrl_ME": ("LANG_SERBIAN", "SUBLANG_SERBIAN_MONTENEGRO_CYRILLIC"),
323
"sr_Cyrl_RS": ("LANG_SERBIAN", "SUBLANG_SERBIAN_SERBIA_CYRILLIC"),
324
"sr_Latn_BA": ("LANG_SERBIAN", "SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN"),
325
"sr_Latn_CS": ("LANG_SERBIAN", "SUBLANG_SERBIAN_LATIN"),
326
"sr_Latn_ME": ("LANG_SERBIAN", "SUBLANG_SERBIAN_MONTENEGRO_LATIN"),
327
"sr_Latn_RS": ("LANG_SERBIAN", "SUBLANG_SERBIAN_SERBIA_LATIN"),
328
"sv": ("LANG_SWEDISH", "SUBLANG_NEUTRAL"),
329
"sv_FI": ("LANG_SWEDISH", "SUBLANG_SWEDISH_FINLAND"),
330
"sv_SE": ("LANG_SWEDISH", "SUBLANG_SWEDISH"),
331
"sw": ("LANG_SWAHILI", "SUBLANG_NEUTRAL"),
332
"sw_KE": ("LANG_SWAHILI", "SUBLANG_SWAHILI_KENYA"),
333
"syr": ("LANG_SYRIAC", "SUBLANG_NEUTRAL"),
334
"syr_SY": ("LANG_SYRIAC", "SUBLANG_SYRIAC_SYRIA"),
335
"ta": ("LANG_TAMIL", "SUBLANG_NEUTRAL"),
336
"ta_IN": ("LANG_TAMIL", "SUBLANG_TAMIL_INDIA"),
337
"ta_LK": ("LANG_TAMIL", "SUBLANG_TAMIL_SRI_LANKA"),
338
"te": ("LANG_TELUGU", "SUBLANG_NEUTRAL"),
339
"te_IN": ("LANG_TELUGU", "SUBLANG_TELUGU_INDIA"),
340
"tg": ("LANG_TAJIK", "SUBLANG_NEUTRAL"),
341
"tg_Cyrl_TJ": ("LANG_TAJIK", "SUBLANG_TAJIK_TAJIKISTAN"),
342
"th": ("LANG_THAI", "SUBLANG_NEUTRAL"),
343
"th_TH": ("LANG_THAI", "SUBLANG_THAI_THAILAND"),
344
"ti": ("LANG_TIGRINYA", "SUBLANG_NEUTRAL"),
345
"ti_ER": ("LANG_TIGRINYA", "SUBLANG_TIGRINYA_ERITREA"),
346
"ti_ET": ("LANG_TIGRINYA", "SUBLANG_TIGRINYA_ETHIOPIA"),
347
"tk": ("LANG_TURKMEN", "SUBLANG_NEUTRAL"),
348
"tk_TM": ("LANG_TURKMEN", "SUBLANG_TURKMEN_TURKMENISTAN"),
349
"tn": ("LANG_TSWANA", "SUBLANG_NEUTRAL"),
350
"tn_BW": ("LANG_TSWANA", "SUBLANG_TSWANA_BOTSWANA"),
351
"tn_ZA": ("LANG_TSWANA", "SUBLANG_TSWANA_SOUTH_AFRICA"),
352
"tr": ("LANG_TURKISH", "SUBLANG_NEUTRAL"),
353
"tr_TR": ("LANG_TURKISH", "SUBLANG_TURKISH_TURKEY"),
354
"tt": ("LANG_TATAR", "SUBLANG_NEUTRAL"),
355
"tt_RU": ("LANG_TATAR", "SUBLANG_TATAR_RUSSIA"),
356
"tzm": ("LANG_TAMAZIGHT", "SUBLANG_NEUTRAL"),
357
"tzm_Latn_DZ": ("LANG_TAMAZIGHT", "SUBLANG_TAMAZIGHT_ALGERIA_LATIN"),
358
"tzm_Tfng_MA": ("LANG_TAMAZIGHT", "SUBLANG_TAMAZIGHT_MOROCCO_TIFINAGH"),
359
"ug": ("LANG_UIGHUR", "SUBLANG_NEUTRAL"),
360
"ug_CN": ("LANG_UIGHUR", "SUBLANG_UIGHUR_PRC"),
361
"uk": ("LANG_UKRAINIAN", "SUBLANG_NEUTRAL"),
362
"uk_UA": ("LANG_UKRAINIAN", "SUBLANG_UKRAINIAN_UKRAINE"),
363
"ur": ("LANG_URDU", "SUBLANG_NEUTRAL"),
364
"ur_IN": ("LANG_URDU", "SUBLANG_URDU_INDIA"),
365
"ur_PK": ("LANG_URDU", "SUBLANG_URDU_PAKISTAN"),
366
"uz": ("LANG_UZBEK", "SUBLANG_NEUTRAL"),
367
"uz_Cyrl_UZ": ("LANG_UZBEK", "SUBLANG_UZBEK_CYRILLIC"),
368
"uz_Latn_UZ": ("LANG_UZBEK", "SUBLANG_UZBEK_LATIN"),
369
"vi": ("LANG_VIETNAMESE", "SUBLANG_NEUTRAL"),
370
"vi_VN": ("LANG_VIETNAMESE", "SUBLANG_VIETNAMESE_VIETNAM"),
371
"wo": ("LANG_WOLOF", "SUBLANG_NEUTRAL"),
372
"wo_SN": ("LANG_WOLOF", "SUBLANG_WOLOF_SENEGAL"),
373
"xh": ("LANG_XHOSA", "SUBLANG_NEUTRAL"),
374
"xh_ZA": ("LANG_XHOSA", "SUBLANG_XHOSA_SOUTH_AFRICA"),
375
"yo": ("LANG_YORUBA", "SUBLANG_NEUTRAL"),
376
"yo_NG": ("LANG_YORUBA", "SUBLANG_YORUBA_NIGERIA"),
377
"zh": ("LANG_CHINESE", "SUBLANG_NEUTRAL"),
378
"zh_CN": ("LANG_CHINESE", "SUBLANG_CHINESE_SIMPLIFIED"),
379
"zh_HK": ("LANG_CHINESE", "SUBLANG_CHINESE_HONGKONG"),
380
"zh_MO": ("LANG_CHINESE", "SUBLANG_CHINESE_MACAU"),
381
"zh_SG": ("LANG_CHINESE", "SUBLANG_CHINESE_SINGAPORE"),
382
"zh_TW": ("LANG_CHINESE", "SUBLANG_CHINESE_TRADITIONAL"),
383
"zu": ("LANG_ZULU", "SUBLANG_NEUTRAL"),
384
"zu_ZA": ("LANG_ZULU", "SUBLANG_ZULU_SOUTH_AFRICA"),
387
_SOURCE_LANG = "LANG_ENGLISH"
388
_SOURCE_SUBLANG = "SUBLANG_ENGLISH_US"
392
tokenizer: RCTokenizer, out_file: TextIO, lang: str, sublang: str
395
tokens: list[Token] = []
398
token = next(tokenizer)
399
except StopIteration:
402
if token.type in EXTRACT_SKIP_TYPES:
408
and token.type == TokenType.KEYWORD
409
and token.value == _SOURCE_LANG
411
tokens.append(Token(TokenType.KEYWORD, lang, token.line))
413
elif state == 1 and token.type == TokenType.OPERATOR and token.value == ",":
418
and token.type == TokenType.KEYWORD
419
and token.value == _SOURCE_SUBLANG
421
tokens.append(Token(TokenType.KEYWORD, sublang, token.line))
428
out_file.write(token.value)
432
tokenizer: RCTokenizer,
433
messages: NullTranslations,
436
tokens: list[Token] = []
437
message: Optional[str] = None
438
context: Optional[str] = None
441
token = next(tokenizer)
442
except StopIteration:
446
if token.type in EXTRACT_SKIP_TYPES:
449
if state == 0 and token.type == TokenType.OPEN and token.value == "(":
451
elif state == 1 and token.type == TokenType.QUOTED:
452
context = unquote(token.value)
454
elif state == 2 and token.type == TokenType.OPERATOR and token.value == ",":
456
elif state == 3 and token.type == TokenType.QUOTED:
457
message = unquote(token.value)
459
elif state == 4 and token.type == TokenType.CLOSE and token.value == ")":
460
new_message = messages.pgettext(context, message)
461
tokens = [Token(TokenType.QUOTED, quote(new_message), token.line)]
470
tokenizer: RCTokenizer,
472
messages: NullTranslations,
474
tokens: list[Token] = []
477
token = next(tokenizer)
478
except StopIteration:
481
if token.type in EXTRACT_SKIP_TYPES:
485
if token.type == TokenType.QUOTED:
486
message = unquote(token.value)
488
new_message = messages.gettext(message)
489
tokens.append(Token(TokenType.QUOTED, quote(new_message), token.line))
492
elif token.type == TokenType.KEYWORD and token.value == "NC_":
493
tokens += _process_nc(tokenizer, messages)
499
out_file.write(token.value)
502
def _write_translated(
503
tokenizer: RCTokenizer, out_file: TextIO, messages: NullTranslations, lang_tag: str
505
lang, sublang = _LANGUAGE_MAP[lang_tag]
508
token = next(tokenizer)
509
except StopIteration:
511
out_file.write(token.value)
512
if token.type != TokenType.KEYWORD:
514
if token.value == "LANGUAGE":
515
_write_language(tokenizer, out_file, lang, sublang)
516
elif token.value in RC_KEYWORDS:
517
_write_keyword(tokenizer, out_file, messages)
521
rc_path: Union[str, os.PathLike],
522
mo_path: Union[str, os.PathLike],
523
out_path: Union[None, str, os.PathLike],
525
"""Creates a translated .rc file."""
526
lang_tag = os.path.splitext(os.path.basename(mo_path))[0]
528
parts = os.path.splitext(rc_path)
529
out_path = f"{parts[0]}_{lang_tag}{parts[1]}"
530
with open(mo_path, "rb") as mo_file:
531
messages = GNUTranslations(mo_file)
532
with open(rc_path, "rt", encoding="utf-16") as rc_file:
533
tokenizer = RCTokenizer(rc_file)
534
with open(out_path, "wt", encoding="utf-16") as out_file:
535
_write_translated(tokenizer, out_file, messages, lang_tag)
538
if __name__ == "__main__":
539
parser = argparse.ArgumentParser(description="Update RC file with translations")
543
help="Resource file to update",
548
help=".mo file containing translations",
559
args = parser.parse_args()
560
update_rc(args.rcfile, args.mofile, args.output)