修改为东南天坐标系

This commit is contained in:
2026-01-20 09:49:52 +08:00
parent 9538757047
commit 333fad40ac
7201 changed files with 1030888 additions and 85410 deletions

View File

@@ -0,0 +1,21 @@
import datetime
from importlib.metadata import version
from .language import ALL_LANGUAGES, Language, LanguageNotFoundError
# __version__ is based on calendar versioning (https://calver.org/).
# __version__ and DATA_LAST_UPDATED are intentionally kept separate.
# While DATA_LAST_UPDATED is strictly the date for the ISO 639-3 data release,
# __version__ can be bumped for changes other than data updates.
__version__ = version("python-iso639")
DATA_LAST_UPDATED = datetime.date(2025, 10, 15)
__all__ = [
"__version__",
"ALL_LANGUAGES",
"DATA_LAST_UPDATED",
"Language",
"LanguageNotFoundError",
]

View File

@@ -0,0 +1,117 @@
from __future__ import annotations
import csv
import os
from collections import defaultdict
from enum import Enum
class _CodesColumn(Enum):
ID = "Id"
PART2B = "Part2b"
PART2T = "Part2t"
PART1 = "Part1"
SCOPE = "Scope"
TYPE = "Language_Type"
REF_NAME = "Ref_Name"
COMMENT = "Comment"
class _NameIndexColumn(Enum):
ID = "Id"
PRINT_NAME = "Print_Name"
INVERTED_NAME = "Inverted_Name"
class _RetirementsColumn(Enum):
ID = "Id"
REF_NAME = "Ref_Name"
RET_REASON = "Ret_Reason"
CHANGE_TO = "Change_To"
REMEDY = "Ret_Remedy"
EFFECTIVE = "Effective"
class _MacrolanguagesColumn(Enum):
ID = "I_Id"
MID = "M_Id"
STATUS = "I_Status"
_COLUMN_TYPE = (
_CodesColumn | _NameIndexColumn | _RetirementsColumn | _MacrolanguagesColumn
)
_ROW_TYPE = dict[_COLUMN_TYPE, str]
class _Table(Enum):
CODES = _CodesColumn
NAME_INDEX = _NameIndexColumn
RETIREMENTS = _RetirementsColumn
MACROLANGUAGES = _MacrolanguagesColumn
_THIS_DIR = os.path.dirname(__file__)
_DATA_TSV_PATHS = {
_Table.CODES: os.path.join(_THIS_DIR, "iso-639-3.tab"),
_Table.NAME_INDEX: os.path.join(_THIS_DIR, "iso-639-3_Name_Index.tab"),
_Table.MACROLANGUAGES: os.path.join(_THIS_DIR, "iso-639-3-macrolanguages.tab"),
_Table.RETIREMENTS: os.path.join(_THIS_DIR, "iso-639-3_Retirements.tab"),
}
def _load_tsv(table: _Table) -> list[_ROW_TYPE]:
column = table.value
with open(_DATA_TSV_PATHS[table], encoding="utf-8", newline="") as tsv_file:
tsv_reader = csv.DictReader(tsv_file, delimiter="\t")
return [{column(k): v for k, v in row.items()} for row in tsv_reader]
_PART3_TO_CODES: dict[str, _ROW_TYPE] = {
row[_CodesColumn.ID]: row for row in _load_tsv(_Table.CODES)
}
_part3_to_name_index: defaultdict[str, list[_ROW_TYPE]] = defaultdict(list)
for row in _load_tsv(_Table.NAME_INDEX):
_part3_to_name_index[row[_NameIndexColumn.ID]].append(row)
_PART3_TO_NAME_INDEX: dict[str, list[_ROW_TYPE]] = dict(_part3_to_name_index)
_PART3_TO_RETIREMENTS: dict[str, _ROW_TYPE] = {
row[_RetirementsColumn.ID]: row for row in _load_tsv(_Table.RETIREMENTS)
}
_PART3_TO_MACROLANGUAGES: dict[str, _ROW_TYPE] = {
row[_MacrolanguagesColumn.ID]: row for row in _load_tsv(_Table.MACROLANGUAGES)
}
_PART2B_TO_PART3: dict[str, str] = {
row[_CodesColumn.PART2B]: part3
for part3, row in _PART3_TO_CODES.items()
if row[_CodesColumn.PART2B]
}
_PART2T_TO_PART3: dict[str, str] = {
row[_CodesColumn.PART2T]: part3
for part3, row in _PART3_TO_CODES.items()
if row[_CodesColumn.PART2T]
}
_PART1_TO_PART3: dict[str, str] = {
row[_CodesColumn.PART1]: part3
for part3, row in _PART3_TO_CODES.items()
if row[_CodesColumn.PART1]
}
_REF_NAME_TO_PART3: dict[str, str] = {
row[_CodesColumn.REF_NAME]: part3
for part3, row in _PART3_TO_CODES.items()
if row[_CodesColumn.REF_NAME]
}
_PRINT_NAME_TO_PART3: dict[str, str] = {
row[_NameIndexColumn.PRINT_NAME]: part3
for part3, rows in _PART3_TO_NAME_INDEX.items()
for row in rows
if row[_NameIndexColumn.PRINT_NAME]
}
_INVERTED_NAME_TO_PART3: dict[str, str] = {
row[_NameIndexColumn.INVERTED_NAME]: part3
for part3, rows in _PART3_TO_NAME_INDEX.items()
for row in rows
if row[_NameIndexColumn.INVERTED_NAME]
}

View File

@@ -0,0 +1,460 @@
M_Id I_Id I_Status
aka fat A
aka twi A
ara aao A
ara abh A
ara abv A
ara acm A
ara acq A
ara acw A
ara acx A
ara acy A
ara adf A
ara aeb A
ara aec A
ara afb A
ara ajp R
ara apc A
ara apd A
ara arb A
ara arq A
ara ars A
ara ary A
ara arz A
ara auz A
ara avl A
ara ayh A
ara ayl A
ara ayn A
ara ayp A
ara bbz R
ara pga A
ara shu A
ara ssh A
aym ayc A
aym ayr A
aze azb A
aze azj A
bal bcc A
bal bgn A
bal bgp A
bik bcl A
bik bhk R
bik bln A
bik bto A
bik cts A
bik fbl A
bik lbl A
bik rbl A
bik ubl A
bnc ebk A
bnc lbk A
bnc obk A
bnc rbk A
bnc vbk A
bua bxm A
bua bxr A
bua bxu A
chm mhr A
chm mrj A
cre crj A
cre crk A
cre crl A
cre crm A
cre csw A
cre cwd A
del umu A
del unm A
den scs A
den xsl A
din dib A
din dik A
din dip A
din diw A
din dks A
doi dgo A
doi xnr A
est ekk A
est vro A
fas pes A
fas prs A
ful ffm A
ful fub A
ful fuc A
ful fue A
ful fuf A
ful fuh A
ful fui A
ful fuq A
ful fuv A
gba bdt A
gba gbp A
gba gbq A
gba gmm A
gba gso A
gba gya A
gba mdo R
gon esg A
gon ggo R
gon gno A
gon wsg A
grb gbo A
grb gec A
grb grj A
grb grv A
grb gry A
grn gnw A
grn gug A
grn gui A
grn gun A
grn nhd A
hai hax A
hai hdn A
hbs bos A
hbs cnr A
hbs hrv A
hbs srp A
hmn blu R
hmn cqd A
hmn hea A
hmn hma A
hmn hmc A
hmn hmd A
hmn hme A
hmn hmg A
hmn hmh A
hmn hmi A
hmn hmj A
hmn hml A
hmn hmm A
hmn hmp A
hmn hmq A
hmn hms A
hmn hmw A
hmn hmy A
hmn hmz A
hmn hnj A
hmn hrm A
hmn huj A
hmn mmr A
hmn muq A
hmn mww A
hmn sfm A
iku ike A
iku ikt A
ipk esi A
ipk esk A
jrb ajt R
jrb aju A
jrb jye A
jrb yhd A
jrb yud A
kau kby A
kau knc A
kau krt A
kln enb A
kln eyo A
kln niq A
kln oki A
kln pko A
kln sgc A
kln spy A
kln tec A
kln tuy A
kok gom A
kok knn A
kom koi A
kom kpv A
kon kng A
kon kwy A
kon ldi A
kpe gkp A
kpe xpe A
kur ckb A
kur kmr A
kur sdh A
lah hnd A
lah hno A
lah jat A
lah phr A
lah pmu R
lah pnb A
lah skr A
lah xhe A
lav ltg A
lav lvs A
luy bxk A
luy ida A
luy lkb A
luy lko A
luy lks A
luy lri A
luy lrm A
luy lsm A
luy lto A
luy lts A
luy lwg A
luy nle A
luy nyd A
luy rag A
man emk A
man mku A
man mlq A
man mnk A
man msc A
man mwk A
man myq R
mlg bhr A
mlg bjq R
mlg bmm A
mlg bzc A
mlg msh A
mlg plt A
mlg skg A
mlg tdx A
mlg tkg A
mlg txy A
mlg xmv A
mlg xmw A
mon khk A
mon mvf A
msa bjn A
msa btj A
msa bve A
msa bvu A
msa coa A
msa dup A
msa hji A
msa ind A
msa jak A
msa jax A
msa kvb A
msa kvr A
msa kxd A
msa lce A
msa lcf A
msa liw A
msa max A
msa meo A
msa mfa A
msa mfb A
msa min A
msa mly R
msa mqg A
msa msi A
msa mui A
msa orn A
msa ors A
msa pel A
msa pse A
msa tmw A
msa urk A
msa vkk A
msa vkt A
msa xmm A
msa zlm A
msa zmi A
msa zsm A
mwr dhd A
mwr mtr A
mwr mve A
mwr rwr A
mwr swv A
mwr wry A
nep dty A
nep npi A
nor nno A
nor nob A
oji ciw A
oji ojb A
oji ojc A
oji ojg A
oji ojs A
oji ojw A
oji otw A
ori ory A
ori spv A
orm gax A
orm gaz A
orm hae A
orm orc A
pus pbt A
pus pbu A
pus pst A
que cqu R
que qub A
que qud A
que quf A
que qug A
que quh A
que quk A
que qul A
que qup A
que qur A
que qus A
que quw A
que qux A
que quy A
que quz A
que qva A
que qvc A
que qve A
que qvh A
que qvi A
que qvj A
que qvl A
que qvm A
que qvn A
que qvo A
que qvp A
que qvs A
que qvw A
que qvz A
que qwa A
que qwc A
que qwh A
que qws A
que qxa A
que qxc A
que qxh A
que qxl A
que qxn A
que qxo A
que qxp A
que qxr A
que qxt A
que qxu A
que qxw A
raj bgq A
raj gda A
raj gju A
raj hoj A
raj mup A
raj wbr A
rom rmc A
rom rmf A
rom rml A
rom rmn A
rom rmo A
rom rmw A
rom rmy A
san cls A
san vsn A
sqi aae A
sqi aat A
sqi aln A
sqi als A
srd sdc A
srd sdn A
srd src A
srd sro A
swa swc A
swa swh A
syr aii A
syr cld A
tmh taq A
tmh thv A
tmh thz A
tmh ttq A
uzb uzn A
uzb uzs A
yid ydd A
yid yih A
zap zaa A
zap zab A
zap zac A
zap zad A
zap zae A
zap zaf A
zap zai A
zap zam A
zap zao A
zap zaq A
zap zar A
zap zas A
zap zat A
zap zav A
zap zaw A
zap zax A
zap zca A
zap zcd A
zap zoo A
zap zpa A
zap zpb A
zap zpc A
zap zpd A
zap zpe A
zap zpf A
zap zpg A
zap zph A
zap zpi A
zap zpj A
zap zpk A
zap zpl A
zap zpm A
zap zpn A
zap zpo A
zap zpp A
zap zpq A
zap zpr A
zap zps A
zap zpt A
zap zpu A
zap zpv A
zap zpw A
zap zpx A
zap zpy A
zap zpz A
zap zsr A
zap ztc R
zap zte A
zap ztg A
zap ztl A
zap ztm A
zap ztn A
zap ztp A
zap ztq A
zap zts A
zap ztt A
zap ztu A
zap ztx A
zap zty A
zha ccx R
zha ccy R
zha zch A
zha zeh A
zha zgb A
zha zgm A
zha zgn A
zha zhd A
zha zhn A
zha zlj A
zha zln A
zha zlq A
zha zqe A
zha zyb A
zha zyg A
zha zyj A
zha zyn A
zha zzj A
zho cdo A
zho cjy A
zho cmn A
zho cnp A
zho cpx A
zho csp A
zho czh A
zho czo A
zho gan A
zho hak A
zho hnm A
zho hsn A
zho luh A
zho lzh A
zho mnp A
zho nan A
zho sjc A
zho wuu A
zho yue A
zza diq A
zza kiu A

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,387 @@
Id Ref_Name Ret_Reason Change_To Ret_Remedy Effective
fri Western Frisian C fry 2005-11-16
auv Auvergnat M oci 2007-03-14
gsc Gascon M oci 2007-03-14
lms Limousin M oci 2007-03-14
lnc Languedocien M oci 2007-03-14
prv Provençal M oci 2007-03-14
amd Amapá Creole N 2007-07-18
bgh Bogan D bbh 2007-07-18
bnh Banawá M jaa 2007-07-18
bvs Belgian Sign Language S Split into Langue des signes de Belgique Francophone [sfb], and Vlaamse Gebarentaal [vgt] 2007-07-18
ccy Southern Zhuang S Split into five languages: Nong Zhuang [zhn]; Yang Zhuang [zyg]; Yongnan Zhuang [zyn]; Zuojiang Zhuang [zzj]; Dai Zhuang [zhd]. 2007-07-18
cit Chittagonian S Split into Rohingya [rhg], and Chittagonian (new identifier [ctg]) 2007-07-18
flm Falam Chin S Split into Ranglong [rnl], and Falam Chin (new identifier [cfm]). 2007-07-18
jap Jaruára M jaa 2007-07-18
kob Kohoroxitari M xsu 2007-07-18
mob Moinba S Split into five languages: Chug [cvg]; Lish [lsh]; Kalaktang Monpa [kkf]; Tawang Monpa [twm]; Sartang [onp] 2007-07-18
mzf Aiku S Split into four languages: Ambrak [aag]; Yangum Dey [yde]; Yangum Gel [ygl]; Yangum Mon [ymo] 2007-07-18
nhj Tlalitzlipa Nahuatl M nhi 2007-07-18
nhs Southeastern Puebla Nahuatl S Split into Sierra Negra Nahuatl [nsu] and Southeastern Puebla Nahuatl [npl] 2007-07-18
tmx Tomyang M ybi 2007-07-18
tot Patla-Chicontla Totonac S Split into Upper Necaxa Totonac [tku] and Tecpatlán Totonac [tcw] 2007-07-18
xmi Miarrã N 2007-07-18
yib Yinglish M eng 2007-07-18
ztc Lachirioag Zapotec M zty 2007-07-18
atf Atuence N 2007-08-10
bqe Navarro-Labourdin Basque M eus 2007-08-10
bsz Souletin Basque M eus 2007-08-10
occ Occidental D ile 2007-12-07
aex Amerax M eng 2008-01-14
ahe Ahe M knx 2008-01-14
aiz Aari S Split into Aari [aiw] (new identifier) and Gayil [gyl] 2008-01-14
akn Amikoana N 2008-01-14
arf Arafundi S Split into three languages: Andai [afd]; Nanubae [afk]; Tapei [afp] 2008-01-14
azr Adzera S Split into three languages: Adzera [adz] (new identifier), Sukurum [zsu] and Sarasira [zsa] 2008-01-14
bcx Pamona S Split into Pamona [pmf] (new identifier) and Batui [zbt] 2008-01-14
bii Bisu S Split into Bisu [bzi] (new identifier) and Laomian [lwm] 2008-01-14
bke Bengkulu M pse 2008-01-14
blu Hmong Njua S Split into four languages: Hmong Njua [hnj] (new identifier); Chuanqiandian Cluster Miao [cqd]; Horned Miao [hrm]; Small Flowery Miao [sfm] 2008-01-14
boc Bakung Kenyah M xkl 2008-01-14
bsd Sarawak Bisaya M bsb 2008-01-14
bwv Bahau River Kenyah N 2008-01-14
bxt Buxinhua D bgk 2008-01-14
byu Buyang S Split into three languages: E'ma Buyang [yzg]; Langnian Buyang [yln]; Baha Buyang [yha] 2008-01-14
ccx Northern Zhuang S Split into ten languages: Guibian Zh [zgn]; Liujiang Zh [zlj]; Qiubei Zh [zqe]; Guibei Zh [zgb]; Youjiang Zh [zyj]; Central Hongshuihe Zh [zch]; Eastern Hongshuihe Zh [zeh]; Liuqian Zh [zlq]; Yongbei Zh [zyb]; Lianshan Zh [zln]. 2008-01-14
cru Carútana M bwi 2008-01-14
dat Darang Deng D mhu 2008-01-14
dyk Land Dayak N 2008-01-14
eni Enim M pse 2008-01-14
fiz Izere S Split into Ganang [gne] and Izere [izr] (new identifier) 2008-01-14
gen Geman Deng D mxj 2008-01-14
ggh Garreh-Ajuran N 2008-01-14
itu Itutang M mzu 2008-01-14
kds Lahu Shi S Split into Kucong [lkc] and Lahu Shi [lhi] (new identifier) 2008-01-14
knh Kayan River Kenyah N 2008-01-14
krg North Korowai M khe 2008-01-14
krq Krui M ljp 2008-01-14
kxg Katingan M nij 2008-01-14
lmt Lematang M mui 2008-01-14
lnt Lintang M pse 2008-01-14
lod Berawan S Split into three languages: West Berawan [zbw], Central Berawan [zbc], and East Berawan [zbe] 2008-01-14
mbg Northern Nambikuára S Split into six languages: Alapmunte [apv]; Lakondê [lkd]; Latundê [ltn]; Mamaindé [wmd]; Tawandê [xtw]; Yalakalore [xyl] 2008-01-14
mdo Southwest Gbaya S Split into Southwest Gbaya [gso] (new identifier) and Gbaya-Mbodomo [gmm] 2008-01-14
mhv Arakanese S Split into Marma [rmz] and Rakhine [rki] 2008-01-14
miv Mimi M amj 2008-01-14
mqd Madang M xkl 2008-01-14
nky Khiamniungan Naga S Split into three languages: Khiamniungan Naga [kix] (new identifier); Para Naga [pzn]; Makuri Naga [jmn] 2008-01-14
nxj Nyadu M byd 2008-01-14
ogn Ogan M pse 2008-01-14
ork Orokaiva S Split into Orokaiva [okv] (new identifier), Aeka [aez] and Hunjara-Kaina Ke [hkk] 2008-01-14
paj Ipeka-Tapuia M kpc 2008-01-14
pec Southern Pesisir M ljp 2008-01-14
pen Penesak M mui 2008-01-14
plm Palembang M mui 2008-01-14
poj Lower Pokomo M pkb 2008-01-14
pun Pubian M ljp 2008-01-14
rae Ranau M ljp 2008-01-14
rjb Rajbanshi S Split into Kamta (India) / Rangpuri (Bangladesh) [rkt] and Rajbanshi (Nepal) [rjs] 2008-01-14
rws Rawas M mui 2008-01-14
sdd Semendo M pse 2008-01-14
sdi Sindang Kelingi M liw 2008-01-14
skl Selako M knx 2008-01-14
slb Kahumamahon Saluan M loe 2008-01-14
srj Serawai M pse 2008-01-14
suf Tarpia S Split into Tarpia [tpf] (new identifier) and Kaptiau [kbi] 2008-01-14
suh Suba S Split into Suba [sxb] (Kenya) and Suba-Simbita [ssc] (Tanzania) 2008-01-14
suu Sungkai M ljp 2008-01-14
szk Sizaki M ikz 2008-01-14
tle Southern Marakwet D enb 2008-01-14
tnj Tanjong M kxn 2008-01-14
ttx Tutong 1 M bsb 2008-01-14
ubm Upper Baram Kenyah N 2008-01-14
vky Kayu Agung M kge 2008-01-14
vmo Muko-Muko M min 2008-01-14
wre Ware N 2008-01-14
xah Kahayan M nij 2008-01-14
xkm Mahakam Kenyah N 2008-01-14
xuf Kunfal M awn 2008-01-14
yio Dayao Yi M lpo 2008-01-14
ymj Muji Yi S Split into five languages: Muji, Southern [ymc], Mojii [ymi], Qila Muji [ymq], Northern Muji [ymx], and Muzi [ymz] 2008-01-14
ypl Pula Yi S Split into three languages: Phola [ypg], Phala [ypa] and Alo Phola [ypo] 2008-01-14
ypw Puwa Yi S Split into three languages: Hlepho Phowa [yhl], Labo Phowa [ypb], and Ani Phowa [ypn] 2008-01-14
ywm Wumeng Yi M ywu 2008-01-14
yym Yuanjiang-Mojiang Yi S Split into Southern Nisu [nsd] and Southwestern Nisu [nsv] 2008-01-14
mly Malay (individual language) S Split into four languages: Standard Malay [zsm], Haji [hji], Papuan Malay [pmy] and Malay (individual language) [zlm] 2008-02-18
muw Mundari S Split into Munda [unx] and Mundari [unr] (new identifier) 2008-02-18
xst Silt'e S Split into Wolane [wle] and Silt'e [stv] (new identifier) 2008-02-28
ope Old Persian D peo 2008-04-18
scc Serbian D srp 2008-06-28
scr Croatian D hrv 2008-06-28
xsk Sakan D kho 2008-10-23
mol Moldavian M ron 2008-11-03
aay Aariya N 2009-01-16
acc Cubulco Achí M acr 2009-01-16
cbm Yepocapa Southwestern Cakchiquel M cak 2009-01-16
chs Chumash N 2009-01-16
ckc Northern Cakchiquel M cak 2009-01-16
ckd South Central Cakchiquel M cak 2009-01-16
cke Eastern Cakchiquel M cak 2009-01-16
ckf Southern Cakchiquel M cak 2009-01-16
cki Santa María De Jesús Cakchiquel M cak 2009-01-16
ckj Santo Domingo Xenacoj Cakchiquel M cak 2009-01-16
ckk Acatenango Southwestern Cakchiquel M cak 2009-01-16
ckw Western Cakchiquel M cak 2009-01-16
cnm Ixtatán Chuj M cac 2009-01-16
cti Tila Chol M ctu 2009-01-16
cun Cunén Quiché M quc 2009-01-16
eml Emiliano-Romagnolo S Split into Emilian [egl] and Romagnol [rgn] 2009-01-16
eur Europanto N 2009-01-16
gmo Gamo-Gofa-Dawro S Split into three languages: Gamo [gmv], Gofa [gof], and Dawro [dwr] 2009-01-16
hsf Southeastern Huastec M hus 2009-01-16
hva San Luís Potosí Huastec M hus 2009-01-16
ixi Nebaj Ixil M ixl 2009-01-16
ixj Chajul Ixil M ixl 2009-01-16
jai Western Jacalteco M jac 2009-01-16
mms Southern Mam M mam 2009-01-16
mpf Tajumulco Mam M mam 2009-01-16
mtz Tacanec M mam 2009-01-16
mvc Central Mam M mam 2009-01-16
mvj Todos Santos Cuchumatán Mam M mam 2009-01-16
poa Eastern Pokomam M poc 2009-01-16
pob Western Pokomchí M poh 2009-01-16
pou Southern Pokomam M poc 2009-01-16
ppv Papavô N 2009-01-16
quj Joyabaj Quiché M quc 2009-01-16
qut West Central Quiché M quc 2009-01-16
quu Eastern Quiché M quc 2009-01-16
qxi San Andrés Quiché M quc 2009-01-16
sic Malinguat S Split into Keak [keh] and Sos Kundi [sdk] 2009-01-16
stc Santa Cruz S Split into Natügu [ntu] and Nalögo [nlz] 2009-01-16
tlz Toala' M rob 2009-01-16
tzb Bachajón Tzeltal M tzh 2009-01-16
tzc Chamula Tzotzil M tzo 2009-01-16
tze Chenalhó Tzotzil M tzo 2009-01-16
tzs San Andrés Larrainzar Tzotzil M tzo 2009-01-16
tzt Western Tzutujil M tzj 2009-01-16
tzu Huixtán Tzotzil M tzo 2009-01-16
tzz Zinacantán Tzotzil M tzo 2009-01-16
vlr Vatrata S Split into Vera'a [vra] and Lemerig [lrz] 2009-01-16
yus Chan Santa Cruz Maya M yua 2009-01-16
nfg Nyeng M nfd 2009-01-26
nfk Shakara M nfd 2009-01-26
agp Paranan S Split into Pahanan Agta [apf] and Paranan [prf] (new identifier) 2010-01-18
bhk Albay Bicolano S Split into Buhi'non Bikol [ubl]; Libon Bikol [lbl]; Miraya Bikol [rbl]; West Albay Bikol [fbl] 2010-01-18
bkb Finallig S Split into Eastern Bontok [ebk] and Southern Bontok [obk] 2010-01-18
btb Beti (Cameroon) D beb 2010-01-18
cjr Chorotega M mom 2010-01-18
cmk Chimakum D xch 2010-01-18
drh Darkhat M khk 2010-01-18
drw Darwazi M prs 2010-01-18
gav Gabutamon M dev 2010-01-18
mof Mohegan-Montauk-Narragansett S Split into Mohegan-Pequot [xpq] and Narragansett [xnt] 2010-01-18
mst Cataelano Mandaya M mry 2010-01-18
myt Sangab Mandaya M mry 2010-01-18
rmr Caló S Split into Caló [rmq] and Erromintxela [emx] 2010-01-18
sgl Sanglechi-Ishkashimi S Split into Sanglechi [sgy] and Ishkashimi [isk] 2010-01-18
sul Surigaonon S Split into Tandaganon [tgn] and Surigaonon [sgd] (new identifier) 2010-01-18
sum Sumo-Mayangna S Split into Mayangna [yan] and Ulwa [ulw] 2010-01-18
tnf Tangshewi M prs 2010-01-18
wgw Wagawaga S Split into Yaleba [ylb] and Wagawaga [wgb] (new identifier) 2010-01-18
ayx Ayi (China) D nun 2011-05-18
bjq Southern Betsimisaraka Malagasy S Split into Southern Betsimisaraka [bzc] and Tesaka Malagasy [tkg] 2011-05-18
dha Dhanwar (India) N 2011-05-18
dkl Kolum So Dogon S Split into Ampari Dogon [aqd] and Mombo Dogon [dmb] 2011-05-18
mja Mahei N 2011-05-18
nbf Naxi S Split into Naxi [nxq] and Narua [nru] 2011-05-18
noo Nootka S Split into [dtd] Ditidaht and [nuk] Nuu-chah-nulth 2011-05-18
tie Tingal M ras 2011-05-18
tkk Takpa D twm 2011-05-18
baz Tunen S Split into Tunen [tvu] and Nyokon [nvo] 2012-02-03
bjd Bandjigali M drl 2012-02-03
ccq Chaungtha M rki 2012-02-03
cka Khumi Awa Chin M cmr 2012-02-03
dap Nisi (India) S Split into Nyishi [njz] and Tagin [tgj] 2012-02-03
dwl Walo Kumbe Dogon S Split into Dogon, Bankan Tey (Walo) [dbw] and Dogon, Ben Tey (Beni) [dbt] 2012-02-03
elp Elpaputih N 2012-02-03
gbc Garawa S Split into Garrwa [wrk] and Wanyi [wny] 2012-02-03
gio Gelao S Split into Qau [gqu] and A'ou [aou] 2012-02-03
hrr Horuru M jal 2012-02-03
ibi Ibilo M opa 2012-02-03
jar Jarawa (Nigeria) S Split into Gwak [jgk] and Bankal [jjr] 2012-02-03
kdv Kado S Split into Kadu [zkd] and Kanan [zkn] 2012-02-03
kgh Upper Tanudan Kalinga M kml 2012-02-03
kpp Paku Karen S Split into Paku Karen [jkp] and Mobwa Karen [jkm] 2012-02-03
kzh Kenuzi-Dongola S Split into Andaandi (Dongolawi) [dgl] and Kenzi (Mattoki) [xnz] 2012-02-03
mgx Omati S Split into Barikewa [jbk] and Mouwase [jmw] 2012-02-03
nln Durango Nahuatl S Split into Eastern Durango Nahuatl [azd] and Western Durango Nahuatl [azn] 2012-02-03
pbz Palu N 2012-02-03
pgy Pongyong N 2012-02-03
sca Sansu M hle 2012-02-03
tlw South Wemale M weo 2012-02-03
unp Worora S Split into Worrorra [wro] and Unggumi [xgu]. 2012-02-03
wiw Wirangu S Split into Wirangu [wgu] and Nauo [nwo] 2012-02-03
ybd Yangbye M rki 2012-02-03
yen Yendang S Split into Yendang [ynq] and Yotti [yot] 2012-02-03
yma Yamphe M lrr 2012-02-03
daf Dan S Split into Dan [dnj] and Kla-Dan [lda] 2013-01-23
djl Djiwarli S Split into Djiwarli [dze] and Thiin [iin] 2013-01-23
ggr Aghu Tharnggalu S Split into Aghu-Tharnggala [gtu], Gugu-Mini [ggm], and Ikarranggal [ikr] 2013-01-23
ilw Talur M gal 2013-01-23
izi Izi-Ezaa-Ikwo-Mgbo S Split into Izii [izz], Ezaa [eza], Ikwo [iqw], Mgbolizhia [gmz] 2013-01-23
meg Mea M cir 2013-01-23
mld Malakhel N 2013-01-23
mnt Maykulan S Split into Mayi-Kulan [xyk], Mayi-Thakurti [xyt], Mayi-Yapi [xyj], and Wunumara [wnn] 2013-01-23
mwd Mudbura S Split into Karranga [xrq] and Mudburra [dmw] 2013-01-23
myq Forest Maninka N 2013-01-23
nbx Ngura S Split into Eastern Karnic [ekc], Garlali [gll], Punthamara [xpt], Wangkumara [xwk], and Badjiri [jbi] 2013-01-23
nlr Ngarla S Split into Ngarla [nrk] and Yinhawangka [ywg] 2013-01-23
pcr Panang M adx 2013-01-23
ppr Piru M lcq 2013-01-23
tgg Tangga S Split into Fanamaket [bjp], Niwer Mil [hrc], and Warwar Feni [hrw] 2013-01-23
wit Wintu S Split into Wintu [wnw], Nomlaki [nol], and Patwin [pwi] 2013-01-23
xia Xiandao M acn 2013-01-23
yiy Yir Yoront S Split into Yir Yoront [yyr] and Yirrk-Mel [yrm] 2013-01-23
yos Yos M zom 2013-01-23
emo Emok N 2014-02-03
ggm Gugu Mini N 2014-02-03
leg Lengua S Split into Enlhet [enl] and Enxet [enx] 2014-02-03
lmm Lamam D rmx 2014-02-03
mhh Maskoy Pidgin N 2014-02-03
puz Purum Naga M pub 2014-02-03
sap Sanapaná S Split into Sanapaná [spn] and Angaité [aqt] 2014-02-03
yuu Yugh D yug 2014-02-03
aam Aramanik M aas 2015-01-12
adp Adap M dzo 2015-01-12
aue ǂKxʼauǁʼein D ktz 2015-01-12
bmy Bemba (Democratic Republic of Congo) N 2015-01-12
bxx Borna (Democratic Republic of Congo) N 2015-01-12
byy Buya N 2015-01-12
gfx Mangetti Dune ǃXung M vaj 2015-01-12
gti Gbati-ri M nyc 2015-01-12
ime Imeraguen N 2015-01-12
kbf Kakauhua N 2015-01-12
koj Sara Dunjo M kwv 2015-01-12
kwq Kwak M yam 2015-01-12
kxe Kakihum M tvd 2015-01-12
lii Lingkhim M raq 2015-01-12
mwj Maligo M vaj 2015-01-12
nnx Ngong M ngv 2015-01-12
oun ǃOǃung M vaj 2015-01-12
pmu Mirpur Panjabi M phr 2015-01-12
sgo Songa N 2015-01-12
thx The D oyb 2015-01-12
tsf Southwestern Tamang M taj 2015-01-12
uok Uokha M ema 2015-01-12
yds Yiddish Sign Language N 2015-01-12
ymt Mator-Taygi-Karagas D mtm 2015-01-12
ynh Yangho N 2015-01-12
bgm Baga Mboteni D bcg 2016-01-15
btl Bhatola N 2016-01-15
cbe Chipiajes N 2016-01-15
cbh Cagua N 2016-01-15
coy Coyaima M pij 2016-01-15
cqu Chilean Quechua M quh 2016-01-15
cum Cumeral N 2016-01-15
duj Dhuwal S Split into [dwu] Dhuwal and [dwy] Dhuwaya 2016-01-15
ggn Eastern Gurung M gvr 2016-01-15
ggo Southern Gondi S Split into [esg] Aheri Gondi and [wsg] Adilabad Gondi 2016-01-15
guv Gey M duz 2016-01-15
iap Iapama N 2016-01-15
ill Iranun S Split into Iranun (Philippines) [ilp] and Iranun (Malaysia) [ilm] 2016-01-15
kgc Kasseng D tdf 2016-01-15
kox Coxima N 2016-01-15
ktr Kota Marudu Tinagas M dtp 2016-01-15
kvs Kunggara D gdj 2016-01-15
kzj Coastal Kadazan M dtp 2016-01-15
kzt Tambunan Dusun M dtp 2016-01-15
nad Nijadali D xny 2016-01-15
nts Natagaimas M pij 2016-01-15
ome Omejes N 2016-01-15
pmc Palumata D huw 2016-01-15
pod Ponares N 2016-01-15
ppa Pao M bfy 2016-01-15
pry Pray 3 D prt 2016-01-15
rna Runa N 2016-01-15
svr Savara N 2016-01-15
tdu Tempasuk Dusun M dtp 2016-01-15
thc Tai Hang Tong M tpo 2016-01-15
tid Tidong S Split into Northern Tidung [ntd] and Southern Tidung [itd] 2016-01-15
tmp Tai Mène M tyj 2016-01-15
tne Tinoc Kallahan M kak 2016-01-15
toe Tomedes N 2016-01-15
xba Kamba (Brazil) D cax 2016-01-15
xbx Kabixí N 2016-01-15
xip Xipináwa N 2016-01-15
xkh Karahawyana D waw 2016-01-15
yri Yarí N 2016-01-15
jeg Jeng M oyb 2017-01-31
kgd Kataang S Split into [ncq] Northern Katang and [sct] Southern Katang 2017-01-31
krm Krim M bmf 2017-01-31
prb Lua' N 2017-01-31
puk Pu Ko N 2017-01-31
rie Rien N 2017-01-31
rsi Rennellese Sign Language N 2017-01-31
skk Sok M oyb 2017-01-31
snh Shinabo N 2017-01-31
lsg Lyons Sign Language N 2018-01-23
mwx Mediak N 2018-01-23
mwy Mosiro N 2018-01-23
ncp Ndaktup M kdz 2018-01-23
ais Nataoran Amis S Split into Amis [ami] and Sakizaya [szy] 2019-01-25
asd Asas M snz 2019-01-25
dit Dirari M dif 2019-01-25
dud Hun-Saare S Split into ut-Hun [uth] and us-Saare [uss] 2019-01-25
lba Lui N 2019-01-25
llo Khlor D ngt 2019-01-25
myd Maramba M aog 2019-01-25
myi Mina (India) N 2019-01-25
nns Ningye M nbr 2019-01-25
aoh Arma N 2020-01-23
ayy Tayabas Ayta N 2020-01-23
bbz Babalia Creole Arabic N 2020-01-23
bpb Barbacoas N 2020-01-23
cca Cauca N 2020-01-23
cdg Chamari N 2020-01-23
dgu Degaru N 2020-01-23
drr Dororo M kzk 2020-01-23
ekc Eastern Karnic N 2020-01-23
gli Guliguli M kzk 2020-01-23
kjf Khalaj N 2020-01-23
kxl Nepali Kurux M kru 2020-01-23
kxu Kui (India) S Split into [dwk] Dawik Kui and [uki] Kui (India) 2020-01-23
lmz Lumbee N 2020-01-23
nxu Narau M bpp 2020-01-23
plp Palpa N 2020-01-23
sdm Semandang S Split into Semandang [sdq], Beginci [ebc] and Gerai [gef] 2020-01-23
tbb Tapeba N 2020-01-23
xrq Karranga M dmw 2020-01-23
xtz Tasmanian S Split into [xpv] Northern Tasman, [xph] North Midlands Tasman, [xpb] Northeastern Tasman, [xpd] Oyster Bay Tasman, [xpf] Southeast Tasman, [xpx] Southwestern Tasman, [xpw] Northwestern Tasman, [xpl] Port Sorell Tasman, and [xpz] Bruny Island Tasman 2020-01-23
zir Ziriya D scv 2020-01-23
thw Thudam M ola 2020-03-19
bic Bikaru M bir 2021-01-15
bij Vaghat-Ya-Bijim-Legeri S Split into Tiyaa [tyy], Bijim [jbm] and Kadung [dkg]. 2021-01-15
blg Balau M iba 2021-01-15
gji Geji S Split into Gyaazi [gyz], and Bu (Bauchi State) [zbu] 2021-01-15
mvm Muya S Split into Eastern Minyag [emq] and Western Minyag [wmg] 2021-01-15
ngo Ngoni S Split into Ngoni (Tanzania) [xnj] and Ngoni (Mozambique) [xnq] 2021-01-15
pat Papitalai M kxr 2021-01-15
vki Ija-Zuba S Split into Koro Nulu [vkn] and Koro Zuba [vkz] 2021-01-15
wra Warapu S Split into Bauni [bpe], Uni [uni] and Bouni [suo] 2021-01-15
ajt Judeo-Tunisian Arabic M aeb 2022-01-20
cug Chungmboko S Split into Chung [cnq] and Mbuk [bpc] 2022-01-20
lak Laka (Nigeria) M ksp 2022-01-20
lno Lango (South Sudan) S Split into Lango [lgo], Imotong [imt], Logir [lqr] and Okolie [oie] 2022-01-20
pii Pini N 2022-01-20
smd Sama M kmb 2022-01-20
snb Sebuyau M iba 2022-01-20
uun Kulon-Pazeh S Split into Kulon [uon] and Pazeh [pzh] 2022-01-20
wrd Warduji N 2022-01-20
wya Wyandot S Split into Wyandot [wyn] and Wendat [wdt] 2022-01-20
ajp South Levantine Arabic M apc 2023-01-20
kgm Karipúna D plu 2023-01-20
ksa Shuwa-Zamani S Split into [rsw] Rishiwa and [izm] Kizamani 2023-01-20
nom Nocamán M cbr 2023-01-20
plj Polci S Split into Pesse [pze], Nyamzak-Dir-Mbarimi [nzr], Zul [zlu], and Buli [uly] 2023-01-20
pmk Pamlico M crr 2023-01-20
prp Parsi M guj 2023-01-20
slq Salchuq N 2023-01-20
szd Seru M umi 2023-01-20
tmk Northwestern Tamang M tdg 2023-01-20
tpw Tupí D tpn 2023-01-20
xss Assan M zko 2023-01-20
zkb Koibal D kjh 2023-01-20
zua Zeem S Split into [tvi] Tulai, [dyr] Dyarim, [dsk] Dokshi, [cxh] Cha'ari, and [zem] Zeem 2023-01-20
dek Dek D sqm 2024-10-15
nte Nathembo M eko 2024-10-15
yol Yola M enm 2025-10-15

View File

@@ -0,0 +1,382 @@
"""The Language class."""
from __future__ import annotations
import datetime
from dataclasses import dataclass
from typing import NoReturn
from ._data import (
_PART3_TO_CODES,
_PART3_TO_NAME_INDEX,
_PART3_TO_MACROLANGUAGES,
_PART3_TO_RETIREMENTS,
_PART2B_TO_PART3,
_PART2T_TO_PART3,
_PART1_TO_PART3,
_REF_NAME_TO_PART3,
_PRINT_NAME_TO_PART3,
_INVERTED_NAME_TO_PART3,
_CodesColumn,
_NameIndexColumn,
_RetirementsColumn,
_MacrolanguagesColumn,
_COLUMN_TYPE,
)
_STRING_CLEANING_FUNCS = [lambda x: x.lower(), lambda x: x.title()]
class LanguageNotFoundError(Exception):
pass
@dataclass(frozen=True)
class Name:
"""Represents an alternative name of a language."""
__slots__ = ("print", "inverted")
print: str
inverted: str
@dataclass(frozen=True)
class Language:
"""Represents a language in the ISO 639-3 charts."""
__slots__ = (
# From the "codes" table
"part3",
"part2b",
"part2t",
"part1",
"scope",
"type",
"status",
"name",
"comment",
# From the "name_index" table
"other_names",
# From the "macrolanguages" table
"macrolanguage",
# From the "retirements" table
"retire_reason",
"retire_change_to",
"retire_remedy",
"retire_date",
)
# From the "codes" table
part3: str
part2b: str | None
part2t: str | None
part1: str | None
scope: str
type: str | None
status: str
name: str
comment: str | None
# From the "name_index" table
other_names: list[Name] | None
# From the "macrolanguages" table
macrolanguage: str | None
# From the "retirements" table
retire_reason: str | None
retire_change_to: str | None
retire_remedy: str | None
retire_date: datetime.date | None
def __hash__(self) -> int:
return hash(self.part3)
def __eq__(self, other) -> bool:
return isinstance(other, Language) and self.part3 == other.part3
@classmethod
def match(cls, user_input: str, /, *, strict_case: bool = True) -> Language:
"""Return a ``Language`` instance by matching on the user input.
Parameters
----------
user_input : str
A language code or name.
strict_case : bool, optional
Defaults to ``True``, for enforcing strict case sensitivity.
If ``False`` and if ``user_input`` doesn't find a match,
further match attempts will be made with the all-lowercase version of
``user_input`` (``"foobar"``) and the title-case version of ``user_input``
(``"Foobar"``).
Returns
-------
Language
Notes
-----
At a high level, `Language.match` assumes the input is more likely to be
a language code rather than a language name.
Beyond that, the precise order in matching is as follows:
* ISO 639-3 codes (among the active codes)
* ISO 639-2 (bibliographic) codes
* ISO 639-2 (terminological) codes
* ISO 639-1 codes
* ISO 639-3 codes (among the retired codes)
* ISO 639-3 reference language names
* ISO 639-3 alternative language names (the "print" ones)
* ISO 639-3 alternative language names (the "inverted" ones)
"""
# Order of columns to query the data tables.
# Bias towards (and therefore prioritize) the user input being
# a language code rather than a language name.
query_order: list[_COLUMN_TYPE] = [
_CodesColumn.ID,
_CodesColumn.PART2B,
_CodesColumn.PART2T,
_CodesColumn.PART1,
_RetirementsColumn.ID,
_CodesColumn.REF_NAME,
_NameIndexColumn.PRINT_NAME,
_NameIndexColumn.INVERTED_NAME,
]
return _PART3_TO_LANGUAGES[_get_part3(user_input, query_order, strict_case)]
@classmethod
def from_part3(cls, user_input: str, /) -> Language:
"""Return a ``Language`` instance from an ISO 639-3 code."""
return _PART3_TO_LANGUAGES[
_get_part3_exact(user_input, [_CodesColumn.ID, _RetirementsColumn.ID])
]
@classmethod
def from_part2b(cls, user_input: str, /) -> Language:
"""Return a ``Language`` instance from an ISO 639-2 (bibliographic) code."""
return _PART3_TO_LANGUAGES[_get_part3_exact(user_input, [_CodesColumn.PART2B])]
@classmethod
def from_part2t(cls, user_input: str, /) -> Language:
"""Return a ``Language`` instance from an ISO 639-2 (terminological) code."""
return _PART3_TO_LANGUAGES[_get_part3_exact(user_input, [_CodesColumn.PART2T])]
@classmethod
def from_part1(cls, user_input: str, /) -> Language:
"""Return a ``Language`` instance from an ISO 639-1 code."""
return _PART3_TO_LANGUAGES[_get_part3_exact(user_input, [_CodesColumn.PART1])]
@classmethod
def from_name(cls, user_input: str, /) -> Language:
"""Return a ``Language`` instance from an ISO 639-3 reference language name."""
query_order: list[_COLUMN_TYPE] = [
_CodesColumn.REF_NAME,
_NameIndexColumn.PRINT_NAME,
_NameIndexColumn.INVERTED_NAME,
]
return _PART3_TO_LANGUAGES[_get_part3_exact(user_input, query_order)]
def _raise_language_not_found_error(user_input: str) -> NoReturn:
raise LanguageNotFoundError(f"{user_input!r} isn't an ISO language code or name")
def _get_part3(
user_input: str, query_order: list[_COLUMN_TYPE], strict_case: bool = True
) -> str:
"""Get the part 3 code of a language.
Parameters
----------
user_input : str
The user-provided language code or name.
query_order : List[_COLUMN_TYPE]
A list of columns to specify query order.
strict_case : bool, optional
Defaults to ``True``, for enforcing strict case sensitivity.
If ``False`` and if ``user_input`` doesn't find a match,
further match attempts will be made with the all-lowercase version of
``user_input`` (``"foobar"``) and the title-case version of ``user_input``
(``"Foobar"``).
Returns
-------
str
Raises
------
LanguageNotFoundError
If `part3` isn't a language name or code
"""
try:
return _get_part3_exact(user_input, query_order)
except LanguageNotFoundError as e:
if strict_case:
raise e
else:
for func in _STRING_CLEANING_FUNCS:
try:
return _get_part3_exact(func(user_input), query_order, user_input)
except LanguageNotFoundError:
continue
else:
_raise_language_not_found_error(user_input)
def _get_part3_exact(
user_input: str,
query_order: list[_COLUMN_TYPE],
original_user_input: str | None = None,
) -> str:
"""Get the part 3 code of a language.
Parameters
----------
user_input : str
The user-provided language code or name.
query_order : list[_COLUMN_TYPE]
A list of columns to specify query order.
original_user_input : str, optional
The original user input. Default is `None`.
This argument is used when the user input has been cleaned.
Returns
-------
str
Raises
------
LanguageNotFoundError
If `part3` isn't a language name or code
"""
user_input = user_input.strip()
part3: str | None = None
for column in query_order:
if column == _CodesColumn.ID:
if user_input in _PART3_TO_CODES:
return user_input
elif column == _CodesColumn.PART2B:
part3 = _PART2B_TO_PART3.get(user_input)
elif column == _CodesColumn.PART2T:
part3 = _PART2T_TO_PART3.get(user_input)
elif column == _CodesColumn.PART1:
part3 = _PART1_TO_PART3.get(user_input)
elif column == _RetirementsColumn.ID:
if user_input in _PART3_TO_RETIREMENTS:
return user_input
elif column == _CodesColumn.REF_NAME:
part3 = _REF_NAME_TO_PART3.get(user_input)
elif column == _NameIndexColumn.PRINT_NAME:
part3 = _PRINT_NAME_TO_PART3.get(user_input)
elif column == _NameIndexColumn.INVERTED_NAME:
part3 = _INVERTED_NAME_TO_PART3.get(user_input)
else:
raise ValueError(f"Invalid column: {column}")
if part3 is not None:
break
if part3 is None:
_raise_language_not_found_error(original_user_input or user_input)
return part3
def _get_language(part3: str) -> Language:
"""Create a ``Language`` instance.
Parameters
----------
part3 : str
Part 3 code of the language.
Returns
-------
Language
"""
from_codes = _PART3_TO_CODES.get(part3)
from_macrolanguages = _PART3_TO_MACROLANGUAGES.get(part3)
from_retirements = _PART3_TO_RETIREMENTS.get(part3)
ref_name = (
from_codes[_CodesColumn.REF_NAME]
if from_codes
else from_retirements[_RetirementsColumn.REF_NAME] # type: ignore
)
other_names: list[Name] | None = []
for row in _PART3_TO_NAME_INDEX.get(part3, []):
p, i = row[_NameIndexColumn.PRINT_NAME], row[_NameIndexColumn.INVERTED_NAME]
if not ref_name == p == i:
other_names.append(Name(p, i)) # type: ignore
other_names = other_names or None
macrolanguage = (from_macrolanguages or {}).get(_MacrolanguagesColumn.MID)
retire_reason = (from_retirements or {}).get(_RetirementsColumn.RET_REASON)
retire_change_to = (from_retirements or {}).get(_RetirementsColumn.CHANGE_TO)
retire_remedy = (from_retirements or {}).get(_RetirementsColumn.REMEDY)
retire_date = (
datetime.datetime.strptime(
from_retirements[_RetirementsColumn.EFFECTIVE], "%Y-%m-%d"
).date()
if from_retirements
else None
)
if from_codes:
# The ISO 639-3 code is active.
part2b = from_codes[_CodesColumn.PART2B]
part2t = from_codes[_CodesColumn.PART2T]
part1 = from_codes[_CodesColumn.PART1]
scope = from_codes[_CodesColumn.SCOPE]
type = from_codes[_CodesColumn.TYPE]
status = "A"
ref_name = ref_name
comment = from_codes[_CodesColumn.COMMENT]
else:
# The ISO 639-3 code is retired.
part2b = None
part2t = None
part1 = None
scope = "I"
type = None
status = "R"
ref_name = ref_name
comment = None
language = Language(
part3=part3,
part2b=part2b or None,
part2t=part2t or None,
part1=part1 or None,
scope=scope,
type=type or None,
status=status,
name=ref_name,
comment=comment or None,
other_names=other_names or None,
macrolanguage=macrolanguage or None,
retire_reason=retire_reason or None,
retire_change_to=retire_change_to or None,
retire_remedy=retire_remedy or None,
retire_date=retire_date or None,
)
return language
def _get_all_languages() -> dict[str, Language]:
languages = {}
for part3 in _PART3_TO_CODES:
languages[part3] = _get_language(part3)
for part3 in _PART3_TO_RETIREMENTS:
languages[part3] = _get_language(part3)
return languages
_PART3_TO_LANGUAGES: dict[str, Language] = _get_all_languages()
ALL_LANGUAGES: set[Language] = set(_PART3_TO_LANGUAGES.values())