Celestia

Форк
0
/
updaterc.py 
560 строк · 24.8 Кб
1
#!/usr/bin/env python3
2

3
# Copyright © 2023, the Celestia Development Team
4
# Original version by Andrew Tribick
5
#
6
# Functionality based on translate_resources.pl
7
# © 2006-2021, the Celestia Development Team
8
# Original version by Christophe Teyssier <chris@teyssier.org>
9
#
10
# This program is free software; you can redistribute it and/or
11
# modify it under the terms of the GNU General Public License
12
# as published by the Free Software Foundation; either version 2
13
# of the License, or (at your option) any later version.
14

15
"""Updates a .rc file with new translations"""
16

17
from __future__ import annotations
18

19
import argparse
20
from gettext import GNUTranslations, NullTranslations
21
import os
22
import pathlib
23
from typing import Optional, TextIO, Union
24

25
from po_utils.rcfile import (
26
    EXTRACT_SKIP_TYPES,
27
    RCTokenizer,
28
    RC_KEYWORDS,
29
    Token,
30
    TokenType,
31
)
32
from po_utils.utilities import quote, unquote
33

34
# extracted from winnt.h/GetLocalInfo
35
_LANGUAGE_MAP = {
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"),
385
}
386

387
_SOURCE_LANG = "LANG_ENGLISH"
388
_SOURCE_SUBLANG = "SUBLANG_ENGLISH_US"
389

390

391
def _write_language(
392
    tokenizer: RCTokenizer, out_file: TextIO, lang: str, sublang: str
393
) -> None:
394
    state = 0
395
    tokens: list[Token] = []
396
    while True:
397
        try:
398
            token = next(tokenizer)
399
        except StopIteration:
400
            break
401

402
        if token.type in EXTRACT_SKIP_TYPES:
403
            tokens.append(token)
404
            continue
405

406
        if (
407
            state == 0
408
            and token.type == TokenType.KEYWORD
409
            and token.value == _SOURCE_LANG
410
        ):
411
            tokens.append(Token(TokenType.KEYWORD, lang, token.line))
412
            state = 1
413
        elif state == 1 and token.type == TokenType.OPERATOR and token.value == ",":
414
            tokens.append(token)
415
            state = 2
416
        elif (
417
            state == 2
418
            and token.type == TokenType.KEYWORD
419
            and token.value == _SOURCE_SUBLANG
420
        ):
421
            tokens.append(Token(TokenType.KEYWORD, sublang, token.line))
422
            break
423
        else:
424
            tokens.append(token)
425
            break
426

427
    for token in tokens:
428
        out_file.write(token.value)
429

430

431
def _process_nc(
432
    tokenizer: RCTokenizer,
433
    messages: NullTranslations,
434
) -> list[Token]:
435
    state = 0
436
    tokens: list[Token] = []
437
    message: Optional[str] = None
438
    context: Optional[str] = None
439
    while True:
440
        try:
441
            token = next(tokenizer)
442
        except StopIteration:
443
            break
444

445
        tokens.append(token)
446
        if token.type in EXTRACT_SKIP_TYPES:
447
            continue
448

449
        if state == 0 and token.type == TokenType.OPEN and token.value == "(":
450
            state = 1
451
        elif state == 1 and token.type == TokenType.QUOTED:
452
            context = unquote(token.value)
453
            state = 2
454
        elif state == 2 and token.type == TokenType.OPERATOR and token.value == ",":
455
            state = 3
456
        elif state == 3 and token.type == TokenType.QUOTED:
457
            message = unquote(token.value)
458
            state = 4
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)]
462
            break
463
        else:
464
            break
465

466
    return tokens
467

468

469
def _write_keyword(
470
    tokenizer: RCTokenizer,
471
    out_file: TextIO,
472
    messages: NullTranslations,
473
) -> None:
474
    tokens: list[Token] = []
475
    while True:
476
        try:
477
            token = next(tokenizer)
478
        except StopIteration:
479
            break
480

481
        if token.type in EXTRACT_SKIP_TYPES:
482
            tokens.append(token)
483
            continue
484

485
        if token.type == TokenType.QUOTED:
486
            message = unquote(token.value)
487
            if message.strip():
488
                new_message = messages.gettext(message)
489
                tokens.append(Token(TokenType.QUOTED, quote(new_message), token.line))
490
            else:
491
                tokens.append(token)
492
        elif token.type == TokenType.KEYWORD and token.value == "NC_":
493
            tokens += _process_nc(tokenizer, messages)
494
        else:
495
            tokens.append(token)
496
        break
497

498
    for token in tokens:
499
        out_file.write(token.value)
500

501

502
def _write_translated(
503
    tokenizer: RCTokenizer, out_file: TextIO, messages: NullTranslations, lang_tag: str
504
) -> None:
505
    lang, sublang = _LANGUAGE_MAP[lang_tag]
506
    while True:
507
        try:
508
            token = next(tokenizer)
509
        except StopIteration:
510
            break
511
        out_file.write(token.value)
512
        if token.type != TokenType.KEYWORD:
513
            continue
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)
518

519

520
def update_rc(
521
    rc_path: Union[str, os.PathLike],
522
    mo_path: Union[str, os.PathLike],
523
    out_path: Union[None, str, os.PathLike],
524
) -> None:
525
    """Creates a translated .rc file."""
526
    lang_tag = os.path.splitext(os.path.basename(mo_path))[0]
527
    if not out_path:
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)
536

537

538
if __name__ == "__main__":
539
    parser = argparse.ArgumentParser(description="Update RC file with translations")
540
    parser.add_argument(
541
        "rcfile",
542
        type=pathlib.Path,
543
        help="Resource file to update",
544
    )
545
    parser.add_argument(
546
        "mofile",
547
        type=pathlib.Path,
548
        help=".mo file containing translations",
549
    )
550
    parser.add_argument(
551
        "-o",
552
        "--output",
553
        dest="output",
554
        type=pathlib.Path,
555
        help="Output file",
556
        required=False,
557
    )
558

559
    args = parser.parse_args()
560
    update_rc(args.rcfile, args.mofile, args.output)
561

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.