Wikipedia gvwiki https://gv.wikipedia.org/wiki/Ard-ghuillag MediaWiki 1.47.0-wmf.22 first-letter Meanyn Er lheh Resooney Ymmydeyr Resooney ymmydeyr Wikipedia Resooney Wikipedia Coadan Resooney coadan MediaWiki Resooney MediaWiki Clowan Resooney clowan Cooney Resooney cooney Ronney Resooney ronney TimedText TimedText talk Module Module talk Event Event talk Pobblaght Nerin 0 1883 393695 393371 2026-10-01T21:36:54Z MacTire02 219 ++ 393695 wikitext text/x-wiki {{Ymmydcosoylagh|yn steat as y phobblaght 'syn Oarpey Heear Hwoaie|yn ellan ta enmyssit "Nerin", "Éire", ny "Ireland"|Nerin}} {{Art reiht rollage}} {{Kishtey fys çheer |ennym = Nerin{{Efn|name=enmys}} |ennym_foddey_cadjincliaghtagh= {{nobold|Éire {{small|([[Yernish]])}}<br/>Ireland {{small|([[Baarle]])}}}} |ennym_gienneydagh = Nerin |jalloo_caslys = EU-Ireland.svg |jarroo-raa = none |arrane_ashoonagh = [[Amhrán na bhFiann]] |coadan_arrane_ashoonagh = United States Navy Band - Amhrán na bhFiann.ogg |çhyndaa_arrane_ashoonagh = Arrane ny Fenee |çhengey_arrane_ashoonagh = Yernish |çhengaghyn_oikoil = {{hlist|[[Yernish]]{{Efn|name=çhengey ashoonagh}}|[[Baarle]]<ref>{{Cite web |url=https://www.irishstatutebook.ie/eli/cons/en/html#article8_1 |title=Article 8, Constitution of Ireland |access-date=4 Toshiaght Arree 2022 |website=Irish Statute Book |archive-date=23 Averil 2022 |archive-url=https://web.archive.org/web/20220423200419/https://www.irishstatutebook.ie/eli/cons/en/html |url-status=live }}</ref>}} |sorçh_reiltys = [[Pobblaght pharlamaidagh unnaneagh]] |ushtey_sy_cheead = 2.00 |blein_LTS_CCK = 2023 |LTS_CCK = $722.929 billoon |LTS_CCK_yn_dooinney = $137,638 |sorçh_kiondeeaght = [[Shennaghys Nerin|Seyrsnys]] |note_kiondeeaght = veih'n [[Reeriaght Unnaneysit]] |taghyrt1_bunnit = [[Fogrey magh Phobblaght Nerin|Fogrit magh]] |date1_bunnit = 24 Averil 1916 |taghyrt2_bunnit = [[Fogrey yn Teyrsnys (Nerin)|Shickyrit]] |date2_bunnit = 21 Jerrey Geuree 1919 |taghyrt3_bunnit = [[Conaant Anglo-Yernagh|Currit er enney]] |date3_bunnit = 6 Mee ny Nollick 1922 |taghyrt4_bunnit = [[Bunraght Nerin|Bunraght roie]] |date4_bunnit = 29 Mee ny Nollick 1937 |noteyn_argid = Va'n [[punt Yernagh]] ymmydit roish 1999. |traa_ynnydagh = [[Traa ynnydagh yn Oarpey Heear|WET]] |ashchur_utc = +00:00 |traa_ynnydagh_TTLS = [[Traa Chadjinit Nerin|IST]] ([[Traa houree yn Oarpey Heear|WEST]]) |ashchur_utc_TTLS = +01:00 |tld = [[.ie]] |noteyn_tld = Ta [[.eu]] ymmydit chammah, myrane lesh çheeraghyn-oltey elley [[yn Unnaneys Oarpagh]] |coad_çhellvane = 353 }} Ta '''Nerin''' ({{langx|ga|Éire}}, {{langx|en|Ireland}}) ny çheer ayns sheear hwoaie ny [[Yn Oarpey|h-Oarpey]]. Ta'n steat seyr noa-emshiragh goaill stiagh 5/6 ellan [[Nerin]]. Ta'n çheer çhemmit liorish [[Nerin Hwoaie]] (ny cooid jeh'n [[Reeriaght Unnaneysit]]) da'n twoaie, y [[Yn Keayn Sheear|Cheayn Sheear]] da'n sheear, [[Mooir Vannin]] da'n shiar, as [[Yn Vooir Cheltiagh|y Vooir Cheltiagh]] as [[Mooir Vretyn]] da'n jiass as y shiar yiass. Dy leighoil, she cur sheese y steat ee '''Pobblaght Nerin''' ({{langx|ga|Poblacht na hÉireann}}, {{langx|en|Republic of Ireland}}) agh she ''Nerin'' yn ennym eck. Ta Nerin ny h-oltey jeh'n [[Yn Unnaneys Oarpagh|UO]], [[Reagheydys ry hoi Co-obbraghey Tarmaynys as Lhiasaghey|RCTL]] as [[ny h-Ashoonyn Unnaneysit|AU/UN]]. == Shennaghys == ::''Ard-art: [[Shennaghys Nerin]], [[Shennaghys Phobblaght Nerin]]'' Ta Nerin ny steat eiyrtyssagh da'n çhiarnys [[Seyr Steat Nerin]]. Va'n çhiarnys shen currit er bun traa scarr en ellan er feie rish [[Reeriaght Unnaneysit ny Bretyn Mooar as Nerin]] er 6 Nollick 1922. Er y laa er giyn ren [[Ard-whaiyl Nerin Hwoaie]] yeearreydys, rere y [[Conaant Anglo-Yernagh]], çheet stiagh 'sy [[Reeriaght Unnaneysit]] reesht. Va ny taghyrtyn shen, lesh yn ennym [[Rheynn magh Nerin]], ny eiyrtys er kiare eabyn reiltys hene-reiragh jeeveanit y chur er Nerin lane (ayns 1886, 1893, 1914 as 1920). Va [[Seyr Steat Nerin]] astyrit er 29 Nollick 1937, traa haink y bunraght noa ayns bree. Va seyrsnys Nerin fogrit magh ayns [[Irree magh ny Caisht]] ayns 1916, shey bleeaney roish bunneeaght y seyr steat. Ec y traa shen ren arryltee Yernagh as Armee Seyranagh Nerin cummaltys er ynnydyn ennagh ayns Divlyn as [[Galliu]] fo coryn [[Fockley magh Phobblaght Nerin]]. Va ny shiaght fo-screeuderyn yn 'ockley magh, [[Patrick Pearse]], [[Thomas MacDonagh]], [[Thomas Clarke (irreyder magh)|Thomas Clarke]], [[Sean MacDiarmada]], [[Joseph Mary Plunkett]], [[Eamonn Ceannt]] as [[James Connolly]] currit gy baase, chammah as nuy persoonyn elley. Va thousaneyn dy 'leih currit fo'n 'oaid, as va ny taghyrtyn shen ny lheimmeyder da [[Caggey ny Seyrsnys (Nerin)|Caggey ny Seyrsnys]]. === Cooylrey === Veih [[Aght yn Unnaneys, 1800|Aght yn Unnaneys]] er 1 Jerrey Geuree 1801 derrey 6 Nollick 1922, va Nerin ny cooid jeh [[Reeriaght Unnaneysit ny Bretyn Mooar as Nerin]]. Car [[Gortey Mooar Nerin|y Ghortey Vooar]] veih 1845 derrey 1849 huitt sleih-earroo yn ellan veih 8 millioonyn cummaltee gys 5.6 millioonyn. Hooar millioon dy 'leih baase as hie 1.5 millioonyn gys çheeraghyn elley myr eiyrtys. Derrey ny 1960-yn va tuittym beayn ayns sleih-earroo ny çheerey ry-akin ec dagh coontey-sleih. Veih 1874, as veih 1880 er lheh fo stiurey [[Charles Stewart Parnell]], haink [[Partee Ard-whaiylagh Nerin]] dy ve ny chied phartee 'sy çheer trooid jeean-ghleashaght hallooinagh lheeadagh. Va aachummaghyn thallooin tannysagh cosnit ec y phartee as va eiyrtyssyn ennagh currit ec y phartee ayns [[Ard-whaiyl Hostyn]] ry hoi hene-reiltys Nerin. === Slattys Reill Thie === Traa chaill [[Quaiyl ny Çhiarnyn]] y lhiettal oc as traa va [[Billey Reill Thie 1914]] shickyrit ec [[John Redmond]], va ram sleih credjal dy vel hene-reiltys çheet. Ansherbee, mastey lught Protestoonagh Nerin, va gleashaght unnaneysagh gaase ny yei cur stiagh y chied villey ry hoi Reill Thie. V'ad goaill aggle roish coayl vondeishyn tarmaynagh as soshiallagh. Va'n ghleashaght unnaneysagh ry-gheddyn er yn ellan er feie agh v'ee ny stroshey ayns [[Ullee]] raad dy vel y çhynskylaght ny scadjin. Myrane as shen, va'n chooid smoo jeh'n lught Protestoonagh ry-gheddyn ayns Ullee. === Shassoo noi === Fo stiureydys y Ghivlynagh [[Edward Carson]] jeh [[Partee Unnaneysagh Nerin]] as y twoaieagh [[James Craig]] jeh [[Partee Unnaneysagh Ullee]] haghyr er ny h-unnaneysee dy ve caggoil noi ''Co-eignaghey Ullee''. Ny yei çheet lesh Billey Reill Thie trooid yn ard-whaiyl ayns Boaldyn 1914, hugg yn Ard-vinishter [[H. H. Asquith]] Billey Lhiasaghey trooid yn ard-whaiyl. Faagail magh dy vel stiureydys y Phartee Yernagh noi yn lhiasaghey, hoie ad lesh. Hug y billey shoh giarrey magh shallidagh da Ullee faagail magh ass Reill Thie er feie shey bleeaney, lesh coryn neuvriwnyssit da'n wheiggey. Hooar y billey Coardail Reeoil agh v'eh currit er y skelloo lesh brishey magh [[Yn Chied Chaggey Dowanagh|y Chied Chaggey Dowanagh]] (v'eh er chredjal dy beagh y caggey creaghnit roish jerrey ny bleeaney 1915). Son shickyraghey cur rish yn Aght ec jerrey y chaggey hie 175,000 arryltee Yernagh fo coyrle Redmond stiagh ayns rejimentyn Yernagh y 10-oo (Yernagh) as y 16-oo (Yernagh) rheynnyn, as hie Unnaneysee stiagh ayns y 36-oo (Ullee) rheynn ayns Armee Noa ny Bretyn Mooar. [[Coadan:Laatste pagina van het document waarbij op 6 december 1921 de Ierse Vrijstaat werd opgericht, SFA022823706.jpg|thumb|upright|left|Duillag enmyn screeuit y [[Conaant Anglo-Yernagh|Chonaant Anglo-Yernagh]]]] Ayns Jerrey Geuree 1919 ny yei ard-reihys ny bleeaney 1918, va 76 jeh ny 106 [[Oltey yn Ard-whaiyl|MP]]-yn ny olteynyn jeh [[Sinn Féin]]. Dob ad nyn soiagyn ayns [[Ard-whaiyl Hostyn]]. Hug ad ard-whaiyl Yernagh er bun, [[Dáil Éireann (1919-1922)|Dáil Éireann]]. Hug ad magh [[Fogrey ny Seyrsnys]] as va [[Pobblaght Nerin (1919-1922)|Pobblaght Nerin]] fogrit magh. Va'n fogrey ny aaraa yn 'ogrey magh veih [[Irree magh ny Caisht]] 'sy vlein 1916 lesh y chiarail elley nagh row Nerin ny cooid jeh'n Reeriaght Unnaneysit. Cha row y phobblaght noa currit er enney ec çheer elley, faagail magh [[Pobblaght Hoveidjagh Chonastagh Hoshiallagh ny Roosh|Pobblaght ny Roosh]]. Va cur magh [[Aireacht]] (Airaght) ny pobblaght currit gys [[Co-choyrle Shee Phaarys]] fo stiurey yn [[Ceann Comhairle]] [[Seán T. O'Kelly]] agh cha row yn cur magh lhiggit stiagh. Ny yei [[Caggey ny Seyrsnys (Nerin)|Caggey ny Seyrsnys]] as y scuirr caggee ny lurg ayns Mean Souree 1921, haink reihdee jeh [[Reiltys y Reeriaght Unnaneysit]] as çhaghteryn Yernagh fo stiurey [[Arthur Griffith]], [[Robert Barton]] as [[Michael Collins (irreyder magh Yernagh)|Michael Collins]], ry-cheilley dy varganey y [[Conaant Anglo-Yernagh]] ayns [[Lunnin]] veih 11 Jerrey Fouyir derrey 6 Mee ny Nollick 1921. Ec 11:15 'sy voghrey er 5 Nollick ayns kione cherroo y chur magh Yernagh, v'eh reiht y Conaant y chur er-ash gys Dáil Éireann dys y Conaant y hickyraghey. Rere coryn y Chonaant, va steat seyr noa currit er bun, [[Seyr Steat Nerin]] lesh stayd çhiarnys eck. Haink Nerin dy ve rheynnit magh ayns daa heer rere coryn y Chonaant. Hooar [[Nerin Hwoaie]] (ny shey coondaeghyn da'n twoaie) reiltys er lheh as hannee ee ny cooid jeh'n Reeriaght Unnaneysit. Haink Nerin Yiass (ny 23 coondaeghyn ayns Lion, Connaghtey as y Vooan chammah as tree coondaeghyn jeh Ullee, [[Coontae Ghoon ny Ghoal|Doon ny Ghoal]], [[Coontae yn Chavan|Yn Cavan]] as [[Coontae Vuinaghan|Muinaghan]]) dy ve ny reeriaght vunraghtoil fo [[Ree Nerin]] (veih 1927) myr [[Seyr Steat Nerin]]. Va [[Ard-chiannoort Heyr Steat Nerin|Ard-chiannoort]], ard-whaiyl daa-hamyragh, airaght lesh yn ennym "[[Cooinseil Chiannoortagh Nerin|Cooinseil Chiannoortagh]]" as ard-vinishter fo'n ennym "[[Eaghtyrane Chooinseil Chiannoortagh Heyr Steat Nerin]]". === Eiyrtyssyn y rheynn magh === [[Coadan:Eamon de Valera c 1922-30.jpg|right|upright|thumb|[[Éamon de Valera]]]] Va [[Caggey Theayagh Nerin]] ny eiyrtys jeeragh jeh vunneeaght y Seyr Steat. Va ny forseyn fo stiurey [[Éamonn de Valera]] shassoo noi soiaghey jeh'n Conaant va astyral [[Pobblaght Nerin (1919-1922)|Pobblaght Nerin]]. Cha row ad saasit lesh y fys dy vel Nerin tannaghtyn ny cooid jeh [[Co-unnaneys Ghoal]] as er y fys dy row er olteynyn y Dáil breearrey loo da Ree ny Bretyn Mooar as ny h-eiyrtyssee echey. Ec toshiaght y chaggee, scarr [[Armee Pobblaghtagh Nerin|Armee Pobblaghtagh Nerin (IRA)]] ayns daa chologid: yn IRA currit rish y Conaant, as yn IRA currit noi'n Conaant. Skeayll yn IRA currit rish y Conaant as hie ad stiagh ayns [[Armee Nerin]]. Trooid dolley troggal kioneyssagh breeoil yn IRA currit noi'n Conaant, haink Collins as ny forseyn echey dy ve abyl armee lesh thousaneyn shenn-sidooryn ass rejimentyn Yernagh yn Armee Ghoaldagh jeh'n Chied Chaggey Dowanagh. Hug y Reeriaght Unnaneysit gunnaghyn, etlanyn, gunnaghyn jeshaght as tastey caggee dys armee y Seyr Steat. Lesh baggyrtys çheet er-ash ny forseyn crooinagh, as neu-ymmyrkey yn phobble, haink jerrey lesh y chaggee 'sy vlein 1923. === Bunraght 1937 === Er 29 Mee ny Nollick 1937, va bunraght noa, [[Bunraght Nerin]] (Bunreacht na hÉireann), currit ayns bree. Va'n bunraght shen currit ayns ynnyd [[Bunraght Heyr Steat Nerin|Vunraght y Seyr Steat]] as, myr eiyrtys, va steat noa currit er bun lesh yn ennym "[[Éire]]" ny "Ireland" ayns Baarle. Ayns ny meeghyn roish y vunraght noa, va oik yn Ard-chiannoort scrysst. Faagail magh dy row oik [[Eaghtyrane Nerin]] currit er bun, cha row yn çheer ny pobblaght dy leighoil eddyr ny bleeantyn 1937 as 1949. Hannee yn paart ogheragh da fer steat ec Ree Nerin fo leigh slattyssagh myr organe reiltys Nerin. Hannee Nerin neaghtyragh rish [[Yn Nah Chaggey Dowanagh|y Nah Chaggey Dowanagh]], as ta'n traa shen soilshaghit myr [[Yn Egin (Nerin)|yn Egin]]. Haink jerrey lesh ynnyd Ree Nerin lesh Aght Phobblaght Nerin 1948. V'eh currit ayns bree er 18 Averil 1949 traa va oik yn Eaghtyrane currit ayns ynnyd y Ree. Hoilshee yn Aght dy vel Nerin ny pobblaght. Ny s'anmey Aght Chrooin Nerin neuyeant rere Aght Aavriwnys Leigh Slattyssagh (Slattyssyn Roie-unnaneys Nerin) 1962. Hannee Nerin ny oltey jeh [[Co-unnaneys Ghoal]] veih seyrsnys ny çheerey derrey fogrey magh ny pobblaght er 18 Averil 1949. Hie Nerin stiagh ayns yn [[Ny h-Ashoonyn Unnaneysit|AU]] 'sy vlein 1955. === Fosley tarmaynagh === Veih ny 1920-yn va cleighyn traghtee ardey ec Nerin, lhieed as custymyn ardey as roonaghtyn maylartey er kionnaghey stiagh. Darragh ram sleih magh ass y çheer. Ayns ny 1950-yn darragh 400,000 cummaltee magh. Hoig y reiltys nagh vel yn ashoonaghys tayrmanagh so-stiurey. Traa dy row bishaghey tappee ry-akin ayns çheeraghyn elley ny h-Oarpey, cha row ayns Nerin agh neughleashaght tayrmanagh, arraghey magh, as olkyn elley. Va caghlaaghyn roonaghtyn currit ry-cheilley ayns ''Economic Development'', pabyr oikoil va currit magh ayns 1958. Va'n pabyr shen moylley son traght seyr, argid baiht joarree, argid baiht bishee, as bishaghey myr dean y stiureydys tayrmanagh. Hie Nerin stiagh gys [[Yn Cohionnal Oarpagh|y Chohionnal Oarpagh]] ([[yn Unnaneys Oarpagh]] noa-emshyragh) ayns 1973. Car ny 1970-yn, haghyr bishaghey ayns sleih-earroo ny çheerey, y chied vishaghey veih seyrsnys ny çheerey. Haghyr bishaghey ayns çheet stiagh argidoil ny çheerey ec cormid mygeayrt 4% myrgeddin. Rish ny bleeaney 1980 va trass y lugh obbyr faillit ayns y shirveish theayagh. Haghyr bishaghey ayns baarnaghyn y chlaare argidoil as lhiastynys ny çheerey, as ad leeideil gys geyre-ghaue ny 1980yn. Ayns feysht Nerin Hwoaie, hoshee Reiltys Nerin geearree aa-unnaneaghey sheeoil Nerin as, son y chooid smoo, va'n çheer co-obbraghey lesh reiltys ny Bretyn Mooar ayns y chaggey 'sy twoaie lesh ny fo-hidooryn as [[yn Armee Ghoaldagh]] ayn. Va reagheydys ry hoi shee, [[Coardailys Veeal Feirshtey]], fo-screeuit ayns 1998 ny lurg refraneyn ayns Pobblaght Nerin as Nerin Hwoaie. === Shennaghys jeianagh === Rish ny 1980-yn va feyshtyn tayrmanagh cur magh. Haink mee-staartaght ard er-ash, chammah as arraghey magh as lhiastanys theayagh. Va 60% çheet stiagh argidoil lught obbyr y vean-ynnyd fo cheesh. Va 20% y phobble gyn obbyr, as va 1% pobble ny çheerey garraghey magh ass y çheer. Heeyn lhiastanyssyn theayagh gys 15% LTS. Va [[Fianna Fáil]] reiht ayns 1987 as hoilshee ad magh leaystey gys reiltys beg. Va baarail theayagh giarrit as keeshyn leodaghit. Va cohirrey currit er toshiaght ayns dagh ynnydyn. Va argid baiht joarree cleaynit hug y tarmaynys cohirreydagh. Ren [[Intel]] baihaghey ayns 1989, as haink ram colughtyn elley, lhieed as [[Microsoft]] as [[Google]], ny lurg. == Politickaght == {{ardart|Politickaght Phobblaght Nerin}} Ta Nerin ny [[pobblaght]] lesh corys ard-whaiylagh myr reiltys eck. Ta [[Eaghtyrane Nerin]], quoi ta myr fer ny ben toshee, reiht dagh shiaght bleeaney as foddee eh ny ee ve reiht er feie un traa elley. Cha nel ayns yn eaghtyraneys er-e-skyn ooilley agh ennym eaghtyrane, agh ta currymyn bunraghtoil ennagh echey, as eh coonit liorish [[Coonseil y Steat (Nerin)|Coonseil y Steat]]. Ta'n [[Taoiseach]] pointit liorish yn eaghtyrane fo enmysaght yn ard-whaiyl. Va'n chooid smoo jeh ny Taoisigh n'ir toshee er y phartee politickagh smoo 'syn ard-whaiyl. T'eh er ve cadjin dy vel ny reiltyssyn jeant sheose jeh [[cochiangley (politickaght)|cochianglaghyn]]. Cha row reiltys un-pharteeagh veih'n vlein 1989. Ta'n ''[[Oireachtas]]'', yn ard-whaiyl daa-hamyragh, jeant sheose jeh Eaghtyrane Nerin, y shannad, [[Seanad Éireann]], as eh ny whaiyl s'yrjey, as quaiyl ny reihdee, [[Dáil Éireann]], as eh ny whaiyl s'inshley. Ta tree feed olteynyn ayns y Seanad; ta un oltey jeig enmyssit ec y Taoiseach, shey jeu reiht ec daa ollooscoillyn, as 43 jeu quoi ta reiht liorish reihdee theayagh ass pannylyn shirreyderyn ta bunnit er bunneydys bentyn da keird. Ta 166 olteynyn, ''[[Teachta Dála|Teachtaí Dála]]'', ayns y Dáil. Dy chadjin, ta ny h-olteynyn reiht dagh queig bleeaney veih co-heiyderyssyn yl-ynnydagh fo corys tuarastyl freggyrtagh. [[Coadan:Leinsterhouseirl.jpg|left|thumb|[[Teach Laighean]], soiaghey ''[[Oireachtas Éireann]]'' (ard-whaiyl Nerin)]] Rere y vunraght, cha nel agh queig olteynyn jeig ayns y Reiltys. Foddee er daa oltey jeh'n Seanad dy ve ny olteynyn y Reiltys, agh sheggin da'n Taoiseach, y ''[[Tánaiste]]'' (lhiass ard-vinishter) as Shirveishagh yn Argidys dy ve nyn olteynyn jeh'n Dáil. Ta'n reiltys roie jeant sheose jeh tree parteeyn politickagh: [[Fine Gael]] fo stiurey yn Taoiseach [[Simon Harris]], [[Fianna Fáil]] fo stiurey [[Micheál Martin]], as [[Yn Partee Glass (Nerin)|y Partee Glass]] fo stiurey [[Eamon Ryan]]. Haghyr yn ard-reihys jerrinagh da'n Dáil er 8 Toshiaght Arree 2020. Ta ny preeu-pharteeyn er y chondaigys jeant sheose jeh [[Sinn Féin]] fo stiurey [[Mary Lou McDonald]], [[Partee yn Lught Obbyr (Nerin)|Partee yn Lught Obbyr]] fo stiurey [[Brendan Howlin]], [[Ny Deynlaghteyryn Soshiallagh (Nerin)|ny Deynlaghteyryn Soshiallagh]] fo stiurey [[Catherine Murphy (politickeyr)|Catherine Murphy]] as [[Róisín Shortall]], chammah's myn-pharteeyn as politickeyryn neu-chrogheydagh eigsoylagh. Hie Nerin stiagh gys [[yn Unnaneys Oarpagh]] ayns 1973, agh t'ee çheumooie jeh [[Conaant Schengen]] rere reih. Foddee da seyranee y [[Reeriaght Unnaneysit]] goll stiagh ayns Nerin gyn lioar hroailtys bwooise lesh yn [[Eaghtyr Troailtys Cadjin]], agh ta enneydys ennagh ry-laccal ec puirt aeragh as puirt varrey. == Ardjyn reiragh == Ta'n ellan dy slane rheynnit ayns 32 [[Ardjyn Nerin|choontae]] rere tradishoon, agh cha nel agh 26 jeu soit ayns Pobblaght Nerin. T'ad ymmydit foast ayns nheeghyn cultooragh, shendeeagh as spoyrt. Er çheu ny politickaght, ta ny coondaeghyn son y chooid smoo ymmydit son gurneilys ynnydagh, agh ta daa choontae rheynnit ayns slystyn ny s'loo, t'ad shenn Coontae Çhybbyrt Aarey as Coontae Aah Cleeah. {| align="center" cellpadding="10" | [[Coadan:Ireland Numbered.png|thumb|250px|Earrooyn coondaeghyn ayns Pobblaght Nerin]] |style="font-size: 90%;"| '''Pobblaght Nerin''' # [[Coontae Aah Cleeah|Divlyn]]<br /><small>— [[Divlyn]]<br />— [[Coontae Ghoon Laoire-Raah yn Doon|Doon Laoire-Raah yn Doon]]<br />— [[Coontae 'ine Goal|Fine Goal]]<br />— [[Coontae Aah Cleeah Yiass|Divlyn Yiass]]</small> # [[Coontae Cheeill Mantan|Keeill Mantan]] # [[Coontae Logh Garman|Logh Garman]]<br /><small>— [[Logh Garman|Balley Logh Garman]] (Cochorp)</small> # [[Coontae Cheatharlach|Ceatharlach]] # [[Coontae Cheeill Darey|Keeill Darey]] # [[Coontae ny Mee|Yn Vee]] # [[Coontae Lhoo|Lhoo]]<br /><small>— [[Droghad Aah|Balley Ghroghad Aah]] (Cochorp)</small> # [[Coontae Vuinaghan|Muinaghan]] # [[Coontae yn Chavan|Yn Cavan]] # [[Coontae Lhongfort|Lhongfort]] # [[Coontae ny h-Eearvee|Yn Eearvee]] # [[Coontae Uíbh Fhailí|Uíbh Fhailí]] # [[Coontae Leesh|Leesh]] # [[Coontae Cheeill Chennee|Keeill Chennee]]<br /><small>— [[Keeill Chennee|Balley Cheeill Chennee]] (Cochorp)</small> |style="font-size: 90%;"| <ol start=15> <li>[[Coontae Phurt Largey|Purt Largey]]<br /><small>— [[Purt Largey|Balley Phurt Largey]]</small> <li>[[Coontae Chorkee|Corkee]]<br /><small>— [[Corkee|Balley Chorkee]]</small> <li>[[Coontae Cherree|Kerree]] <li>[[Coontae Limmeragh|Limmeragh]]<br /><small>— [[Limmeragh]]</small> <li>[[Coontae Hybbyrt Aarey|Çhybbyrt Aarey]]<br /><small>— [[Çhybbyrt Aarey Hwoaie]]</small><br /><small>— [[Çhybbyrt Aarey Yiass]]</small><br />&nbsp;<small>— [[Cluain Meala]] (Cochorp)</small> <li>[[Coontae yn Chlaair|Yn Claar]] <li>[[Coontae ny Galliu|Galliu]]<br /><small>— [[Galliu|Balley ny Galliu]]</small> <li>[[Coontae Vay Eo|May Eo]] <li>[[Coontae Ros Comain|Ros Comain]] <li>[[Coontae Cliggee|Shliggagh]]<br /><small>— [[Shliggagh|Balley Cliggee]] (Cochorp)</small> <li>[[Coontae Lheeahtrim|Lheeahtrim]] <li>[[Coontae Ghoon ny Ghoal|Doon ny Ghoal]] </ol> |} == Çheer-oaylleeaght == [[Coadan:Topography Ireland.jpg|thumb|upright|Boayloaylleeaght Nerin]] {{ardart|Çheer-oaylleeaght Nerin|Çheer-oaylleeaght Phobblaght Nerin|Speyr Nerin}} [[Coadan:Cliffsmohersunset.jpg|thumb|left|150px|Aillte an Mhothair, Co. yn Chlaair]] Ta ellan Nerin 84,421 [[kilometer kerrinagh|km²]] (32,556 mi ker) er eaghtyr, as ta 83% jeh'n eaghtyr fo stiurey ny Pobblaght (70,280 km²; 27,103 mi ker). Ta'n cooid elley fo stiurey y Reeriaght Unnaneysit myr Nerin Hwoaie. T'ee caglit da'n sheear liorish [[Yn Keayn Sheear|y Cheayn Sheear]], da'n shiar hwoaie liorish [[Ammyr ny h-Albey]], da'n shiar liorish [[Mooir Vannin]], da'n shiar yiass liorish [[Mooir Vretin]] as [[Yn Vooir Cheltiagh|y Vooir Cheltiagh]]. Ta slyst heear ny çheerey jeant seose jeh eayninyn, cruink as sleityn injil (she [[Corrán Tuathail]] y boayl s'yrjey as eh 1,038 m er yrjid). Ta antraie ny çheerey jeant seose jeh claareyn injil, as ta awinyn, lhied as [[Yn Çhannon|y Çhannon]], as loghyn mooarey ennagh ry-gheddyn. Ta çheshvean ny çheerey ny cooid jeh dreeym ushtey ny Shannon, as t'ee jeant seose jeh bogleeghyn. T'ad ymmydit son tayrn magh as gientyn moain. Ta tashtaghyn ooill as gas ry-gheddyn magh 'syn 'aarkey myrgeddin. Ta speyr ynnydagh ny çheerey kiartit liorish [[Stroo yn Atlantagh Hwoaie]]. Cha nel çhiassid ny çheerey goll harrish 30 °[[keim Kel|C]] (86&nbsp;°F) car y Touree agh keayrt ayns dagh jeihaght, agh bee çhiassid sheeyney gys 29&nbsp;°C (84&nbsp;°F) dagh Sourey. Car y Gheuree cha nel y çhiassid goll fo -6&nbsp;°C (21&nbsp;°F). Ta'n fliaghey ry-gheddyn dy mennick, as ta ram ynnydyn cur failt er 275 laaghyn dy 'liaghey. T'ad ny ard-chovaljyssyn ayns y çheer na'n preeu-valley [[Divlyn]] (1,045,769) er y clyst hiar, [[Corkee]] (190,384) er y clyst yiass, [[Lhimnagh]] (90,757) ayns sheear meanagh ny çheerey, [[Galliu]] (72,729) er y clyst heear, as [[Purt Largey]] (49,213) er y clyst hiar yiass. <div style="clear:left"></div> == Ynsagh == {{ardart|Ynsagh ayns Pobblaght Nerin}} Ta ny coryssyn ynsee, son y chooid smoo, fo stiurey y reiltys trooid [[Shirveishagh Ynsee as Oaylleeaght]]. Shegin da bun-scoillyn as ard-scoillyn greimmey lesh y choorse ta bunnit ec y lught-reill. Ta [[Claare PISA|Claare ry hoi Scrutaght Eddyrashoonagh ny Scollagyn]], ta co-oardit liorish yn [[Reagheydys ry hoi Co-obbraghey Tarmaynys as Lhiasaghey|RCTL]], rang-oardraghey corys ynsee Nerin ayns oaylleeaght myr y 20-oo çheer share mastey ny çheeraghyn commee. Ta bun-ynsagh, ard-ynsagh as ynsagh ollooscoillagh seyr da seyranee Nerin as [[yn Unnaneys Oarpagh]]. == Tarmaynys == {{ardart|Tarmaynys Phobblaght Nerin}} Ta tarmaynys Nerin caghlaait rish ny bleeantyn shoh chaie veih fer eirinagh gys fer ta bunnit er fys, as eh jeeraghey er shirveishyn as çhynskylyn ard-çhaghnoaylleeagh as croghit er traght, çhynskyl as argid baiht. Va aase tarmaynagh ayns Nerin er hroggal mean er 10% veih 1995-2000, as er 7% veih 2001-2004. Ta'n çhynskyl ny rheynnag toshee ayns ynnyd yn eirinys lesh 46% [[Lane Troar Sthie|LTS]], 80% dy assphurtanyn, as 29% y lught obbyr. T'eh ny phaart ogheragh ayns roonaght tarmaynagh Nerin veih 1987 na [[Copharteeys Soshiallagh]], as eh ny phossan noa-volgagh 'conaantyn faill arryltagh' eddyr y Reiltys, failleyderyn as keird-chummynyn. V'ad jannoo coardailys rish bishaghey faillyn er feie tree bleeaney. Va Nerin ny kiaddeyder yn [[euro]] ayns Jerrey Geuree 1999 (faagail y [[punt Yernagh]]) chammah as un heer jeig yn Unnaneys Oarpagh. Er yn oyr dy vel cormidyn aase cha ard as v'ayn, va'n ennym "Y Teigyr Celtiagh" currit urree. Ayns 2006, va Nerin ayns y nah ynnyd ayns y theihll rere LTS y dooiney (US$43,600) ny yei [[Lucsemburg]]. Rere Lane Çheet stiagh Ashoonagh (LCI) ayns 2005 va Nerin ayns y shiaghtoo ynnyd mastey çheeraghyn y theihill, y sheyoo mastey çheeraghyn ny h-Oarpey as ayns y treeoo ynnyd mastey olteynyn yn UO lesh çheet stiagh $41,140 y dooiney. === Argid === [[Coadan:Eurocoin ie 100.gif|thumb|right|110px|Cooiney lesh kiaddey Yernagh]] Roish çheet stiagh yn Euro ayns Jerrey Geuree ny bleeaney 2002 (argid-neu-laue: 1999) v'eh [[punt Nerin]] yn argid oikoil. Ta'n [[euro]] (coad argid yn ISO: EUR) ny argid oikoil ayns Nerin nish. T'ad ny noataghyn banc ta currit magh na €5, €10, €20, €50, €100, €200 as €500. Ta dagh noatey banc cosoylagh ayns dagh çheer [[Cryss yn Euro|Chryss yn Euro]], agh ta cowraghyn ashoonagh er lheh er ny cooinaghyn. Ren rieltys Nerin briwnys er kiaddey ashoonagh ynrican da chooilley chooiney. Ta ny cooinaghyn Yernagh taishbyney claasagh Yernagh, cowrey ashoonagh ny çheerey, as ee jesheenaghit lesh blein y chur magh as y fockle "Éire". <div style="clear:right"></div> == Caggeeaght == {{ardart|Forseyn Coadee Nerin}} {{jeeagh|Neuchommeeaght Nerin}} Ta forseyn armit Nerin reaghit fo [[Forseyn Coadee Nerin]] (''[[Óglaigh na hÉireann]]''). Ta'n armee beg dy lioor myr t'ad cosoylagh rish armeeghyn gerroil ayns yn ard, agh t'ad mie-armit, lesh 8,500 sidooryn lane-emshiraghey (13,000 ayns y chooyl-armee). T'eh myr shen er yn oyr dy vel Nerin ny çheer neuchommeeagh, as dy vel commeeys ayns caggaghyn fo reillyn "tree-ghlass" dy vel coontey mie ymmyrçhagh veih'n AU, y Reiltys as y Dáil roish scarrey magh ny sidooryn ayns cryssyn caggeeaghey. Ta sidooryn Yernagh scarrit magh dy chooney yn AU ayns currymyn coadee shee, dy choadey ushtaghyn çheerey Nerin ([[Shirveish Marrey Nerin]]), as myr ta cooney da reirid theayagh ry-laccal. Ta ny Forseyn Coadee goaill stiagh [[Corps Aeragh Nerin]], [[Shirveish Marrey Nerin]], as [[Cooyl-orseyn Coadee Nerin]] ([[Cooyl-armee Nerin]] as [[Cooyl-hirveish Marrey Nerin]]). Ta [[Rouailtee Armee Nerin]] nyn ming forseyn er lheh fo fascaidagh yn armee. Va so-lhoobaghtyn ny Pobblaght ymmydit liorish forseyn caggeeagh yn S.U. son livrey-ys sidooryn as ad er n'gholl gys y caggey 'syn Earack ayns 2003 trooid [[Purt aeragh ny Shannon]]. Va'n phurt aeragh ymmydit son ruegys ny h-Afghanistaan 'sy vlein 2001, chammah as ayns [[Kied Chaggey Cheayn ny h-Arabaght]]. T'eh ny chooid jeh shennaghys ymmyd ny Shannon son livrey-ys caggeeagh ny s'odjey. == Sleih == Rere aaronsaghey gienoaylleeagh, haink ny kied deiney gys Nerin trooid arraghey veih'n [[Yn Ibeir|Ibeir]] ny yei jerrey [[yn Eash Rioee]] jeianagh.<ref>[https://web.archive.org/web/20060926181227/http://www.prospect-magazine.co.uk/article_details.php?id=7817 Myths of British ancestry] - Prospect Magazine</ref> Hug arraghee ny h-Eashyn [[Yn Eash Noalittagh|Noalittagh]] as [[Yn Eash Ooha|Ooha]] cultoor as çhengaghyn [[Ny Celtiee|Celtiagh]] stiagh gys Nerin. Ta ny h-arraghee shoh foast ny mynlagh ayns eiraght gienoaylleeagh ny Yernee.<ref>[http://www.pubmedcentral.nih.gov/articlerender.fcgi?tool=pubmed&pubmedid=15309688 The Longue Durée of Genetic Ancestry: Multiple Genetic Marker Systems and Celtic Origins on the Atlantic Facade of Europe] - PUBMED</ref> Skeayll y cultoor magh er feie yn ellan, as haink y tradishoon Gaelgagh dy ve ny chroo kionyssagh ayns y çheer. Jiu, ta ny Yernee, son y chooid smoo jeh'n sluight Gaelgagh, as faagail magh dy vel cooid y phobble jeh'n sluight Loghlynagh, Anglo-Normanagh, Sostynagh, Albinagh, Frangagh, as Bretnagh, va y possanyn shoh cosoylaghit stiagh ayns yn enney Yernagh as cha nel ad jannoo possanyn mynlaghey er lheh. Ta'n cultoor as y çhengey Gaelgagh croo paart scanshoil yn enney ashoonagh. Ayns y [[Reeriaght Unnaneysit]], ta'n [[Lught Shooyl]] ny ny Fir Troailtey currit er enney myr possan mynlagh kynneeagh, as t'ad kianglt dy pholitickagh (agh nee rere kynney) lesh Romanee ny h-Oarpey Mooarheeragh,<ref>{{Cite web |title=''Commission for Racial Equality:'' Gypsies and Irish Travellers: The facts |url=http://www.cre.gov.uk/gdpract/g_and_t_facts.html |accessdate=2008-10-15 |archivedate=2007-05-02 |archiveurl=https://web.archive.org/web/20070502020917/http://www.cre.gov.uk/gdpract/g_and_t_facts.html }}</ref> agh ayns Nerin t'ad currit er enney myr "possan soshiallagh", ansherbee.<ref>{{Cite web |title=''Irish Travellers Movement:'' Traveller Legal Resource Pack 2 - Traveller Culture |url=http://www.itmtrav.com/Legal-ResourcePack2.html |access-date=2008-10-15 |archive-date=2008-05-28 |archive-url=https://web.archive.org/web/20080528195727/http://www.itmtrav.com/Legal-ResourcePack2.html |url-status=dead }}</ref> === Çhengaghyn === {{ardart|Çhengaghyn Nerin|Yernish|Baarle Yernagh|Baarle Ullee Meanagh}} T'ad [[Yernish]] as [[Baarle]] ny çhengaghyn oikoil. Shegin da scoillyn ta cur failt er cooney argidoil ny er enney yn steat yn Yernish as y Vaarle dynsaghey. Ta'n Vaarle ny çhengey ard-chionyssagh er feie ny çheerey. Ta cohionnalyn Yernisheyryn ry-gheddyn ayns ynnydyn Gaelgaghey ([[Gaeltaght Nerin]]) er slystyn heear, heear hwoaie as heear yiass ny çheerey, chammah as ayns [[Coontae ny Mee]], agh cha nel ayn agh thousaneyn dy chummaltee ayndaue. Dy mennick ta ny cowraghyn raaidey ayns daa hengey, faagail magh ny Gaeltaght raad dy vel ayns Yernish ynrican. Va stayd leighoil enmyn ynnyd ny chooish arganys er y gherrid, er yn oyr dy row oardagh currit magh fo [[Aght ny Çhengaghyn Oikoil 2003]] as eh çhyndaa enmyn ynnyd ennagh er-ash veih'n Vaarle gys yn Yernish (myr sambyl, va ''[[Yn Dein|Dingle]]'' (Yn Dein) çhyndaait er-ash gys ''An Daingean'' dyn y wooise da contraartys ynnydagh as pobble-vriwnys yeearree çhyndaa dys lhieggan daa-hengagh: ''Dingle Daingean Uí Chúis''). Ta'n chooid smoo jeh fograghyn theayagh ayns Baarle ynrican, myrane lesh ny pabyryn naight. Ta'n chooid smoo jeh cur magh y Reiltys ayns Baarle as Yernish, as ta kiart ec peiagh erbee dellal lesh y reiltys ayns Yernish my vel ad er-laccal. Ta ymysseraght ayns Yernish ry-gheddyn er y çhellveeish ([[TG4]]), er y radio (myr sambyl [[Raidió na Gaeltachta]]) as ayns pabyryn naight (myr sambyl [[Lá Nua]] as [[Foinse]]) Rere coontey-pobble ny bleeaney 2006, va'n Yernish ec 1,656,790 (39%) cummaltee ny çheerey; cha nel errooyn ry-gheddyn er earrooyn ny Baarleyryn agh t'eh er-chredjal dy vel ish ec begnagh 100% sleih-earroo ny çheerey. Ta'n [[Polynnish|Pholynnish]] nane jeh ny çhengaghyn smoo loayrit ayns Nerin, ny lurg ny Yernish as ny Baarle: ta mygeayrt 63,000 Polynnee nyn gummal ayns Nerin rere staydraa yn choontey-pobble. T'ad [[Sheltish]], ta loayrit ec y [[Lught Shooyl]], as [[Baarle Albinagh Ultagh]], abbyrt ny Baarle Albinagh, ny çhengaghyn smoo scanshoil elley 'sy çheer. Ta'm chooid smoo jeh scollagyn ayns ny h-ard-scoillyn reih un ny daa hengey joarree dynsaghey. Da'n [[Scrutaght Phoinnaragh (Nerin)|Scrutaght Phoinnaragh]] as yn [[Ardscrutaght (Nerin)|Ardscrutaght]] foddee scollagyn studeyrys y yannoo er [[Frangish]], [[Germaanish]], [[Iddaalish]] as y [[Spaainish]]; foddee scollagyn yn ardscrutaght studeyrys y yannoo er [[Arabish]], [[Shapaanish]] as [[Rooshish]]. Ta [[Shenn-Ghreagish]], [[Studeyryssyn Ewagh]] as [[Ladjyn]] ry-gheddyn ayns ard-scoillyn ennagh, myrgeddin. === Craueeaght === [[Coadan:DublinStPatricksCathedral.jpg|thumb|left|Ard-agglish Noo Perick ayns Divlyn, Ard-agglish Ashoonagh jeh cooid [[Agglish Nerin]] (cooid jeh'n [[Creestiaght Anglicaanagh|Chreestiaght Anglicaanagh]])]] Rere y leigh, ta'n çheer ny steat neuvonnagh, as ta'n bunraght gra dy vel feoiltaghey yn steat da craueeaght erbee neulhiggit. Ta mygeayrt 86.8% earroo yn phobble nyn [[Yn Agglish Chatoleagh|Greesteenyn Raueagh]].<ref>{{PDFlink|[http://www.cso.ie/census/documents/Final%20Principal%20Demographic%20Results%202006.pdf Final Principal Demographic Results 2006]|894&nbsp;[[Kibibyte|KiB]]<!-- application/pdf, 916355 bytes -->}}</ref> Ta [[Agglish Nerin]] ny nah agglish smoo ayns y çheer. Va'n agglish cribbey derrey coontey-pobble ny bleeaney 2002 tra haink bishaghey ayns earrooyn ny h-Agglish, red er haghyr lesh enmyssyn credjue Creestee elley as lesh yn [[Hindooaghys]]. T'ad ny h-enmyssyn credjue Creestee smoo elley na [[Agglish Chleragh Nerin]] as [[Agglish Haasilagh Nerin]] ny yei. Eddyr ny bleeantyn 2002 as 2006 haghyr bishaghey fo 69% ayns earrooyn ny [[Islamaghys|h-Islamee]], as ee nish ny treeoo craueeaght smoo ayns y çheer. Haghyr bishaghey beg ayns earrooyn [[ny h-Ewnyn]] ayns y traa cheddin. T'ad [[Noo Perick]] as [[Noo Breeshey]] ard-nooghyn ny çheerey. Rere coontey-pobble ny bleeaney 2006, va 186,318 (ny 4.4%) dy chummaltee ny çheerey gyn chraueeaght. Ren 1,515 cummaltee cur sheese orroo hene myr meechredjuee, as 929 cummaltee myr anjee. Ta ny h-earrooyn shen taishbyney nagh vel craueeaght erbee ec 4.5% sleih-earroo ny çheerey. Cha row craueeaght raait ec 70,322 (1.7%) dy chummaltee ny çheerey.<ref>[http://www.cso.ie/census/documents/Final%20Principal%20Demographic%20Results%202006.pdf Final Principal Demographic Results 2006]</ref> <div style="clear:left"></div> == Cultoor == {{ardart|Cultoor Nerin}} [[Coadan:Oscar Wilde 3g07095u-adjust.jpg|thumb|right|150px|Y draameyder, bard, as screeudeyr Yernagh, [[Oscar Wilde]].]] Dymmyrk ellan Nerin [[Lioar Cheanannas]], as screeudeyryn lhied as [[George Berkeley]], [[Sheridan le Fanu]], [[Jonathan Swift]], [[James Joyce]], [[George Bernard Shaw]], [[Richard Brinsley Sheridan]], [[Oliver Goldsmith]], [[Oscar Wilde]], [[William Butler Yeats|W.B. Yeats]], [[Patrick Kavanagh]], [[Samuel Beckett]], Brian O'Nolan, as eh soilshit magh myr [[Flann O'Brien]], [[John Millington Synge]], [[Seán O'Casey]], [[Seamus Heaney]], [[Bram Stoker]], [[Elizabeth Bowen]], [[Kate O'Brien]], [[Seán Ó Faoláin]], [[Frank O'Connor]], [[William Trevor]] as screeudeyryn elley. Ta Shaw, Yeats, Beckett as Heaney fo laurys [[Aundyr Nobel ayns Lettyraght]]. Ta ram screeudeyryn elley lhied as [[John Banville]], [[Roddy Doyle]], [[Pádraic Ó Conaire]], [[Máirtín Ó Cadhain]], [[Séamus Ó Grianna]], [[Dermot Bolger]], [[Maeve Binchy]], [[Frank McCourt]], [[Edna O'Brien]], [[Nuala Ní Dhomhnaill]], [[Paul Muldoon]], [[Thomas McCarthy]], [[Joseph O'Connor]], [[Eoin Colfer]], [[John McGahern]] as [[Colm Tóibín]]. Ta ellyneyryn ard-ghooagh Nerin goaill stiagh [[Nathaniel Hone]], [[James Arthur O'Connor]], [[Roderick O'Conor]], [[Jack Yeats]], [[William Orpen]], [[Mainie Jellett]], [[Louis le Brocquy]], [[Anne Madden]], [[Robert Ballagh]], [[James Coleman]], [[Dorothy Cross]] as [[John Gerrard]]. Ta enney share er Nerin son [[Kiaull çheerey Nerin|kiaull tradishoonagh Nerin]], agh va ram ellyneyryn elley lesh cleayney eddyr-ashoonagh ayns genreyn elley currit magh ec yn ellan, lhied as [[U2]], [[Westlife]], [[Thin Lizzy]], [[The Pogues]], [[The Corrs]], [[The Cranberries]], y cloieder gitar [[Rory Gallagher]], yn arraneyder çheerey [[Christy Moore]], [[Celtic Woman]], [[The Chieftains]], [[Glen Hansard]] jeh [[The Frames]], [[Chris de Burgh]] as arraneyderyn [[Enya]] as [[Sinéad O'Connor]]. Ayns [[Kiaull classicagh ny h-Oarpey|kiaull classicagh]], ta ellan Nerin ny boayl ruggyree cummeyderyn ard-ghooagh lhied as [[Turlough O'Carolan]], [[John Field (cummeyder)|John Field]] (cummeyder yn [[Arrane oie (kiaull classicagh)|Arrane oie]]), [[Gerald Barry (cummeyder)|Gerald Barry]], [[Michael William Balfe]], y Reejerey [[Charles Villiers Stanford]] as [[Charles Wood (cummeyder)|Charles Wood]]. Va [[Robert Boyle]] ny 'ishigagh jeh'n shiaghtoo eash jeig as eh n'er ren feddyn magh [[Leigh Boyle]]. Va [[Aundyr Nobel ayns Fishag]] rheynnit magh dys [[Ernest Walton]] jeh [[Colaashtey ny Trinaid Divlyn]] ayns 1951 er yn oyr dy row yn "breneen skeilt" echey. Va [[William Rowan Hamilton]] ny vaddaghteyr ard-ghooagh. Va'n fallsoonagh as y jeeaghteyr Yernagh [[Eriugena]], briwnyssit myr nane jeh lught yn tushtey leeideilagh jeh'n rey echey. Va [[John Tyndall]] (1820-1893) veih [[Liehghlion y Droghad]], [[Coontae Cheatharlach]], [[Nerin]], ny 'ishigagh ard-ghooagh veih Nerin as eh n'er ren feddyn magh er eiyrtys Tyndall, as yn eiyrtys shen ny chur sheese er cre'n fa dy vel daah gorrym er y speyr. == Eunysseyrys == [[Coadan:2005-11-21 U2 @ MSG by ZG.JPG|thumb|left|150px|[[U2]], y bann Yernagh smoo ladoosagh]] Ta assphurtanyn ladoosaghey eunysseyraghey y 20-oo eash jeianagh goaill stiagh aghtaghyn lhied as [[U2]], [[Thin Lizzy]], [[The Pogues]], [[My Bloody Valentine]], [[Rory Gallagher]], [[Sinéad O'Connor]], [[Boomtown Rats]], [[The Corrs]], [[Horslips]], [[Boyzone]], [[Ronan Keating]], [[The Cranberries]], [[Clannad]], [[Gilbert O'Sullivan]], [[Westlife]] as [[Enya]], as ny taishbynyssyn ard-ghooagh ''[[Riverdance]]'' as ''[[Lord of the Dance (cloie chiaullee)|Lord of the Dance]]''. Ayns y 21-oo eash beg, dirree [[Damien Rice]] as [[The Thrills]] gys ard-ghoo eddyr-ashoonagh. Ta [[The Frames]] ny vann ennoil ayns Nerin as eh gaase er yn ardane eddyr-ashoonagh, agh ta'n stayd oc myr y bann smoo ennoil fo baggyrtys rish bannaghyn noa elley lhied as [[Bell X1 (bann)|Bell X1]], ansherbee. Ta aghteyryn Hollywood cronnaley veih Pobblaght Nerin goaill stiagh [[Maureen O'Hara]], [[Barry Fitzgerald]], [[George Brent]], [[Arthur Shields]], [[Maureen O'Sullivan]], [[Richard Harris]], [[Peter O'Toole]], [[Pierce Brosnan]], [[Gabriel Byrne]], [[Brendan Gleeson]], [[Daniel Day Lewis]] (rere seyraanaght), [[Colm Meaney]], [[Colin Farrell]], [[Brenda Fricker]], [[Jonathan Rhys-Meyers]], [[Stuart Townsend]] as [[Cillian Murphy]]. Hug çhynskyl bishagh ny scannaneyn Yernagh, meansalit liorish [[Bord Scannán na hÉireann]], cooney da ny stiureyderyn [[Neil Jordan]] as [[Jim Sheridan]], as hug eh cooney da scannaneyn Yernagh lhied as ''[[Intermission (scannane)|Intermission]]'' liorish [[John Crowley (stiureyder)|John Crowley]], ''[[Breakfast on Pluto (scannane)|Breakfast on Pluto]]'' liorish Neil Jordan, as scannaneyn elley. Fo roonaghtyn barnaghyn keeshaghey as oyryn elley va ram scannaneyn cleaynit gys Nerin, goaill stiagh ''[[Braveheart]]'' liorish [[Mel Gibson]] as ''[[Saving Private Ryan]]'' liorish [[Steven Spielberg]]. == Spoyrt == {{ardart|Spoyrt ayns Nerin}} T'ad [[Bluckaneyrys Gaelgagh|bluckaneyrys]] as [[immanaght Ghaelgagh]] ny preeu-spoyrtyn ayns Nerin son y chooid smoo. Ta'n daa spoyrt shen, myrane lesh [[bluckan laue Gaelgagh]] stiurit ec [[Cumann Lúthchleas Gael]]. Ta shenn-chloiederyn y CLG goaill stiagh [[DJ Carey]] as [[Peter Canavan]]. Va'n shenn-Taoiseach [[Jack Lynch]] ny immanee ennymoil as cosneyder y chohirrey ooilley-Nerin roish y çheet stiagh echey 'sy pholitickaght. Ta cloiederyn ard-ghooagh roie goaill stiagh [[Henry Shefflin]], [[Sean Cavanagh]] as [[Colm Cooper]]. Va ram spoyrteyryn gientit ayns Nerin. Ayns soccer ta shenn-vluckaneyryn goaill stiagh [[Roy Keane]], [[Johnny Giles]], [[Liam Brady]], [[Denis Irwin]], [[Packie Bonner]], [[Niall Quinn]], as [[Paul McGrath (bluckaneyr)|Paul McGrath]] as ta bluckaneyryn roie goaill stiagh lheid as [[Lee Carsley]], [[Steve Finnan]], [[Shay Given]], [[Damien Duff]], [[John O'Shea]] as [[Robbie Keane]]. Ayns ruggyr ta bluckaneyryn lheid as [[Brian O'Driscoll]], [[Ronan O'Gara]], [[Paul O'Connell]], [[David Wallace]] as [[Keith Wood]] gientit eck. Ayns roortaghys, va aundyryn cosnit ayns cohirraghyn eddyr-ashoonagh ec [[Sonia O'Sullivan]], [[Eamonn Coghlan]], [[Catherina McKiernan]], [[Ronnie Delaney]], [[John Treacy]], [[David Gillick]] as [[Derval O'Rourke]]. == Arraghey == [[Coadan:Citadis dublin.jpg|thumb|upright|LUAS]] {{jeeagh|Arraghey ayns Nerin|Arraghey raad yiarn ayns Nerin|Raaidyn ayns Pobblaght Nerin}} Ta tree [[Purt aeragh eddyr-ashoonagh|puirt aeragh eddyr-ashoonagh]] ([[Purt aeragh Ghivlyn|Divlyn]], [[Purt aeragh ny Shannon|Y Çhannon]], as [[Purt aeragh Chorkee|Corkee]]) ayns Pobblaght Nerin as ad kianglt lesh arraghys bollee Oarpagh as eddyr-vooarheeragh lesh bollee skedjalit as kaartit. She [[Aer Lingus]] y lhuingys aer ashoonagh, agh ta'n lhuingys aer costys injil [[Ryanair]] ny lhuingys aer smoo. Ta'n bollagh eddyr [[Lunnin]] as [[Divlyn]] ny vollagh smoo tarroogh ayns yn Oarpey, lesh 4.5 millioonyn troailtee ayns 2006. Ta shirveishyn raad yiarn kiarit ec [[Iarnród Éireann]]. She Divlyn çheshvean y ghreasane, lesh daa phreeu-stashoonyn ([[Stashoon Heuston|Heuston]] as [[Stashoon Connolly|Connolly]]) as t'ad kianglt lesh ny baljyn as ard-valjyn smoo. Ta shirveish yn [[Enterprise (traen)|Enterprise]], lesh cooidjaght [[Northern Ireland Railways]], jannoo kiangley eddyr Divlyn as Beeal Feirshtey. Ta greasane ymmyrkey lhiassagh ayns Divlyn as eh goaill stiagh [[Dublin Area Rapid Transit|DART]], [[LUAS]], [[Dublin Bus|bus baljagh]] as shirveish raad yiarn lhiasagh. Ta ny bayryn gleashtanagh as ny preeu-raaidyn fo stiurey yn [[National Roads Authority]]. Ta ny raaidyn elley fo stiurey ny cooinseilyn ynnydagh. Ta shirveishyn assaig jannoo kianglaghyn eddyr Pobblaght Nerin, [[Yn Vretyn Vooar|y Vretyn Vooar]], [[Mannin]] as [[Yn Rank|y Rank]]. == Jeeagh er neesht == * [[Rolley bratteeyn Phobblaght Nerin]] * [[Fwirran bluckan-coshey ashoonagh Phobblaght Nerin]] == Noteyn == {{Notelist|refs= {{Efn|name=enmys|[Ta https://www.irishstatutebook.ie/eli/cons/en/html#part2 Banglane 4] jeh [[Bunraght Nerin]] gra dy nee ''Nerin'' ennym y steat; ta [http://www.irishstatutebook.ie/1948/en/act/pub/0022/sec0002.html Olt 2] jeh [[Slattys Phobblaght Nerin, 1948]] gra dy nee "cur sheese er y steat" eh ''Pobblaght Nerin''.<ref name="Coakley2009">{{cite book |first=John |last=Coakley |title=Politics in the Republic of Ireland |url=https://books.google.com/books?id=fzFPQ2pZgd0C&pg=PA76 |access-date=2 Boaldyn 2011 |date=20 August 2009 |publisher=Taylor & Francis |isbn=978-0-415-47672-0 |page=76 |archive-date=25 Nollik 2018 |archive-url=https://web.archive.org/web/20181225081937/https://books.google.com/books?id=fzFPQ2pZgd0C&pg=PA76%20 |url-status=live }}</ref>}} {{Efn|name=çhengey ashoonagh|Ta [https://www.irishstatutebook.ie/eli/cons/en/html#part2 Banglane 8] jeh'n Vunraght gra dy nee Yernish y "çhengey ashoonagh" as y "chied çhengey oikoil" as dy nee "aa-hengey oikoil" ee yn Vaarle.}} }} == Imraaghyn == {{reflist}} == Kianglaghyn magh == * [https://web.archive.org/web/20050403211720/http://www.gov.ie/aras/ ''Áras an Uachtaráin''] – Ynnyd-eggey oikoil yn Eaghtyrane * [https://web.archive.org/web/20081108001743/http://www.irlgov.ie/ Oayllys er Steat Nerin] – giat y Reiltys * [https://www.gov.ie/en/organisation/department-of-the-taoiseach/ Taoiseach] – Ynnyd-eggey oikoil yn ard-vinishter * [https://web.archive.org/web/20080611071209/http://www.gov.ie/oireachtas/frame.htm Tithe an Oireachtais] – Thieyn yn Ard-whaiyl, ynnyd-eggey oikoil yn ard-whaiyl {{Çheeraghyn yn Unnaneys Oarpagh}} {{Yn Europey}} {{Gurneil eaghtyrys}} {{DEFAULTSORT:Nerin, Pobblaght}} [[Ronney:Pobblaght Nerin| ]] [[Ronney:Çheeraghyn yn Oarpey]] [[Ronney:Çheeraghyn ellanagh]] [[Ronney:Çheeraghyn-oltey yn Unnaneys Oarpagh]] [[Ronney:Çheeraghyn-oltey Choonseil yn Oarpey]] [[Ronney:Çheeraghyn-oltey ny h-Ashoonyn Unnaneysit]] [[Ronney:Çheeraghyn-oltey yn RCTL]] [[Ronney:Ardjyn staddyssaghtoil NUTS 1 yn Unnaneys Oarpagh]] [[Ronney:Pobblaghtyn]] [[Ronney:Steatyn as thallooyn bunnit 'sy vlein 1949]] [[Ronney:Bunneeaghtyn ayns Nerin 'sy vlein 1949]] 2b0qa3zzn0cws2ixnams5dy6f0cucvw Montenegro 0 2451 393690 393443 2026-10-01T21:29:40Z MacTire02 219 parameadaryn noa 'sy chishtey fys nish 393690 wikitext text/x-wiki {{Kishtey fys çheer |ennym = Montenegro |ennym_foddey_cadjincliaghtagh= {{nobold|Crna Gora<br />Црна Гора {{small|([[Montenegrish]])}}}} |ennym_gienneydagh = Montenegro |jalloo_brattagh = Flag of Montenegro.svg |jalloo_cleinney = Coat of arms of Montenegro.svg |jalloo_caslys = Europe-Montenegro.svg |jarroo-raa = none |arrane_ashoonagh = [[Oj, svijetla majska zoro]] |çhyndaa_arrane_ashoonagh = O, Madran Gial dy Voaldyn |coadan_arrane_ashoonagh = National Anthem of Montenegro.ogg |çhengaghyn_oikoil = [[Montenegrish]] |sorçh_çhengaghyn = Çhengaghyn as<br/>ymmyd oikoil oc |çhengaghyn = {{hlist|[[Serbish]]|[[Bosnish]]|[[Croitish]]|[[Albaanish]]}}<ref name="Constitution of Montenegro">{{cite book|url=http://www.wipo.int/wipolex/en/text.jsp?file_id=187544|title=Bunraght Montenegro|chapter-url=http://www.wipo.int/wipolex/en/text.jsp?file_id=187544#LinkTarget_1506|chapter=Language and alphabet Article 13 |publisher=[[WIPO]]|date=19 Jerrey Fouyir 2007}}</ref> |preeu-valley = [[Podgorica]] |noteyn_preeu-valley =She Podgorica yn preeu-valley reiragh as ta [[Cetinje]] coontit myr y shenn phreeu-valley reeoil. |latd=42 |latm=47 |latNS=N |longd=19 |longm=28 |longEW=E |latNSgael=Hwoaie |longEWgael=Hiar |balley_smoo = preeu-valley |sorçh_reiltys = [[Pobblaght pharlamaidagh unnaneagh]] |ushtey_sy_cheead = 1.5 |blein_LTS_CCK = 2007 |LTS_CCK = $6.135 billioon |LTS_CCK_yn_dooinney = $10,225 |LTS_ennymagh = $3.557 billioon |sorçh_kiondeeaght = Bunneeaght |taghyrt1_bunnit = [[Prinsaght Zeta|Zeta]] |date1_bunnit = 1356 |taghyrt2_bunnit = [[Prinse-aspickys Montenegro]] |date2_bunnit = 1516 |taghyrt3_bunnit = [[Prinsaght Montenegro]] |date3_bunnit = 13 Mayrnt 1852 |taghyrt4_bunnit = [[Conaant Verleen (1878)|Conaant Verleen]] |date4_bunnit = 13 Jerrey Souree 1878 |taghyrt5_bunnit = [[Reeriaght Montenegro]] |date5_bunnit = 28 Luanistyn 1910 |taghyrt6_bunnit = [[Reeriaght yn Yugoslaavey]] |date6_bunnit = 26 Mee Houney 1918 |taghyrt7_bunnit = [[Pobblaght Chonastagh Hoshiallagh yn Yugoslaavey|PCH yn Yugoslaavey]] |date7_bunnit = 29 Mee Houney 1945 |taghyrt8_bunnit = [[Yn Serb as Montenegro|Y Serb as Montenegro]] |date8_bunnit = 27 Averil 1992 |taghyrt9_bunnit = [[Refrane cour Neuchrogheydys Montenegro, 2006|Refrane neuchrogheydys]] |date9_bunnit = 21 Boaldyn 2006 |argid = [[euro]] |noteyn_argid = Va'n [[euro]] doltit dy un-çheuagh; cha nel Montenegro coontit myr ayrn jeh [[cryss yn oarey]] |traa_ynnydagh = [[Traa ynnydagh yn Oarpey Veanagh|CET]] |ashchur_utc = +01:00 |traa_ynnydagh_TTLS = [[Traa souree yn Oarpey Veanagh|CEST]] |ashchur_utc_TTLS = +2 |cctld = [[.me]] |coad_çhellvane = 382 }} She çheer 'syn [[yn Oarpey|Oarpey]] eh '''Montenegro'''.{{efn|[[Montenegrish]], [[Bosnish]], as [[Serbish]]: {{lang|cnr|Црна Гора}} ny {{lang|cnr|Crna Gora|italics=no}}; {{langx|hr|Crna Gora}}; {{langx|sq|Mali i Zi}}.}} T'eh çhemmit liorish [[Bosnia as Herzegovina]] 'sy twoaie, [[Yn Serb|y Serb]] 'sy niar hwoaie, [[Kosovo]] 'sy niar, [[yn Albaan]] 'sy niar yiass, as [[Yn Chroit|y Chroit]] 'sy neear hwoaie. She [[Podgorica]] ([[Abbyrlhit Kyrillagh|Kyrillagh]]: Подгорица) yn preeu-valley. == Bun-ocklaght == Ta'n fockle "Montenegro" hene çheet ass çhyndaays lettyroil [[Veneeshish]] jeh'n abbyrt Herbagh "''Crna Gora''", ta meanal "Slieau Doo." == Noteyn == {{notelist}} == Imraaghyn == {{reflist}} {{Yn Europey}} {{RCAH}} {{Gurneil eaghtyrys}} {{bun}} [[Ronney:Montenegro| ]] [[Ronney:Ny çheeraghyn Balkanagh]] [[Ronney:Çheeraghyn yn Oarpey]] [[Ronney:Çheeraghyn-oltey Reagheydys Chonaant yn Atlantagh Hwoaie]] [[Ronney:Çheeraghyn-oltey Unnaneys y Veanvooir]] [[Ronney:Çheeraghyn-oltey Choonseil yn Oarpey]] [[Ronney:Çheeraghyn-oltey ny h-Ashoonyn Unnaneysit]] [[Ronney:Steatyn as thallooyn bunnit 'sy vlein 2006]] [[Ronney:Pobblaghtyn]] [[Ronney:Bunneeaghtyn 'syn Oarpey 'sy vlein 2006]] 3beuhheoxwrhrhib6rd8ioo12me19fe Monaco 0 2639 393812 393669 2026-10-02T02:56:53Z MacTire02 219 lettyraghey 393812 wikitext text/x-wiki {{Kishtey fys çheer |ennym = Prinsaght Monaco |ennym_foddey_cadjincliaghtagh= {{nobold|Principauté de Monaco {{small|([[Frangish]])}}}} |ennym_gienneydagh = Monaco |jalloo_caslys = Monaco_Europe_Location.svg |jarroo-raa = Deo Juvante |çhyndaa_jarroo-raa = Lesh Cooney Yee |çhengey_jarroo-raa = Ladjyn |arrane_ashoonagh = [[Hymne Monégasque]] |çhyndaa_arrane_ashoonagh = Hymn Monaco |coadan_arrane_ashoonagh = Monaco National Anthem.ogg |çhengey_arrane_ashoonagh = Frangish |çhengaghyn_oikoil = [[Frangish]]<ref>{{cite web |access-date=22 Boaldyn 2008 |url=http://www.gouv.mc/devwww/wwwnew.nsf/1909$/036c62fe5f92f2efc1256f5b0054fa42gb?OpenDocument&3Gb |archive-url=https://web.archive.org/web/20110722170607/http://www.gouv.mc/devwww/wwwnew.nsf/1909$/036c62fe5f92f2efc1256f5b0054fa42gb?OpenDocument&3Gb |archive-date=22 Jerrey Souree 2011 |title=Constitution de la Principauté |publisher=[[Coonseil y Reiltys (Monaco)|Coonseil y Reiltys]] |url-status=dead}}</ref> | sorçh_çhengaghyn = [[Eddyr-hengey|Çhengaghyn cadjin]] | çhengaghyn = {{hlist|[[Iddaalish]]|[[Monacish]]}} |sorçh_reiltys = [[Monarkaght lieh-vunraghtoil pharlamaidagh]] unnaneagh |blein_LTS_CCK = 2015 |LTS_CCK = $7.672 billoon |LTS_CCK_yn_dooinney = $115,700 |sorçh_kiondeeaght = Neuchrogheydys |taghyrt1_bunnit = [[Reeraghtys Grimaldi]] (fo kionedeeaght [[Pobblaght Genova|Phobblaght Genova]]) |date1_bunnit = 8 Jerrey Geuree 1297 |taghyrt2_bunnit = veih [[Kied Impiraght y Rank|Impiraght y Rank]] |date2_bunnit = 17 Boaldyn 1814 |taghyrt3_bunit = veih cummaltys y [[Caggey yn Çheyoo Cochiangley|Çheyoo Cochiangley]] |date3_bunnit = 17 Mean Souree 1814 |taghyrt4_bunnit = [[Ny Conaantyn Frangagh-Monacagh]] |date4_bunnit = 2 Toshiaght Arree 1861 |taghyrt5_bunnit = [[Bunraght Monaco|Bunraght]] |date5_bunnit = 5 Jerrey Geuree 1911 |traa_ynnydagh = [[Traa ynnydagh yn Oarpey Veanagh|CET]] |ashchur_utc = +01:00 |traa_ynnydagh_TTLS = [[Traa houree yn Oarpey Veanagh|CEST]] |ashchur_utc_TTLS = +02:00 |cctld = [[.mc]] |coad_çhellvane = 377 }} Ta '''Monaco''', ny '''Prinsaght Monaco'''{{efn|{{langx|fr|Principauté de Monaco}}; {{langx|lij-MC|Prinçipatu de Mu̍negu}}; {{langx|lij|Prinçipato de Mónego}}; {{langx|oc|Principat de Mónegue}}; {{langx|it|Principato di Monaco}}}} ny steat ard-valjagh veg 'syn [[Yn Oarpey Heear|Oarpey Heear]] er coose hwoaie meanagh ny [[Yn Veanvooir|Meanvooir]], as joarey eck lesh [[Yn Rank|y Rank]] er tree çheughyn, as ny soie mygeayrt 16 km veih'n [[Yn Iddaal|Iddaal]]. Ta'n çheer beggan ny sloo na 2&nbsp;km² er eaghtyr lesh begnagh 33,000 cummaltee. Ta Monaco [[Rolley çheeraghyn as croghaneyn rere glooaght y phobble|ny çheer smoo cummaltit rere glooaght y phobble 'sy theihll]], as t'ee ny çheer Frangish sloo 'sy theihll. She Monaco ennym ny çheerey myrane lesh ennym y phreeu-valley. Dy mennick t'eh er credjal dy vel ee ny [[pargys-keesh]], as ta shiartanse dy ny cummaltee nyn gummaltee feer verçhagh as ad çheet ass çheeraghyn joarree. Ta yn sleih shen jannoo seose mooar-chooid jeh'n sleih-earroo ec mygeayrt 84% earroo yn phobble.<ref>{{en jalloo}} [http://www.state.gov/r/pa/ei/bgn/3397.htm Rheynn y Steat S.U.] Per capita purchasing power parity GDP (US dept. of State 2006 est.): $30,000</ref> Ta Monaco ny [[reeriaght vunraghtoil]] as ny [[prinsaght]], as she [[Albert II, Flah Monaco|y Flah Albert II]] fer toshee yn steat. Ta Monaco er ny ve reirit ec [[Reeraghtys Grimaldi]] veih'n vlein 1297, as va seyrsnys y steat currit er enney dy h-oikoil liorish [[ny Conaantyn Frangagh-Monacagh]] 'sy vlein 1861. Faagail magh dy vel Monaco ny steat seyr, ta coadey ny çheerey ny reggyrtys Frangagh. Cha nel Monaco ny h-oltey jeh'n [[Yn Unnaneys Oarpagh|Unnaneys Oarpagh]] agh ta'n [[oarey]] eck myr argid cadjin ny çheerey. == Noteyn == {{notelist}} == Imraaghyn == {{rolleyimraaghyn}} {{Yn Europey}} {{Preeu-valjyn ny h-Oarpey}} {{Gurneil eaghtyrys}} {{bun}} [[Ronney:Monaco| ]] [[Ronney:Preeu-valjyn 'syn Oarpey]] [[Ronney:Steatyn Creestee]] [[Ronney:Steatyn ard-valjagh]] [[Ronney:Çheeraghyn yn Oarpey]] [[Ronney:Coloinyn Massaliagh]] [[Ronney:Çheeraghyn-oltey Choonseil yn Oarpey]] [[Ronney:Çheeraghyn-oltey Organisation internationale de la Francophonie]] [[Ronney:Çheeraghyn-oltey Unnaneys y Veanvooir]] [[Ronney:Çheeraghyn-oltey ny h-Ashoonyn Unnaneysit]] [[Ronney:Ard-valjyn purtey er y Veanvooir]] [[Ronney:Prinsaghtyn]] [[Ronney:Steatyn as thallooyn bunnit 'sy vlein 1297]] [[Ronney:Thallooyn Phobblaght Genova]] [[Ronney:Meegrasteatyn yn Oarpey]] qtqb6ebeyw2wpfigfbb7lvk9faz82iy Ronney:Bunneeaghtyn ayns ny 1910yn 14 6598 393743 381284 2026-10-01T23:51:12Z MacTire02 219 -ronney 393743 wikitext text/x-wiki {{category series navigation}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 10]] [[Ronney:Toshiaghtyn ayns ny 1910yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1910]] 5vlz91o6lyl07rljqrwcts4kwnu1nkk Ronney:Bunneeaghtyn ayns ny 1940yn 14 13127 393745 380494 2026-10-02T00:11:06Z MacTire02 219 -ronney 393745 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1940s establishments|Bunneeaghtyn ayns ny 1940yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 40]] [[Ronney:Toshiaghtyn ayns ny 1940yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1940]] a6nnr4up61ekhnjcssi2cxrqxstz0q7 Ronney:Bunneeaghtyn ayns ny 1800yn 14 13269 393732 380943 2026-10-01T23:48:20Z MacTire02 219 ++ 393732 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1800s establishments|Bunneeaghtyn ayns ny 1800yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 1800yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1800]] piwjwexe02vow72vwhmku8dpnxg96yh Ronney:Feaillaghyn ayns Mannin 14 15345 393783 170531 2026-10-02T00:41:19Z MacTire02 219 ronney noa 393783 wikitext text/x-wiki [[Ronney:Taghyrtyn eunysseyrys ayns Mannin]] [[Ronney:Feaillaghyn 'sy Reeriaght Unnaneysit rere ard|Mannin]] d8ihonysup1xjikmyd0j9232xyg2z56 UTC+0 0 18574 393694 285419 2026-10-01T21:36:08Z MacTire02 219 kiartaghey yn duillag aa-enmyssit 393694 wikitext text/x-wiki #REDIRECT [[UTC+00:00]] p70j3m213hg338610uwcrxiaivwfqz5 UTC+00:00 0 18575 393692 290096 2026-10-01T21:35:25Z MacTire02 219 MacTire02 moved page [[UTC±00:00]] to [[UTC+00:00]]: rere ny stundayrtyn 290096 wikitext text/x-wiki [[Coadan:Timezones2011 UTC+0.png|right|thumb|300px|UTC - 2010: Gorrym (J. Geuree), jiarg-vuigh (J. Souree), buigh (car y vlein), bane-ghorrym (ardjyn 'syn 'aarkey)]] She '''UTC±00:00''' y traa shoh: * [[Traa Chadjin Cho-oardit]] (UTC), bun chorys traa yn dowan. * [[Traa ynnydagh ny h-Oarpey Heear]] ([[Yn Phortiugal|y Phortiugal]], y [[Reeriaght Unnaneysit]] as [[Pobblaght Nerin|Nerin]]). {{bun}} {{DEFAULTSORT:Utc±0}} [[Ronney:Cryssyn UTC]] bwrb4zio9ak92qfqp6c0n9femw2xxvq Module:Lang 828 30693 393696 392737 2026-10-01T21:51:01Z MacTire02 219 prowal 393696 Scribunto text/plain --[=[ Lua support for the {{lang}}, {{langx}}, {{lang-??}}, and {{transliteration}} templates and replacement of various supporting templates. ]=] require('strict'); local getArgs = require ('Module:Arguments').getArgs; local unicode = require ("Module:Unicode data"); -- for is_Latin() and is_rtl() local yesno = require ('Module:Yesno'); local sandbox = (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- when called from a sandbox template or module load sandbox data and sandbox configuration local lang_data = mw.loadData ('Module:Lang/data' .. sandbox); -- language name override and transliteration tool-tip tables local lang_name_table = lang_data.lang_name_table; -- language codes, names, regions, scripts, suppressed scripts local lang_table = lang_data.lang_name_table.lang; local lang_dep_table = lang_data.lang_name_table.lang_dep; local script_table = lang_data.lang_name_table.script; local region_table = lang_data.lang_name_table.region; local variant_table = lang_data.lang_name_table.variant; local suppressed_table = lang_data.lang_name_table.suppressed; local override_table = lang_data.override; local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code local cfg = mw.loadData ('Module:Lang/configuration' .. sandbox); -- for internationalization local is_latn_data = mw.loadData ('Module:Lang/data/is latn data'); local sizeof_ranges_t = is_latn_data.sizeof_ranges_t; local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local content_lang = mw.language.getContentLanguage(); local this_wiki_lang_tag = content_lang.code; -- get this wiki's language tag local this_wiki_lang_dir = content_lang:getDir(); -- get this wiki's language direction local initial_style_state; -- set by lang_xx_normal() and lang_xx_italic() local maint_cats = {}; -- maintenance categories go here local maint_msgs = {}; -- and their messages go here --[[--------------------------< M A K E _ E R R O R _ S P A N >-------------------------------------------------- ]] local function make_error_span (template, msg) return table.concat ({'<span style="color:var(--color-error,#d33)">', cfg.misc_text_t.error, ': ', template, msg, '</span>'}) end --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from template name, message text, help link, and error category. ]] local function make_error_msg (msg, args_t, template) local category; local text; -- handle the oddity that is {{langx}} if cfg.templates_t.langxx == template then text = args_t.text or args_t[1]; -- for {{lang-xx}} else text = args_t.text or args_t[2]; -- for {{lang}}, {{langx}}, and {{transliteration}} end if cfg.templates_t.transliteration == template then category = cfg.make_error_msg_t.xlit_err_cat; else category = cfg.make_error_msg_t.lang_err_cat; end local category_link = ((0 == namespace or 10 == namespace) and not args_t.nocat) and substitute ('[[Category:$1]]', {category}) or ''; return substitute ('[$1] <span style="color:var(--color-error,#d33)">$2: &#x7B;{$3}}: $4 ([[:Category:$5|$6]])</span>$7', -- &#x7B; prevents template name from being treated as a template call in certain situations { text or cfg.make_error_msg_t.undefined, cfg.misc_text_t.error, template, msg, category, cfg.misc_text_t.help, category_link }) end --[[--------------------------< P A R A M E T E R _ V A L I D A T E >------------------------------------------ ]] local function parameter_validate (args_t, template) local err_msg = cfg.parameter_validate_t.invalid_param; if cfg.templates_t.lang == template then -- for {{lang}} for param, _ in pairs (args_t) do if not cfg.known_params_t.params_lang_t[param] and -- unique {{lang}} parameters not cfg.known_params_t.common_params_all_t[param] then -- common to all return substitute (err_msg, {param}); -- <param> not found so abandon end end elseif cfg.templates_t.langx == template then -- for {{langx}} for param, _ in pairs (args_t) do if not cfg.known_params_t.params_langx_t[param] and -- unique {{langx}} parameters not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}} not cfg.known_params_t.common_params_all_t[param] then -- common to all return substitute (err_msg, {param}); -- <param> not found so abandon end end elseif cfg.templates_t.langxx == template then -- for {{lang-xx}} for param, _ in pairs (args_t) do if not cfg.known_params_t.params_lang_xx_t[param] and -- unique {{lang-xx}} parameters not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}} not cfg.known_params_t.common_params_all_t[param] then -- common to all return substitute (err_msg, {param}); -- <param> not found so abandon end end end end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set (var) return not (var == nil or var == ''); end --[[--------------------------< I N V E R T _ I T A L I C S >------------------------------------------------- This function attempts to invert the italic markup a args.text by adding/removing leading/trailing italic markup in args.text. Like |italic=unset, |italic=invert disables automatic italic markup. Individual leading/trailing apostrophes are converted to their HTML numeric entity equivalent so that the new italic markup doesn't become bold markup inadvertently. Leading and trailing wiki markup is extracted from args.text into separate table elements. Addition, removal, replacement of wiki markup is handled by a string.gsub() replacement table operating only on these separate elements. In the string.gsub() matching pattern, '.*' matches empty string as well as the three expected wiki markup patterns. This function expects that markup in args.text is complete and correct; if it is not, oddness may result. ]] local function invert_italics (source) local invert_pattern_table = { -- leading/trailing markup add/remove/replace patterns [""]="\'\'", -- empty string becomes italic markup ["\'\'"]="", -- italic markup becomes empty string ["\'\'\'"]="\'\'\'\'\'", -- bold becomes bold italic ["\'\'\'\'\'"]="\'\'\'", -- bold italic become bold }; local seg = {}; source = source:gsub ("%f[\']\'%f[^\']", '&#39;'); -- protect single quote marks from being interpreted as bold markup seg[1] = source:match ('^(\'\'+%f[^\']).+') or ''; -- get leading markup, if any; ignore single quote seg[3] = source:match ('.+(%f[\']\'\'+)$') or ''; -- get trailing markup, if any; ignore single quote if '' ~= seg[1] and '' ~= seg[3] then -- extract the 'text' seg[2] = source:match ('^\'\'+%f[^\'](.+)%f[\']\'\'+$') -- from between leading and trailing markup elseif '' ~= seg[1] then seg[2] = source:match ('^\'\'+%f[^\'](.+)') -- following leading markup elseif '' ~= seg[3] then seg[2] = source:match ('(.+)%f[\']\'\'+$') -- preceding trailing markup else seg[2] = source -- when there is no markup end seg[1] = invert_pattern_table[seg[1]] or seg[1]; -- replace leading markup according to pattern table seg[3] = invert_pattern_table[seg[3]] or seg[3]; -- replace leading markup according to pattern table return table.concat (seg); -- put it all back together and done end --[[--------------------------< V A L I D A T E _ I T A L I C >------------------------------------------------ Validates |italic= or |italics= assigned values. When |italic= is set and has an acceptable assigned value, return the matching CSS font-style property value or, for the special case 'default', return nil. When |italic= is not set, or has an unacceptable assigned value, return nil and a nil error message. When both |italic= and |italics= are set, returns nil and a 'conflicting' error message. The return value nil causes the calling lang, lang_xx, or xlit function to set args.italic according to the template's defined default ('inherit' for {{lang}}, 'inherit' or 'italic' for {{lang-??}} depending on the individual template's requirements, 'italic' for {{transliteration}}) or to the value appropriate to |script=, if set ({{lang}} and {{lang-??}} only). Accepted values and the values that this function returns are are: nil - when |italic= absent or not set; returns nil default - for completeness, should rarely if ever be used; returns nil yes - force args.text to be rendered in italic font; returns 'italic' no - force args.text to be rendered in normal font; returns 'normal' unset - disables font control so that font-style applied to text is dictated by markup inside or outside the template; returns 'inherit' invert - disables font control so that font-style applied to text is dictated by markup outside or inverted inside the template; returns 'invert' ]] local function validate_italic (args) local properties = {[cfg.keywords_t.affirmative] = 'italic', [cfg.keywords_t.negative] = 'normal', [cfg.keywords_t.unset] = 'inherit', [cfg.keywords_t.invert] = 'invert', [cfg.keywords_t.default] = nil}; local count = 0 for _, arg in pairs {'italic', 'italics', 'i'} do if args[arg] then count = count + 1 end end if count > 1 then -- return nil and an error message if more than one is set return nil, cfg.validate_italic_t.multi_italic; end return properties[args.italic or args.italics or args.i], nil; -- return an appropriate value and a nil error message end --[=[--------------------------< V A L I D A T E _ C A T _ A R G S >---------------------------------------------------------- Default behavior of the {{lang}} and {{lang-??}} templates is to add categorization when the templates are used in main space. This default functionality may be suppressed by setting |nocat=yes or |cat=no. This function selects one of these two parameters to control categorization. Because having two parameters with 'opposite' names and 'opposite' values is confusing, this function accepts only affirmative values for |nocat= and only negative values for |cat=; in both cases the 'other' sense (and non-sense) is not accepted and the parameter is treated as if it were not set in the template. Sets args.nocat to true if categorization is to be turned off; to nil if the default behavior should apply. Accepted values for |nocat= are the text strings: 'yes', 'y', 'true', 't', on, '1' -- [[Module:Yesno]] returns logical true for all of these; false or nil else for |cat= 'no', 'n', 'false', 'f', 'off', '0' -- [[Module:Yesno]] returns logical false for all of these; true or nil else ]=] local function validate_cat_args (args) if not (args.nocat or args.cat) then -- both are nil, so categorize return; end if false == yesno (args.cat) or true == yesno (args.nocat) then args.nocat = true; -- set to true when args.nocat is affirmative; nil else (as if the parameter were not set in the template) else -- args.nocat is the parameter actually used. args.nocat = nil; end end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack. ]] local function in_array (needle, haystack) if needle == nil then return false; end for n,v in ipairs (haystack) do if v == needle then return n; end end return false; end --[[--------------------------< F O R M A T _ I E T F _ T A G >------------------------------------------------ Prettify IETF tags to use recommended subtag formats: code: lower case script: sentence case region: upper case variant: lower case private: lower case prefixed with -x- ]] local function format_ietf_tag (code, script, region, variant, private) local out = {}; if is_set (private) then return table.concat ({code:lower(), 'x', private:lower()}, '-'); -- if private, all other tags ignored end table.insert (out, code:lower()); if is_set (script) then script = script:lower():gsub ('^%a', string.upper); table.insert (out, script); end if is_set (region) then table.insert (out, region:upper()); end if is_set (variant) then table.insert (out, variant:lower()); end return table.concat (out, '-'); end --[[--------------------------< G E T _ I E T F _ P A R T S >-------------------------------------------------- Extracts and returns IETF language tag parts: primary language subtag (required) - 2 or 3 character IANA language code script subtag - four character IANA script code region subtag - two-letter or three digit IANA region code variant subtag - four digit or 5-8 alnum variant code; only one variant subtag supported private subtag - x- followed by 1-8 alnum private code; only supported with the primary language tag in any one of these forms lang lang-variant lang-script lang-script-variant lang-region lang-region-variant lang-script-region lang-script-region-variant lang-x-private each of lang, script, region, variant, and private, when used, must be valid. Languages with both two- and three-character code synonyms are promoted to the two-character synonym because the IANA registry file omits the synonymous three-character code; we cannot depend on browsers understanding the synonymous three-character codes in the lang= attribute. For {{lang-??}} templates, the parameters |script=, |region=, and |variant= are supported (not supported in {{lang}} because those parameters are superfluous to the IETF subtags in |code=). Returns six values; all lower case. Valid parts are returned as themselves; omitted parts are returned as empty strings, invalid parts are returned as nil; the sixth returned item is an error message (if an error detected) or nil. See http://www.rfc-editor.org/rfc/bcp/bcp47.txt section 2.1. ]] local function get_ietf_parts (source, args_script, args_region, args_variant) local code, script, region, variant, private; -- IETF tag parts if not is_set (source) then return nil, nil, nil, nil, nil, cfg.get_ietf_parts_t.missing_lang_tag; end local pattern = { -- table of tables holding acceptable IETF tag patterns and short names of the IETF part captured by the pattern {'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 1 - ll-Ssss-RR-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 2 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 4 digits) {'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 3 - ll-Ssss-RR-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 4 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$', 's', 'v'}, -- 5 - ll-Ssss-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%a%a%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'v'}, -- 6 - ll-Ssss-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$', 'r', 'v'}, -- 7 - ll-RR-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%d%d%d)%-(%d%d%d%d)$', 'r', 'v'}, -- 8 - ll-DDD-variant (where region is 3 digits; variant is 4 digits) {'^(%a%a%a?)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 9 - ll-RR-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 10 - ll-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%d%d%d%d)$', 'v'}, -- 11 - ll-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%w%w%w%w%w%w?%w?%w?)$', 'v'}, -- 12 - ll-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)$', 's', 'r'}, -- 13 - ll-Ssss-RR {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)$', 's', 'r'}, -- 14 - ll-Ssss-DDD (region is 3 digits) {'^(%a%a%a?)%-(%a%a%a%a)$', 's'}, -- 15 - ll-Ssss {'^(%a%a%a?)%-(%a%a)$', 'r'}, -- 16 - ll-RR {'^(%a%a%a?)%-(%d%d%d)$', 'r'}, -- 17 - ll-DDD (region is 3 digits) {'^(%a%a%a?)$'}, -- 18 - ll {'^(%a%a%a?)%-x%-(%w%w?%w?%w?%w?%w?%w?%w?)$', 'p'}, -- 19 - ll-x-pppppppp (private is 1-8 alnum characters) } local t = {}; -- table of captures; serves as a translator between captured IETF tag parts and named variables for i, v in ipairs (pattern) do -- spin through the pattern table looking for a match local c1, c2, c3, c4; -- captures in the 'pattern' from the pattern table go here c1, c2, c3, c4 = source:match (pattern[i][1]); -- one or more captures set if source matches pattern[i]) if c1 then -- c1 always set on match code = c1; -- first capture is always code t = { [pattern[i][2] or 'x'] = c2, -- fill the table of captures with the rest of the captures [pattern[i][3] or 'x'] = c3, -- take index names from pattern table and assign sequential captures [pattern[i][4] or 'x'] = c4, -- index name may be nil in pattern[i] table so "or 'x'" spoofs a name for this index in this table }; script = t.s or ''; -- translate table contents to named variables; region = t.r or ''; -- absent table entries are nil so set named IETF parts to empty string for concatenation variant= t.v or ''; private = t.p or ''; break; -- and done end end if not code then return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_tag, {source}); -- don't know what we got but it is malformed end code = code:lower(); -- ensure that we use and return lower case version of this if not (override_table[code] or lang_table[code] or synonym_table[code] or lang_dep_table[code]) then return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_code, {code}); -- invalid language code, don't know about the others (don't care?) end if synonym_table[code] then -- if 639-2/639-2T code has a 639-1 synonym table.insert (maint_cats, substitute (cfg.get_ietf_parts_t.maint_promo_cat, {code})); table.insert (maint_msgs, substitute (cfg.get_ietf_parts_t.maint_promo_msg, {code, synonym_table[code]})); code = synonym_table[code]; -- use the synonym end if is_set (script) then if is_set (args_script) then return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_scr; -- both code with script and |script= not allowed end else script = args_script or ''; -- use args.script if provided end if is_set (script) then script = script:lower(); -- ensure that we use and return lower case version of this if not script_table[script] then return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_scr_code, {script, code}); -- language code OK, invalid script, don't know about the others (don't care?) end end if suppressed_table[script] then -- ensure that code-script does not use a suppressed script if in_array (code, suppressed_table[script]) then return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.script_code, {script, code}); -- language code OK, script is suppressed for this code end end if is_set (region) then if is_set (args_region) then return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_reg; -- both code with region and |region= not allowed end else region = args_region or ''; -- use args.region if provided end if is_set (region) then region = region:lower(); -- ensure that we use and return lower case version of this if not region_table[region] then return code, script, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_reg_code, {region, code}); end end if is_set (variant) then if is_set (args_variant) then return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_var; -- both code with variant and |variant= not allowed end else variant = args_variant or ''; -- use args.variant if provided end if is_set (variant) then variant = variant:lower(); -- ensure that we use and return lower case version of this if not variant_table[variant] then -- make sure variant is valid return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var, {variant}); end -- does this duplicate/replace tests in lang() and lang_xx()? if is_set (script) then -- if script set it must be part of the 'prefix' if not in_array (table.concat ({code, '-', script}), variant_table[variant]['prefixes']) then return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_scr, {variant, code, script}); end elseif is_set (region) then -- if region set, there are some prefixes that require lang code and region (en-CA-newfound) if not in_array (code, variant_table[variant]['prefixes']) then -- first see if lang code is all that's required (en-oxendict though en-GB-oxendict is preferred) if not in_array (table.concat ({code, '-', region}), variant_table[variant]['prefixes']) then -- now try for lang code and region (en-CA-newfound) return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_reg, {variant, code, region}); end end else -- cheap way to determine if there are prefixes; fonipa and others don't have prefixes; # operator always returns 0 if variant_table[variant]['prefixes'][1] and not in_array (code, variant_table[variant]['prefixes']) then return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code, {variant, code}); end end end if is_set (private) then private = private:lower(); -- ensure that we use and return lower case version of this if not override_table[table.concat ({code, '-x-', private})] then -- make sure private tag is valid; note that index return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_pri, {private}); end end return code, script, region, variant, private, nil; -- return the good bits; make sure that msg is nil end --[=[-------------------------< M A K E _ W I K I L I N K >---------------------------------------------------- Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an empty string. ]=] local function make_wikilink (link, display) if is_set (link) then if is_set (display) then return table.concat ({'[[', link, '|', display, ']]'}); else return table.concat ({'[[', link, ']]'}); end else return ''; end end --[[--------------------------< D I V _ M A R K U P _ A D D >-------------------------------------------------- Adds <i> and </i> tags to list-item text or to implied <p>..</p> text. Mixed not supported. ]] local function div_markup_add (text, style) if text:find ('^\n[%*:;#]') then -- look for list markup; list markup must begin at start of text if 'italic' == style then return text:gsub ('(\n[%*:;#]+)([^\n]+)', '%1<i>%2</i>'); -- insert italic markup at each list item else return text; end end if text:find ('\n+') then -- look for any number of \n characters in text text = text:gsub ('([^\n])\n([^\n])', '%1 %2'); -- replace single newline characters with a space character which mimics MediaWiki if 'italic' == style then text = text:gsub('[^\n]+', '<p><i>%1</i></p>'); -- insert p and italic markup tags at each implied p (two or more consecutive '\n\n' sequences) else text = text:gsub ('[^\n]+', '<p>%1</p>'); -- insert p markup at each implied p text = text:gsub ('\n', ''); -- strip newline characters end end return text; end --[[--------------------------< T I T L E _ W R A P P E R _ M A K E >------------------------------------------ Makes a <span title="<title text>"><content_text></span> or <div title="<title text>"><content_text></div> where <title text> is in the tool-tip in the wiki's local language and <content_text> is non-local-language text in HTML markup. This because the lang= attribute applies to the content of its enclosing tag. <tag> holds a string 'div' or 'span' used to choose the correct wrapping tag. ]] local function title_wrapper_make (title_text, content_text, tag) local wrapper_t = {}; table.insert (wrapper_t, table.concat ({'<', tag})); -- open opening wrapper tag table.insert (wrapper_t, ' title=\"'); -- begin title attribute table.insert (wrapper_t, title_text); -- add <title_text> table.insert (wrapper_t, '\">'); -- end title attribute and close opening wrapper tag table.insert (wrapper_t, content_text); -- add <content_text> table.insert (wrapper_t, table.concat ({'</', tag, '>'})); -- add closing wrapper tag return table.concat (wrapper_t); -- make a big string and done end --[[--------------------------< M A K E _ T E X T _ H T M L >-------------------------------------------------- Add the HTML markup to text according to the type of content that it is: <span> or <i> tags for inline content or <div> tags for block content The lang= attribute also applies to the content of the tag where it is placed so this is wrong because 'Spanish language text' is English: <i lang="es" title="Spanish language text">casa</i> should be: <span title="Spanish language text"><i lang="es">casa</i></span> or for <div>...</div>: <div title="Spanish language text"><div lang="es"><spanish-language-text></div></div> ]] local function make_text_html (code, text, tag, rtl, style, size, language) local html_t = {}; local style_added = ''; local wrapper_tag = tag; -- <tag> gets modified so save a copy for use when/if we create a wrapper span or div if text:match ('^%*') then table.insert (html_t, '&#42;'); -- move proto language text prefix outside of italic markup if any; use numeric entity because plain splat confuses MediaWiki text = text:gsub ('^%*', ''); -- remove the splat from the text end if 'span' == tag then -- default HTML tag for inline content if 'italic' == style then -- but if italic tag = 'i'; -- change to <i> tags end else -- must be div so go text = div_markup_add (text, style); -- handle implied <p>, implied <p> with <i>, and list markup (*;:#) with <i> end table.insert (html_t, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> HTML tag code = code:gsub ('%-x%-.*', ''); -- strip private use subtag from code tag because meaningless outside of Wikipedia table.insert (html_t, table.concat ({' lang="', code, '\"'})); -- add language attribute if (rtl or unicode.is_rtl(text)) and ('ltr' == this_wiki_lang_dir) then -- text is right-to-left on a left-to-right wiki table.insert (html_t, ' dir="rtl"'); -- add direction attribute for right-to-left languages elseif not (rtl or unicode.is_rtl(text)) and ('rtl' == this_wiki_lang_dir) then -- text is left-to-right on a right-to-left wiki table.insert (html_t, ' dir="ltr"'); -- add direction attribute for left-to-right languages end if 'normal' == style then -- when |italic=no table.insert (html_t, ' style=\"font-style: normal;'); -- override external markup, if any style_added = '\"'; -- remember that style attribute added and is not yet closed end if is_set (size) then -- when |size=<something> if is_set (style_added) then table.insert (html_t, table.concat ({' font-size: ', size, ';'})); -- add when style attribute already inserted else table.insert (html_t, table.concat ({' style=\"font-size: ', size, ';'})); -- create style attribute style_added = '\"'; -- remember that style attribute added and is not yet closed end end table.insert (html_t, table.concat ({style_added, '>'})); -- close the opening HTML tag table.insert (html_t, text); -- insert the text table.insert (html_t, table.concat ({'</', tag, '>'})); -- close the 'text' <i>, <span>, or <div> HTML tag if is_set (language) then -- create a <title_text> string for the title= attribute in a wrapper span or div local title_text; if 'zxx' == code then -- special case for this tag 'no linguistic content' title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.zxx}); -- not a language so don't use 'language' in title text elseif mw.ustring.find (language, 'languages', 1, true) then title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.collective}); -- for collective languages else title_text = substitute ('$2 $1', {language, cfg.make_text_html_t.individual}); end return title_wrapper_make (title_text, table.concat (html_t), wrapper_tag); else return table.concat (html_t); end end --[=[-------------------------< M A K E _ C A T E G O R Y >---------------------------------------------------- For individual language, <language>, returns: [[Ronney:Artyn goaill stiagh teks ayns <language>]] For English: [[Ronney:Artyn goaill stiagh teks ayns Baarle]] For ISO 639-2 collective languages (and for 639-1 bh): [[Ronney:Artyn goaill stiagh teks ayns <language>]] ]=] local function make_category (code, language_name, nocat, name_get) if ((0 ~= namespace) or nocat) and not name_get then -- only categorize in article space return ''; -- return empty string for concatenation end if mw.ustring.find (language_name, 'languages', 1, true) then return substitute ('[[$1 $2]]', {cfg.make_category_t.collective_cat, language_name}); end if this_wiki_lang_tag == code then return substitute ('[[$1 $2 $3-$4]]', { -- unique category name for the local language cfg.make_category_t.cat_prefix, language_name, cfg.make_category_t.explicit_cat, }); else return substitute ('[[$1 $2$3]]', { cfg.make_category_t.cat_prefix, language_name, cfg.make_category_t.cat_postfix }); end end --[[--------------------------< M A K E _ T R A N S L I T >---------------------------------------------------- Return translit <i lang=xx-Latn>...</i> where xx is the language code; else return empty string. The value |script= is not used in {{transliteration}} for this purpose; instead it uses |code. Because language scripts are listed in the {{transliteration}} switches they are included in the data tables. The script parameter is introduced at {{Language with name and transliteration}}. If |script= is set, this function uses it in preference to code. To avoid confusion, in this module and the templates that use it, the transliteration script parameter is renamed to be |translit-script= (in this function, tscript). This function is used by both lang_xx() and xlit() lang_xx() always provides code, language_name, and translit; may provide tscript; never provides style xlit() always provides language_name, translit, and one of code or tscript, never both; always provides style For {{transliteration}}, style only applies when a language code is provided. ]] local function make_translit (code, language_name, translit, std, tscript, style, engvar) local title_t = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards local title_text = ''; -- tool tip text for title= attribute std = std and std:lower(); -- lower case for table indexing if not is_set (std) and not is_set (tscript) then -- when neither standard nor script specified title_text = language_name; -- write a generic tool tip if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name) title_text = substitute ('$1-$2', {title_text, cfg.misc_text_t.language}); -- skip this text (individual and macro languages only) end title_text = substitute ('$1 $2', {title_text, mw.ustring.lower (cfg.engvar_t[engvar]['romanisz_lc'])}); -- finish the tool tip; use romanization when neither script nor standard supplied elseif is_set (std) and is_set (tscript) then -- when both are specified if title_t[std] then -- and if standard is legitimate if title_t[std][tscript] then -- and if script for that standard is legitimate if script_table[tscript] then title_text = substitute ('$1$2 ($3 $4) $5', { -- add the appropriate text to the tool tip title_text, title_t[std][tscript:lower()], script_table[tscript], cfg.make_translit_t.script, cfg.make_translit_t.transliteration, }); else title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard? end else title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard? end else return ''; -- invalid standard, setup for error message end elseif is_set (std) then -- translit-script not set, use language code if not title_t[std] then return ''; end -- invalid standard, setup for error message if title_t[std][code] then -- if language code is in the table (xlit may not provide a language code) local fmt_str = '$1$2 ($3 $4) $5'; -- generic format string for tool tip if language_name:match ('languages') then fmt_str = '$1$2 ($3) $5'; -- format string for collective languages tool tip end title_text = substitute (fmt_str, { -- add the appropriate text to the tool tip title_text, title_t[std][code:lower()], language_name, cfg.misc_text_t.language, cfg.make_translit_t.transliteration, }); else -- code doesn't match title_text = title_text .. title_t[std]['default']; -- so use the standard's default end else -- here if translit-script set but translit-std not set if title_t['no_std'][tscript] then title_text = title_text .. title_t['no_std'][tscript]; -- use translit-script if set elseif title_t['no_std'][code] then title_text = title_text .. title_t['no_std'][code]; -- use language code else if is_set (tscript) then title_text = substitute ('$1$2-$3 $4', { -- write a script tool tip title_text, language_name, cfg.make_translit_t.script, cfg.make_translit_t.transliteration, }); elseif is_set (code) then if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name) title_text = substitute ('$1-$2', { -- skip this text (individual and macro languages only) title_text, cfg.misc_text_t.language, }); end title_text = substitute ('$1 $2', { -- finish the tool tip title_text, cfg.make_translit_t.transliteration, }); else title_text = substitute ('$1 $2', { -- generic tool tip (can we ever get here?) title_text, cfg.make_translit_t.transliteration, }); end end end local tag if is_set (code) then -- when a language code is provided (always with {{lang-??}} templates, not always with {{transliteration}}) code = code:match ('^(%a%a%a?)'); -- strip all subtags leaving only the language subtag if not style then -- nil for the default italic style tag = '<i lang="%s-Latn">%s</i>' else tag = '<span style="font-style: %s" lang="%s-Latn">%s</span>' -- non-standard style, construct a span tag for it tag = string.format(tag, style, "%s", "%s") end tag = string.format(tag, code, "%s") else tag = '<span>%s</span>' -- when no language code: no lang= attribute, not italic ({{transliteration}} only) end tag = string.format(tag, translit) -- add the translit text if '' == title_text then -- when there is no need for a tool-tip return tag; -- done else title_text = cfg.engvar_sel_t.gb == engvar and title_text:gsub ('([Rr]omani)z', '%1s') or title_text; -- gb eng when engvar specifies gb eng; us eng else return title_wrapper_make (title_text, tag, 'span'); -- wrap with a tool-tip span and done end end --[[--------------------------< V A L I D A T E _ T E X T >---------------------------------------------------- This function checks the content of args.text and returns empty string if nothing is amiss else it returns an error message. The tests are for empty or missing text and for improper or disallowed use of apostrophe markup. Italic rendering is controlled by the |italic= template parameter so italic markup should never appear in args.text either as ''itself'' or as '''''bold italic''''' unless |italic=unset or |italic=invert. ]] local function validate_text (template, args) if not is_set (args.text) then return make_error_msg (cfg.validate_text_t.no_text, args, template); end if args.text:find ("%f[\']\'\'\'\'%f[^\']") or args.text:find ("\'\'\'\'\'[\']+") then -- because we're looking, look for 4 appostrophes or 6+ appostrophes return make_error_msg (cfg.validate_text_t.malformed_markup, args, template); end local style = args.italic; if (cfg.keywords_t.unset ~= style) and (cfg.keywords_t.invert ~=style) then if args.text:find ("%f[\']\'\'%f[^\']") or args.text:find ("%f[\']\'\'\'\'\'%f[^\']") then -- italic but not bold, or bold italic return make_error_msg (cfg.validate_text_t.italic_markup, args, template); end end end --[[--------------------------< R E N D E R _ M A I N T >------------------------------------------------------ Render mainenance messages and categories. ]] local function render_maint (nocat) local maint = {}; if 0 < #maint_msgs then -- when there are maintenance messages table.insert (maint, table.concat ({'<span class="lang-comment" style="font-style: normal; display: none; color: #33aa33; margin-left: 0.3em;">'})); -- opening <span> tag for _, msg in ipairs (maint_msgs) do table.insert (maint, table.concat ({msg, ' '})); -- add message strings end table.insert (maint, '</span>'); -- close the span end if (0 < #maint_cats) and (0 == namespace) and not nocat then -- when there are maintenance categories; article namespace only for _, cat in ipairs (maint_cats) do table.insert (maint, table.concat ({'[[Category:', cat, ']]'})); -- format and add the categories end end return table.concat (maint); end --[[--------------------------< P R O T O _ P R E F I X >------------------------------------------------------ For proto languages, text is prefixed with a splat. We do that here as a flag for make_text_html() so that a splat will be rendered outside of italic markup (if used). If the first character in text here is already a splat, we do nothing. proto_param is boolean or nil; true adds splat prefix regardless of language name; false removes and inhibits regardless of language name; nil does nothing; presumes that the value in text is correct but removes extra splac. ]] local function proto_prefix (text, language_name, proto_param) if false == proto_param then -- when forced by |proto=no return text:gsub ('^%**', ''); -- return text without splat prefix regardless of language name or existing splat prefix in text elseif (language_name:find ('^Proto%-') or (true == proto_param)) then -- language is a proto or forced by |proto=yes return text:gsub ('^%**', '*'); -- prefix proto-language text with a splat; also removes duplicate prefixing splats end return text:gsub ('^%*+', '*'); -- return text unmolested except multiple splats reduced to one splat end --[[--------------------------< H A S _ P O E M _ T A G >------------------------------------------------------ Looks for a poem strip marker in text; returns true when found; false else. Auto-italic detection disabled when text has poem stripmarker because it is not possible for this code to know the content that will replace the stripmarker. ]] local function has_poem_tag (text) return text:find ('\127[^\127]*UNIQ%-%-poem%-[%a%d]+%-QINU[^\127]*\127') and true or false; end --[[--------------------------< H T M L _ T A G _ S E L E C T >------------------------------------------------ Inspects content of and selectively trims text. Returns text and the name of an appropriate HTML tag for text. If text contains: \n\n text has implied <p>..</p> tags - trim leading and trailing whitespace and return If text begins with list markup: \n* unordered \n; definition \n: definition \n# ordered trim all leading whitespace except \n and trim all trailing whitespace If text contains <poem>...</poem> stripmarker, return text unmodified and choose <div>..</div> tags because the stripmarker is replaced with text wrapped in <div>..</div> tags. If the text contains any actual <div>...</div> tags, then it's again returned unmodified and <div>...</div> tags are used to wrap it, to prevent div/span inversion. ]] local function html_tag_select (text) local tag; if has_poem_tag (text) then -- contains poem stripmarker (we can't know the content of that) tag = 'div'; -- poem replacement is in div tags so lang must use div tags elseif text:find ('<div') then -- reductive; if the text contains a div tag, we must use div tags tag = 'div'; elseif mw.text.trim (text):find ('\n\n+') then -- contains implied p tags text = mw.text.trim (text); -- trim leading and trailing whitespace characters tag = 'div'; -- must be div because span may not contain p tags (added later by MediaWiki); poem replacement is in div tags elseif text:find ('\n[%*:;%#]') then -- if text has list markup text = text:gsub ('^[\t\r\f ]*', ''):gsub ('%s*$', ''); -- trim all whitespace except leading newline character '\n' tag = 'div'; -- must be div because span may not contain ul, dd, dl, ol tags (added later by MediaWiki) else text = mw.text.trim (text); -- plain text tag = 'span'; -- so span is fine end return text, tag; end --[[--------------------------< V A L I D A T E _ P R O T O >-------------------------------------------------- Validates value assigned to |proto=; permitted values are yes and no; yes returns as true, no returns as false, empty string (or parameter omitted) returns as nil; any other value returns nil with <proto_param> as second return value for use in error message. ]] local function validate_proto (proto_param) if cfg.keywords_t.affirmative == proto_param then return true; elseif cfg.keywords_t.negative == proto_param then return false; elseif is_set (proto_param) then return nil, proto_param; -- |proto= something other than 'yes' or 'no' else return nil; -- missing or empty end end --[[--------------------------< L A N G U A G E _ N A M E _ G E T >-------------------------------------------- Common function to return language name from the data set according to IETF tag. Returns language name if found in data tables; nil else. ]] local function language_name_get (ietf, code, cat) ietf = ietf:lower(); -- ietf:lower() because format_ietf_tag() returns mixed case local name; -- remains nil if not found if override_table[ietf] then -- look for whole IETF tag in override table name = override_table[ietf]; elseif override_table[code] then -- not there so try basic language tag name = override_table[code]; elseif lang_table[code] then -- shift to IANA active tag/name table name = lang_table[code]; elseif lang_dep_table[code] then -- try the IANA deprecated tag/name table name = lang_dep_table[code]; end if lang_dep_table[code] and cat then -- because deprecated code may have been overridden to en.wiki preferred name table.insert (maint_cats, substitute (cfg.language_name_get_t.deprecated_cat, {code})); table.insert (maint_msgs, substitute (cfg.language_name_get_t.deprecated_msg, {code})); end return name; -- name from data tables or nil end --[[--------------------------< T E X T _ S C R I P T _ M A T C H _ T E S T >---------------------------------- IETF script subtag should match the script of the <text>. This module does not attempt to know all scripts and what they look like. It does know what Latn script looks like so when <text> is written using other than the Latn script, the IETF script subtag, if present, should not be Latn. Conversely, when <text> is written using the Latn script, the IETF script subtag, if present, should be Latn. For the purposes of this test, Latf (Fraktur) and Latg (Gaelic) are considered to be equivalent to Latn because unicode treats these two scripts as font-specific variants of Latn. Returns an error message when mismatch detected; nil else. ]] local function text_script_match_test (script, is_latn_text, pos, char) local scripts_t = {['latf'] = true, ['latg'] = true, ['latn'] = true}; -- unicode 'latn' scripts; 'latf' and 'latg' are font variants so there are no Fraktur or Gaelic codepoints if is_set (script) then -- don't bother with the rest of this if <script> is nil or empty string script = script:lower(); -- lower case to index into <scripts_t> if is_latn_text then -- when text is wholly Latn script if not scripts_t[script] then -- but a non-Latn script is specified return cfg.text_script_match_test_t.latn_txt_mismatch; -- emit an error message end else -- when text is not wholly Latn script if scripts_t[script] then -- but a Latn script is specified return substitute (cfg.text_script_match_test_t.latn_scr_mismatch, {pos, char}); -- emit an error message with position of first offending character end end end end --[[--------------------------< B I N A R Y _ S E A R C H >--------------------------------------------------- conducts a binary search of <ranges_t> for a sub-range that holds <target>. returns boolean true if a sub-range holding <target> is found; boolean false else. ]] local function binary_search (target, ranges_t) local idx_bot = 1; -- initialize to index of first key local idx_top = sizeof_ranges_t; -- initialize to index of last key (number of keys) if (target < ranges_t[idx_bot][1]) or (target > ranges_t[idx_top][2]) then -- invalid; target out of range return; -- abandon end local idx_mid; -- calculated index of range midway between top index and bottom index local flag = false; -- flag to tell us when we've evaluated last (highest) range in <ranges_t> while 1 do idx_mid = math.ceil ((idx_bot + idx_top) / 2); -- get the mid-point in the <ranges_t> sequence if (target >= ranges_t[idx_mid][1]) and (target <= ranges_t[idx_mid][2]) then -- indexed range low value <= target <= indexed range high value return true; -- we found the range that holds the <target> character; return true elseif (target > ranges_t[idx_mid][2]) then -- is <target> > indexed range high value? idx_bot = idx_mid; -- adjust <idx_bot> up else -- here when <target> less than indexed range low value idx_top = idx_mid - 1; -- adjust <idx_top> down end if flag then break; -- here when we just evaluated the last range and <target> not found end if not flag and (idx_bot == idx_top) then -- set true just before we evaluate the last (highest) range in <ranges_t> flag = true; end end end --[[--------------------------< I S _ L A T I N >-------------------------------------------------------------- compare <text> as codepoints to lists of known codepoints accepted as Latn script returns boolean true and modified <text> when <text> is wrapped in accept-as-written markup returns boolean true and <text> when codepoint is known returns boolean false, <text>, non-Latn codepoint position in <text> (left to right), and the codepoint character when codepoint is not known TODO: when text has accept-as-written markup, return a non-boolean value to indicate that <text> is not wholly latn script? Use that return value to create non-Latn HTML lang= attribute because <text> isn't really latn so lang=und (undetermined)? or instead, omit the -Latn subtag? (without -Latn need to force |italic=yes) ]] local function is_latin (text, tag) local count; text, count = text:gsub ('^%(%((.+)%)%)$', '%1'); -- remove accept-as-written markup if present if 0 ~= count then return true, text; -- markup present so assume that <text> is Latn-script end local pos = 0; -- position counter for error messaging for codepoint in mw.ustring.gcodepoint (text) do -- fetch each code point pos = pos + 1; -- bump the position counter if not is_latn_data.singles_t[codepoint] and -- codepoint not found in the singles list? not binary_search (codepoint, is_latn_data.ranges_t) and -- codepoint not a member of a listed range? not (tag and is_latn_data.specials_t[codepoint] and is_latn_data.specials_t[codepoint][tag]) then -- not a language-specific codepoint? return false, text, pos, mw.ustring.char (codepoint); -- codepoint not known; return false with codepoint position and character representation end end return true, text; -- is known; return <text> end --[[--------------------------< _ L A N G >-------------------------------------------------------------------- Entry point for {{lang}}. There should be no reason to set parameters in the {{lang}} {{#invoke:}} <includeonly>{{#invoke:lang|lang}}</includeonly> Parameters are received from the template's frame (parent frame). ]] local function _lang (args) local out = {}; local language_name; -- used to make category names local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set local subtags = {}; -- IETF subtags script, region, variant, and private local code; -- the language code local msg; -- for error messages local tag = 'span'; -- initial value for make_text_html() local template = args.template or cfg.templates_t.lang; maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once maint_msgs = {}; validate_cat_args (args); -- determine if categorization should be suppressed if args[1] and args.code then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'1', cfg.lang_t.conflict_n_param_types.code}), args, template); else args.code = args[1] or args.code; -- prefer args.code end if args[2] and args.text then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'2', cfg.lang_t.conflict_n_param_types.text}), args, template); else args.text = args[2] or args.text; -- prefer args.text end msg = validate_text (template, args); -- ensure that |text= is set if is_set (msg) then -- msg is an already-formatted error message return msg; end args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag if msg then return make_error_msg (substitute (cfg.lang_t.invalid_proto, {msg}), args, template); end code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code); -- |script=, |region=, |variant= not supported because they should be part of args.code ({{{1}}} in {{lang}}) if msg then return make_error_msg (msg, args, template); end local is_latn_text, pos, char; is_latn_text, args.text, pos, char= is_latin (args.text, code); -- make a boolean msg = text_script_match_test (subtags.script, is_latn_text, pos, char) if msg then -- if an error detected then there is an error message return make_error_msg (msg, args, template); end args.italic, msg = validate_italic (args); if msg then return make_error_msg (msg, args, template); end if nil == args.italic then -- nil when |italic= absent or not set or |italic=default; args.italic controls if ('latn' == subtags.script) or -- script is latn (this_wiki_lang_tag ~= code and not is_set (subtags.script) and not has_poem_tag (args.text) and is_latn_text) then -- text not this wiki's language, no script specified and not in poem markup but is wholly latn script (auto-italics) args.italic = 'italic'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic else args.italic = 'inherit'; -- italic not set; script not latn; inherit current style end end if is_set (subtags.script) then -- if script set, override rtl setting if in_array (subtags.script, lang_data.rtl_scripts) then args.rtl = true; -- script is an rtl script else args.rtl = false; -- script is not an rtl script end end args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant if cfg.keywords_t.invert == args.italic and 'span' == tag then -- invert only supported for in-line content args.text = invert_italics (args.text) end args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.italic, args.size, language_name)); table.insert (out, make_category (code, language_name, args.nocat)); table.insert (out, render_maint (args.nocat)); -- maintenance messages and categories return table.concat (out); -- put it all together and done end --[[--------------------------< L A N G >---------------------------------------------------------------------- Entry point for {{lang}}. There should be no reason to set parameters in the {{lang}} {{#invoke:}} <includeonly>{{#invoke:lang|lang}}</includeonly> Parameters are received from the template's frame (parent frame). ]] local function lang (frame) local args_t = getArgs (frame, { -- this code so that we can detect and handle wiki list markup in text valueFunc = function (key, value) if 2 == key or 'text' == key then -- the 'text' parameter; do not trim wite space return value; -- return untrimmed 'text' elseif value then -- all other values: if the value is not nil value = mw.text.trim (value); -- trim whitespace if '' ~= value then -- empty string when value was only whitespace return value; end end return nil; -- value was empty or contained only whitespace end -- end of valueFunc }); args_t.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang|...}} local msg = parameter_validate (args_t, cfg.templates_t.lang); -- verify that all supplied parameters are supported by {{lang-??}} if msg then return make_error_msg (msg, args_t, cfg.templates_t.lang); -- when template has unsupported params, abandon with error message end return _lang (args_t); end --[[--------------------------< T R A N S L A T I O N _ M A K E >---------------------------------------------- Stand-alone function to create literal translation of main text. Also used by {{lang-x2}}. ]] local function translation_make (args_t) local translation_t = {', '}; -- initialize output if 'none' ~= args_t.label then -- if we want a label table.insert (translation_t, '<small>'); -- open the <small> HTML tag if cfg.keywords_t.negative == args_t.link then table.insert (translation_t, substitute ('<abbr title="$1">$2</abbr>', {cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr})); -- unlinked form else table.insert (translation_t, make_wikilink (cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr)); -- linked form end table.insert (translation_t, "&thinsp;</small>"); -- close the <small> HTML tag end table.insert (translation_t, table.concat ({ -- user styling spans match spand from {{gloss}} '<span class="gloss-quot">\'</span>', -- user styling span for quote marks; use HTML entities to avoid wiki markup confusion '<span class="gloss-text">', -- open user styling span for the translation args_t.translation, -- the translation '</span>', -- close user styling span for the translation '<span class="gloss-quot">\'</span>' -- user styling span for quote marks })); return table.concat (translation_t); -- make a big string and done end --[[--------------------------< _ L A N G _ X X >-------------------------------------------------------------- For the {{lang-??}} templates, the only parameter required to be set in the template is the language code. All other parameters can, usually should, be written in the template call. For {{lang-??}} templates for languages that can have multiple writing systems, it may be appropriate to set |script= as well. For each {{lang-??}} template choose the appropriate entry-point function so that this function knows the default styling that should be applied to text. For normal, upright style: <includeonly>{{#invoke:lang|lang_xx_inherit|code=xx}}</includeonly> For italic style: <includeonly>{{#invoke:lang|lang_xx_italic|code=xx}}</includeonly> All other parameters should be received from the template's frame (parent frame) Supported parameters are: |code = (required) the IANA language code |script = IANA script code; especially for use with languages that use multiple writing systems |region = IANA region code |variant = IANA variant code |text = (required) the displayed text in language specified by code |link = boolean false ('no') does not link code-spcified language name to associated language article |rtl = boolean true ('yes') identifies the language specified by code as a right-to-left language |nocat = boolean true ('yes') inhibits normal categorization; error categories are not affected |cat = boolian false ('no') opposite form of |nocat= |italic = boolean true ('yes') renders displayed text in italic font; boolean false ('no') renders displayed text in normal font; not set renders according to initial_style_state |lit = text that is a literal translation of text |label = 'none' to suppress all labeling (language name, 'translit.', 'lit.') any other text replaces language-name label - automatic wikilinking disabled for those {{lang-??}} templates that support transliteration (those templates where |text= is not entirely latn script): |translit = text that is a transliteration of text |translit-std = the standard that applies to the transliteration |translit-script = ISO 15924 script name; falls back to code For {{lang-??}}, the positional parameters are: {{{1}}} text {{{2}}} transliterated text {{{3}}} literal translation text no other positional parameters are allowed ]] local function _lang_xx (args, base_template) -- base_template will be either of 'langx' or 'lang-xx' local out = {}; local language_name; -- used to make display text, article links local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set local subtags = {}; -- IETF subtags script, region, and variant local code; -- the language code local translit_script_name; -- name associated with IANA (ISO 15924) script code local translit; local msg; -- for error messages local tag = 'span'; -- initial value for make_text_html() local template = args.template or base_template; maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once maint_msgs = {}; local text_idx = (cfg.templates_t.langx == base_template) and 2 or 1; -- for {{langx}} 'text' positional parameter is '2' local translit_idx = (cfg.templates_t.langx == base_template) and 3 or 2; local xlate_idx = (cfg.templates_t.langx == base_template) and 4 or 3; if args[text_idx] and args.text then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {text_idx, cfg.lang_t.conflict_n_param_types.text}), args, template); else args.text = args[text_idx] or args.text; -- prefer positional 'text' parameter end msg = validate_text (template, args); -- ensure that |text= is set, does not contain italic markup and is protected from improper bolding if is_set (msg) then return msg; end args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly if args[translit_idx] and args.translit then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.translit}), args, template); else args.translit = args[translit_idx] or args.translit -- prefer positional 'translit' parameter end args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else if args[xlate_idx] and (args.translation or args.lit) then return make_error_msg (substitute (cfg.lang_xx_t.conflict_n_lit, {xlate_idx}), args, template); elseif args.translation and args.lit then return make_error_msg (cfg.lang_xx_t.conflict_lit, args, template); else args.translation = args[xlate_idx] or args.translation or args.lit; -- prefer positional 'translation' parameter end if args.links and args.link then return make_error_msg (cfg.lang_xx_t.conflict_link, args, template); else args.link = args.link or args.links; -- prefer args.link end validate_cat_args (args); -- determine if categorization should be suppressed args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code, args.script, args.region, args.variant); -- private omitted because private if msg then -- if an error detected then there is an error message return make_error_msg (msg, args, template); end if args.translit then local latn, pos, char; latn, args.translit, pos, char = is_latin (args.translit, (('' ~= subtags.private) and (code .. '-x-' .. subtags.private)) or code); if not latn then return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); end end local is_latn_text, text, pos, char = is_latin (args.text, code); -- make a boolean args.text = text; -- may have been modified (accept-as-written markup removed) msg = text_script_match_test (subtags.script, is_latn_text, pos, char) if msg then -- if an error detected then there is an error message return make_error_msg (msg, args, template); end args.italic, msg = validate_italic (args); if msg then return make_error_msg (msg, args, template); end if cfg.templates_t.langx == base_template then -- auto-italics for {{langx}} templates; adapted from {{lang}} (no support for poem tag) if nil == args.italic then -- nil when |italic= absent or not set or |italic=default; args.italic controls if ('latn' == subtags.script) or -- script is latn (this_wiki_lang_tag ~= code and not is_set (subtags.script) and is_latn_text) then -- text is not this wiki's language, no script specified and is wholly latn script (auto-italics) args.italic = 'italic'; -- set font-style:italic else args.italic = 'inherit'; -- italic not set; script not latn; inherit current style end end else -- {{lang-xx}} does not do auto italics; retained for those wikis that don't support {{langx}} if nil == args.italic then -- args.italic controls if is_set (subtags.script) then if 'latn' == subtags.script then args.italic = 'italic'; -- |script=Latn; set for font-style:italic else args.italic = initial_style_state; -- italic not set; script is not latn; set for font-style:<initial_style_state> end else args.italic = initial_style_state; -- here when |italic= and |script= not set; set for font-style:<initial_style_state> end end end if is_set (subtags.script) then -- if script set override rtl setting if in_array (subtags.script, lang_data.rtl_scripts) then args.rtl = true; -- script is an rtl script else args.rtl = false; -- script is not an rtl script end end args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag if msg then return make_error_msg (substitute (cfg.lang_t.invalid_proto, {args.proto}), args, template); end args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant category_name = language_name; -- category names retain IANA parenthetical diambiguators (if any) language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them if args.label then if 'none' ~= args.label then table.insert (out, table.concat ({args.label, ': '})); -- custom label end else if cfg.keywords_t.negative == args.link then table.insert (out, language_name); -- language name without wikilink else if mw.ustring.find (language_name, 'languages', 1, true) then table.insert (out, make_wikilink (language_name)); -- collective language name uses simple wikilink elseif lang_data.article_name[args.code:lower()] then -- is IETF tag in article name over ride? table.insert (out, make_wikilink (lang_data.article_name[args.code:lower()], language_name)); -- language name with wikilink from override data elseif lang_data.article_name[code] then -- is language tag in article override table.insert (out, make_wikilink (lang_data.article_name[code], language_name)); -- language name with wikilink from override data else table.insert (out, make_wikilink (language_name, language_name)); -- Manx language name with wikilink end end table.insert (out, ': '); -- separator end if cfg.keywords_t.invert == args.italic then args.text = invert_italics (args.text) end args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.italic, args.size, ('none' == args.label) and language_name or nil)) if is_set (args.translit) and not is_latn_text then -- transliteration; not supported when args.text is wholly latn text (this is an imperfect test) table.insert (out, ', '); -- comma to separate text from translit if 'none' ~= args.label then table.insert (out, '<small>'); if script_table[args['translit-script']] then -- when |translit-script= is set, try to use the script's name translit_script_name = script_table[args['translit-script']]; else translit_script_name = language_name; -- fall back on language name end local translit_title_obj = mw.title.makeTitle (0, substitute ('$1 $2',{cfg.lang_xx_t.romanization, translit_script_name})); -- make a title object; no engvar, article titles use US spelling if translit_title_obj.exists and (cfg.keywords_t.negative ~= args.link) then table.insert (out, make_wikilink (substitute ('$1 $2', {cfg.lang_xx_t.romanization, translit_script_name or language_name}), substitute ('$1', {cfg.engvar_t[args.engvar]['romanisz_pt']})) .. ':'); -- make a wikilink if there is an article to link to; engvar the display text else table.insert (out, substitute ('$1:', {cfg.engvar_t[args.engvar]['romanisz_pt']})); -- else plain text per engvar end table.insert (out, '&nbsp;</small>'); -- close the small tag end translit = make_translit (args.code, language_name, args.translit, args['translit-std'], args['translit-script'], nil, args.engvar) if is_set (translit) then table.insert (out, translit); else return make_error_msg (substitute ('$1: $2', {cfg.lang_xx_t.invalid_xlit_std, args['translit-std'] or '[missing]'}), args, template); end elseif is_set (args.translit) and is_latn_text then -- when creating a transliteration of Latn script <text> return make_error_msg (cfg.lang_xx_t.xlit_of_latn, args, template); -- emit error message and abandon end if is_set (args.translation) then -- translation (not supported in {{lang}}) table.insert (out, translation_make (args)); end table.insert (out, make_category (code, category_name, args.nocat)); table.insert (out, render_maint(args.nocat)); -- maintenance messages and categories return table.concat (out); -- put it all together and done end --[[--------------------------< L A N G _ X X _ A R G S _ G E T >---------------------------------------------- Common function to get args table from {{lang-??}} templates. Returns table of args. Text positional parameters are not trimmed here but are selectively trimmed at html_tag_select(). ]] local function lang_xx_args_get (frame, base_template) local args_t = getArgs(frame, { parentFirst= true, -- parameters in the template override parameters set in the {{#invoke:}} valueFunc = function (key, value) if ((cfg.templates_t.langx == base_template) and 2 or 1) == key then -- the 'text' positional parameter; 1 for {{lang-??}}, 2 for {{langx}}; do not trim wite space return value; -- return untrimmed 'text' positional parameter elseif value then -- all other values: if the value is not nil value = mw.text.trim (value); -- trim whitespace if '' ~= value then -- empty string when value was only whitespace return value; end end return nil; -- value was empty or contained only whitespace end -- end of valueFunc }); return args_t; end --[[--------------------------< L A N G _ X X _ I T A L I C >-------------------------------------------------- Entry point for those {{lang-??}} templates that call lang_xx_italic(). Sets the initial style state to italic. ]] local function lang_xx_italic (frame) local args = lang_xx_args_get (frame, cfg.templates_t.langxx); args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_italic|...}} local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}} if msg then return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message end initial_style_state = 'italic'; return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category end --[[--------------------------< _ L A N G _ X X _ I T A L I C >------------------------------------------------ Entry point from another module. Sets the initial style state to italic. ]] local function _lang_xx_italic (args) initial_style_state = 'italic'; return _lang_xx (args, cfg.templates_t.langxx); end --[[--------------------------< L A N G _ X X _ I N H E R I T >------------------------------------------------ Entry point for those {{lang-??}} templates that call lang_xx_inherit(). Sets the initial style state to inherit. ]] local function lang_xx_inherit (frame) local args = lang_xx_args_get (frame, cfg.templates_t.langxx); args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_inherit|...}} local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}} if msg then return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message end initial_style_state = 'inherit'; return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category end --[[--------------------------< _ L A N G _ X X _ I N H E R I T >---------------------------------------------- Entry point from another module. Sets the initial style state to inherit. ]] local function _lang_xx_inherit (args) initial_style_state = 'inherit'; return _lang_xx (args, cfg.templates_t.langxx); end --[[--------------------------< _ L A N G X >------------------------------------------------------------------ Entry point from another module. ]] local function _langx (args_t) local langx_data = mw.loadData ('Module:Lang/langx'); -- get necessary data local rtl_t = langx_data.rtl_t; -- get list of language tags for languages that are rendered right-to-left local link_t = langx_data.link_t; -- get list of language tags for {{lang-??}} templates that set |link=<something> local size_t = langx_data.size_t; -- get list of language tags for {{lang-??}} templates that set |size=<something> local msg = parameter_validate (args_t, cfg.templates_t.langx); if msg then return make_error_msg (msg, args_t, cfg.templates_t.langx); end args_t.code = args_t[1] or args_t.code; -- get the language tag; must be {{{1}}} or |code= if not args_t.code then return make_error_msg (cfg.get_ietf_parts_t.missing_lang_tag, args_t, cfg.templates_t.langx); end args_t.rtl = args_t.rtl or (rtl_t[args_t.code] and cfg.keywords_t.affirmative); -- prefer |rtl= in template call, use rtl_t else args_t.link = args_t.link or link_t[args_t.code]; -- prefer |link= in template call, use link_t felse args_t.size = args_t.size or size_t[args_t.code]; -- prefer |size= in template call, use size_t else args_t[1] = nil; -- unset to mimic {{lang-??}} templates which set |code=xx local lang_subtag = args_t.code; -- use only the base language subtag for unsupported tag test; some args_t.code are modified by |script= etc return _lang_xx (args_t, cfg.templates_t.langx); end --[[--------------------------< L A N G X >-------------------------------------------------------------------- Entry point for {{langx}}. this function calls _lang_xx() to render non-English text. The {{lang-??}} templates have three positional paramters but {{langx}} has four: | 1 | 2 | 3 | 4 {{lang-xx |<text> |<xlit> |<xlat> }} {{langx |<tag> |<text> |<xlit> |<xlat> }} The calls to lang_xx_args_get() and _lang_xx() use 'langx' as a flag for those functions to select the proper positional parameters. {{lang-??}} depends on the calling template to select 'inherit' or 'italic' to establish the default rendering. {{langx}} can't do that. The initial version of {{langx}} relied on a list of language tags (inherit_t in ~/langx) scraped from those {{lang-??}} templates that call lang_xx_inherit() to render text in upright font. langx() now uses auto-italics code adapted from {{lang}} (doesn't support poem tags). ]] local function langx (frame) local args_t = lang_xx_args_get (frame, cfg.templates_t.langx); -- get the arguments; 'langx' is the <base_template> used to decide which positional param is 'text', 'translit', 'lit' return _langx (args_t); end --[[--------------------------< _ I S _ I E T F _ T A G >------------------------------------------------------ Returns true when a language name associated with IETF language tag exists; nil else. IETF language tag must be valid. All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function. Module entry point from another module. ]] local function _is_ietf_tag (tag) -- entry point when this module is require()d into another local c, s, r, v, p, err; -- code, script, region, variant, private, error message c, s, r, v, p, err = get_ietf_parts (tag); -- disassemble tag into constituent part and validate return ((c and not err) and true) or nil; -- return true when code portion has a value without error message; nil else end --[[--------------------------< I S _ I E T F _ T A G >-------------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function is_ietf_tag (frame) return _is_ietf_tag (getArgs (frame)[1]); -- args[1] is the IETF language tag to be tested; also get parent frame end --[[--------------------------< I S _ I E T F _ T A G _ F R A M E >-------------------------------------------- Module entry point from an {{#invoke:}}; same as is_ietf_tag() except does not get parameters from the parent (template) frame. This function not useful when called by {{lang|fn=is_ietf_tag_frame|<tag>}} because <tag> is in the parent frame. ]] local function is_ietf_tag_frame (frame) return _is_ietf_tag (getArgs (frame, {frameOnly = true,})[1]); -- args[1] is the IETF language tag to be tested; do not get parent frame end --[[--------------------------< _ N A M E _ F R O M _ T A G >-------------------------------------------------- Returns language name associated with IETF language tag if valid; error message else. All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function. Set invoke's |link= parameter to yes to get wikilinked version of the language name. Module entry point from another module. ]] local function _name_from_tag (args) local subtags = {}; -- IETF subtags script, region, variant, and private local raw_code = args[1]; -- save a copy of the input IETF subtag local link = cfg.keywords_t.affirmative == args['link']; -- make a boolean local label = args.label; local code; -- the language code local msg; -- gets an error message if IETF language tag is malformed or invalid local language_name = ''; code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code); if msg then local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template) return make_error_span (template, msg); end raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private language_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant if 'yes' ~= args.raw then language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them end if link then -- when |link=yes, wikilink the language name if mw.ustring.find (language_name, 'languages', 1, true) then language_name = make_wikilink (language_name, label); -- collective language name uses simple wikilink elseif lang_data.article_name[raw_code:lower()] then -- is IETF tag in article name override? language_name = make_wikilink (lang_data.article_name[raw_code:lower()], label or language_name); -- language name with wikilink from override data elseif lang_data.article_name[code] then -- is language tag in article name override? language_name = make_wikilink (lang_data.article_name[code], label or language_name); -- language name with wikilink from override data else language_name = make_wikilink (language_name, label or language_name); -- Manx language name with wikilink end end return language_name; end --[[--------------------------< N A M E _ F R O M _ T A G >---------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function name_from_tag (frame) -- entry point from an {{#invoke:lang|name_from_tag|<IETF tag>|link=<yes>|template=<template name>}} return _name_from_tag (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame end --[[--------------------------< _ T A G _ F R O M _ N A M E >-------------------------------------------------- Returns the IETF language tag associated with the language name. Spelling of language name must be correct according to the spelling in the source tables. When a standard language name has a parenthetical disambiguator, that disambiguator must be omitted (they are not present in the data name-to-tag tables). Module entry point from another module. ]] local function _tag_from_name (args) -- entry point from another module local msg; if args[1] and '' ~= args[1] then local data = mw.loadData ('Module:Lang/tag from name'); -- get the reversed data tables TODO: change when going live local lang = args[1]:lower(); -- allow any-case for the language name (speeling must till be correct) local tag = data.rev_override_table[lang] or data.rev_lang_table[lang] or data.rev_lang_dep_table[lang]; -- get the code; look first in the override then in the standard if tag then return tag, true; -- language name found so return tag and done; second return used by is_lang_name() else msg = substitute (cfg.tag_from_name_t.lang_not_found, {args[1]}); -- language name not found, error message end else msg = cfg.tag_from_name_t.missing_lang_name; -- language name not found, error message end local template = ''; if args.template and '' ~= args.template then template = table.concat ({'{{', args['template'], '}}: '}); -- make template name (if provided by the template) end return make_error_span (template, msg); end --[[--------------------------< T A G _ F R O M _ N A M E >---------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function tag_from_name (frame) -- entry point from an {{#invoke:lang|tag_from_name|<language name>|link=<yes>|template=<template name>}} local result, _ = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by is_lang_name() return result; end --[[--------------------------< I S _ L A N G _ N A M E >------------------------------------------------------ Module entry point from an {{#invoke:}}. ]] local function is_lang_name (frame) local _, result = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by tag_from_name() return result and true or nil; end --[[--------------------------< _ X L I T >-------------------------------------------------------------------- Module entry point from another module. ]] local function _xlit (args) local title_table = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards local language_name; -- language name that matches language code; used for tool tip local translit; -- transliterated text to display local script; -- IANA script local msg; -- for when called functions return an error message local template = args.template or cfg.templates_t.transliteration; maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once maint_msgs = {}; if is_set (args[3]) then -- [3] set when {{transliteration|code|standard|text}} args.text = args[3]; -- get the transliterated text args.translit_std = args[2] and args[2]:lower(); -- get the standard; lower case for table indexing if not title_table[args.translit_std] then return make_error_msg (substitute (cfg.transl_t.unrecog_xlit_std, {args.translit_std}), args, template); end else if is_set (args[2]) then -- [2] set when {{transliteration|code|text}} args.text = args[2]; -- get the transliterated text else if args[1] and (args[1]:match ('^%a%a%a?%a?$') or -- args[2] missing; is args[1] a language or script tag or is it the transliterated text? args[1]:match ('^%a%a%a?%-x%-')) then -- or is args[1] a private-use tag return make_error_msg (cfg.transl_t.no_text, args, template); -- args[1] is a code so we're missing text else args.text = args[1]; -- args[1] is not a code so we're missing that; assign args.text for error message return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); end end end if is_set (args[1]) then -- IANA language code used for HTML lang= attribute; or ISO 15924 script code if args[1]:match ('^%a%a%a?%a?$') or args[1]:match ('^%a%a%a?%-x%-') then -- args[1] has correct form? args.code = args[1]:lower(); -- use the language/script code; only (2, 3, or 4 alpha characters) or private-use; lower case because table indexes are lower case else return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args[1]}), args, template); -- invalid language / script code end else return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); -- missing language / script code so quit end local is_latn_text, pos, char; is_latn_text, args.text, pos, char= is_latin (args.text, args.code); -- is latn text? strip accept-as-written markup if not is_latn_text then -- when text is not latn return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); -- abandon with error message end args.italic, msg = validate_italic (args); if msg then return make_error_msg (msg, args, template); end if 'italic' == args.italic then -- 'italic' when |italic=yes; because that is same as absent or not set and |italic=default args.italic = nil; -- set to nil; end args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else if override_table[args.code] then -- is code a language code defined in the override table? language_name = override_table[args.code]; args.code = args.code:match ('^%a%a%a?'); -- if private use, strip all but language subtag elseif lang_table[args.code] then -- is code a language code defined in the standard language code tables? language_name = lang_table[args.code]; elseif lang_dep_table[args.code] then -- is code a language code defined in the deprecated language code tables? language_name = lang_dep_table[args.code]; elseif script_table[args.code] then -- if here, code is not a language code; is it a script code? language_name = script_table[args.code]; script = args.code; -- code was an ISO 15924 script so use that instead args.code = ''; -- unset because not a language code else return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args.code}), args, template); -- invalid language / script code end -- here only when all parameters passed to make_translit() are valid return make_translit (args.code, language_name, args.text, args.translit_std, script, args.italic, args.engvar); end --[[--------------------------< X L I T >---------------------------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function xlit (frame) return _xlit (getArgs(frame)); end --[[--------------------------< C A T E G O R Y _ F R O M _ T A G >-------------------------------------------- Returns category name associated with IETF language tag if valid; error message else. All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function. Module entry point from another module. ]] local function _category_from_tag (args_t) local subtags = {}; -- IETF subtags script, region, variant, and private local raw_code = args_t[1]; -- save a copy of the input IETF subtag local link = cfg.keywords_t.affirmative == args_t.link; -- make a boolean local label = args_t.label; local code; -- the language code local msg; -- gets an error message if IETF language tag is malformed or invalid local category_name = ''; code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code); if msg then local template = (args_t.template and table.concat ({'{{', args_t.template, '}}: '})) or ''; -- make template name (if provided by the template) return make_error_span (template, msg); end raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private category_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', ''); if link then return table.concat ({'[[:', category_name, ']]'}); else return category_name; end end --[[--------------------------< C A T E G O R Y _ F R O M _ T A G >-------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function category_from_tag (frame) -- entry point from an {{#invoke:lang|category_from_tag|<IETF tag>|template=<template name>}} return _category_from_tag (getArgs (frame)); -- pass-on the args table, nothing else; getArgs() so we also get parent frame end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { category_from_tag = category_from_tag, -- frame entry points when this module is #invoke:ed into templates/wikitext lang = lang, -- entry point for {{lang}} langx = langx, -- entry point for {{langx}} lang_xx_inherit = lang_xx_inherit, -- entry points for {{lang-??}} lang_xx_italic = lang_xx_italic, is_ietf_tag = is_ietf_tag, is_ietf_tag_frame = is_ietf_tag_frame, is_lang_name = is_lang_name, tag_from_name = tag_from_name, -- returns IETF tag associated with language name name_from_tag = name_from_tag, -- used for template documentation; possible use in ISO 639 name from code templates xlit = xlit, -- entry point for {{transliteration}} _category_from_tag = _category_from_tag, -- API entry points when this module is require()d into other modules _lang = _lang, _langx = _langx, _lang_xx_inherit = _lang_xx_inherit, _lang_xx_italic = _lang_xx_italic, _is_ietf_tag = _is_ietf_tag, get_ietf_parts = get_ietf_parts, _tag_from_name = _tag_from_name, _name_from_tag = _name_from_tag, _xlit = _xlit, _translation_make = translation_make, }; jsqrc30emdj82pvdrlfjfliwlkemjlp 393697 393696 2026-10-01T21:52:18Z MacTire02 219 ren mee jarrood y $4 dy ghoaill magh 393697 Scribunto text/plain --[=[ Lua support for the {{lang}}, {{langx}}, {{lang-??}}, and {{transliteration}} templates and replacement of various supporting templates. ]=] require('strict'); local getArgs = require ('Module:Arguments').getArgs; local unicode = require ("Module:Unicode data"); -- for is_Latin() and is_rtl() local yesno = require ('Module:Yesno'); local sandbox = (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- when called from a sandbox template or module load sandbox data and sandbox configuration local lang_data = mw.loadData ('Module:Lang/data' .. sandbox); -- language name override and transliteration tool-tip tables local lang_name_table = lang_data.lang_name_table; -- language codes, names, regions, scripts, suppressed scripts local lang_table = lang_data.lang_name_table.lang; local lang_dep_table = lang_data.lang_name_table.lang_dep; local script_table = lang_data.lang_name_table.script; local region_table = lang_data.lang_name_table.region; local variant_table = lang_data.lang_name_table.variant; local suppressed_table = lang_data.lang_name_table.suppressed; local override_table = lang_data.override; local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code local cfg = mw.loadData ('Module:Lang/configuration' .. sandbox); -- for internationalization local is_latn_data = mw.loadData ('Module:Lang/data/is latn data'); local sizeof_ranges_t = is_latn_data.sizeof_ranges_t; local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local content_lang = mw.language.getContentLanguage(); local this_wiki_lang_tag = content_lang.code; -- get this wiki's language tag local this_wiki_lang_dir = content_lang:getDir(); -- get this wiki's language direction local initial_style_state; -- set by lang_xx_normal() and lang_xx_italic() local maint_cats = {}; -- maintenance categories go here local maint_msgs = {}; -- and their messages go here --[[--------------------------< M A K E _ E R R O R _ S P A N >-------------------------------------------------- ]] local function make_error_span (template, msg) return table.concat ({'<span style="color:var(--color-error,#d33)">', cfg.misc_text_t.error, ': ', template, msg, '</span>'}) end --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from template name, message text, help link, and error category. ]] local function make_error_msg (msg, args_t, template) local category; local text; -- handle the oddity that is {{langx}} if cfg.templates_t.langxx == template then text = args_t.text or args_t[1]; -- for {{lang-xx}} else text = args_t.text or args_t[2]; -- for {{lang}}, {{langx}}, and {{transliteration}} end if cfg.templates_t.transliteration == template then category = cfg.make_error_msg_t.xlit_err_cat; else category = cfg.make_error_msg_t.lang_err_cat; end local category_link = ((0 == namespace or 10 == namespace) and not args_t.nocat) and substitute ('[[Category:$1]]', {category}) or ''; return substitute ('[$1] <span style="color:var(--color-error,#d33)">$2: &#x7B;{$3}}: $4 ([[:Category:$5|$6]])</span>$7', -- &#x7B; prevents template name from being treated as a template call in certain situations { text or cfg.make_error_msg_t.undefined, cfg.misc_text_t.error, template, msg, category, cfg.misc_text_t.help, category_link }) end --[[--------------------------< P A R A M E T E R _ V A L I D A T E >------------------------------------------ ]] local function parameter_validate (args_t, template) local err_msg = cfg.parameter_validate_t.invalid_param; if cfg.templates_t.lang == template then -- for {{lang}} for param, _ in pairs (args_t) do if not cfg.known_params_t.params_lang_t[param] and -- unique {{lang}} parameters not cfg.known_params_t.common_params_all_t[param] then -- common to all return substitute (err_msg, {param}); -- <param> not found so abandon end end elseif cfg.templates_t.langx == template then -- for {{langx}} for param, _ in pairs (args_t) do if not cfg.known_params_t.params_langx_t[param] and -- unique {{langx}} parameters not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}} not cfg.known_params_t.common_params_all_t[param] then -- common to all return substitute (err_msg, {param}); -- <param> not found so abandon end end elseif cfg.templates_t.langxx == template then -- for {{lang-xx}} for param, _ in pairs (args_t) do if not cfg.known_params_t.params_lang_xx_t[param] and -- unique {{lang-xx}} parameters not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}} not cfg.known_params_t.common_params_all_t[param] then -- common to all return substitute (err_msg, {param}); -- <param> not found so abandon end end end end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set (var) return not (var == nil or var == ''); end --[[--------------------------< I N V E R T _ I T A L I C S >------------------------------------------------- This function attempts to invert the italic markup a args.text by adding/removing leading/trailing italic markup in args.text. Like |italic=unset, |italic=invert disables automatic italic markup. Individual leading/trailing apostrophes are converted to their HTML numeric entity equivalent so that the new italic markup doesn't become bold markup inadvertently. Leading and trailing wiki markup is extracted from args.text into separate table elements. Addition, removal, replacement of wiki markup is handled by a string.gsub() replacement table operating only on these separate elements. In the string.gsub() matching pattern, '.*' matches empty string as well as the three expected wiki markup patterns. This function expects that markup in args.text is complete and correct; if it is not, oddness may result. ]] local function invert_italics (source) local invert_pattern_table = { -- leading/trailing markup add/remove/replace patterns [""]="\'\'", -- empty string becomes italic markup ["\'\'"]="", -- italic markup becomes empty string ["\'\'\'"]="\'\'\'\'\'", -- bold becomes bold italic ["\'\'\'\'\'"]="\'\'\'", -- bold italic become bold }; local seg = {}; source = source:gsub ("%f[\']\'%f[^\']", '&#39;'); -- protect single quote marks from being interpreted as bold markup seg[1] = source:match ('^(\'\'+%f[^\']).+') or ''; -- get leading markup, if any; ignore single quote seg[3] = source:match ('.+(%f[\']\'\'+)$') or ''; -- get trailing markup, if any; ignore single quote if '' ~= seg[1] and '' ~= seg[3] then -- extract the 'text' seg[2] = source:match ('^\'\'+%f[^\'](.+)%f[\']\'\'+$') -- from between leading and trailing markup elseif '' ~= seg[1] then seg[2] = source:match ('^\'\'+%f[^\'](.+)') -- following leading markup elseif '' ~= seg[3] then seg[2] = source:match ('(.+)%f[\']\'\'+$') -- preceding trailing markup else seg[2] = source -- when there is no markup end seg[1] = invert_pattern_table[seg[1]] or seg[1]; -- replace leading markup according to pattern table seg[3] = invert_pattern_table[seg[3]] or seg[3]; -- replace leading markup according to pattern table return table.concat (seg); -- put it all back together and done end --[[--------------------------< V A L I D A T E _ I T A L I C >------------------------------------------------ Validates |italic= or |italics= assigned values. When |italic= is set and has an acceptable assigned value, return the matching CSS font-style property value or, for the special case 'default', return nil. When |italic= is not set, or has an unacceptable assigned value, return nil and a nil error message. When both |italic= and |italics= are set, returns nil and a 'conflicting' error message. The return value nil causes the calling lang, lang_xx, or xlit function to set args.italic according to the template's defined default ('inherit' for {{lang}}, 'inherit' or 'italic' for {{lang-??}} depending on the individual template's requirements, 'italic' for {{transliteration}}) or to the value appropriate to |script=, if set ({{lang}} and {{lang-??}} only). Accepted values and the values that this function returns are are: nil - when |italic= absent or not set; returns nil default - for completeness, should rarely if ever be used; returns nil yes - force args.text to be rendered in italic font; returns 'italic' no - force args.text to be rendered in normal font; returns 'normal' unset - disables font control so that font-style applied to text is dictated by markup inside or outside the template; returns 'inherit' invert - disables font control so that font-style applied to text is dictated by markup outside or inverted inside the template; returns 'invert' ]] local function validate_italic (args) local properties = {[cfg.keywords_t.affirmative] = 'italic', [cfg.keywords_t.negative] = 'normal', [cfg.keywords_t.unset] = 'inherit', [cfg.keywords_t.invert] = 'invert', [cfg.keywords_t.default] = nil}; local count = 0 for _, arg in pairs {'italic', 'italics', 'i'} do if args[arg] then count = count + 1 end end if count > 1 then -- return nil and an error message if more than one is set return nil, cfg.validate_italic_t.multi_italic; end return properties[args.italic or args.italics or args.i], nil; -- return an appropriate value and a nil error message end --[=[--------------------------< V A L I D A T E _ C A T _ A R G S >---------------------------------------------------------- Default behavior of the {{lang}} and {{lang-??}} templates is to add categorization when the templates are used in main space. This default functionality may be suppressed by setting |nocat=yes or |cat=no. This function selects one of these two parameters to control categorization. Because having two parameters with 'opposite' names and 'opposite' values is confusing, this function accepts only affirmative values for |nocat= and only negative values for |cat=; in both cases the 'other' sense (and non-sense) is not accepted and the parameter is treated as if it were not set in the template. Sets args.nocat to true if categorization is to be turned off; to nil if the default behavior should apply. Accepted values for |nocat= are the text strings: 'yes', 'y', 'true', 't', on, '1' -- [[Module:Yesno]] returns logical true for all of these; false or nil else for |cat= 'no', 'n', 'false', 'f', 'off', '0' -- [[Module:Yesno]] returns logical false for all of these; true or nil else ]=] local function validate_cat_args (args) if not (args.nocat or args.cat) then -- both are nil, so categorize return; end if false == yesno (args.cat) or true == yesno (args.nocat) then args.nocat = true; -- set to true when args.nocat is affirmative; nil else (as if the parameter were not set in the template) else -- args.nocat is the parameter actually used. args.nocat = nil; end end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack. ]] local function in_array (needle, haystack) if needle == nil then return false; end for n,v in ipairs (haystack) do if v == needle then return n; end end return false; end --[[--------------------------< F O R M A T _ I E T F _ T A G >------------------------------------------------ Prettify IETF tags to use recommended subtag formats: code: lower case script: sentence case region: upper case variant: lower case private: lower case prefixed with -x- ]] local function format_ietf_tag (code, script, region, variant, private) local out = {}; if is_set (private) then return table.concat ({code:lower(), 'x', private:lower()}, '-'); -- if private, all other tags ignored end table.insert (out, code:lower()); if is_set (script) then script = script:lower():gsub ('^%a', string.upper); table.insert (out, script); end if is_set (region) then table.insert (out, region:upper()); end if is_set (variant) then table.insert (out, variant:lower()); end return table.concat (out, '-'); end --[[--------------------------< G E T _ I E T F _ P A R T S >-------------------------------------------------- Extracts and returns IETF language tag parts: primary language subtag (required) - 2 or 3 character IANA language code script subtag - four character IANA script code region subtag - two-letter or three digit IANA region code variant subtag - four digit or 5-8 alnum variant code; only one variant subtag supported private subtag - x- followed by 1-8 alnum private code; only supported with the primary language tag in any one of these forms lang lang-variant lang-script lang-script-variant lang-region lang-region-variant lang-script-region lang-script-region-variant lang-x-private each of lang, script, region, variant, and private, when used, must be valid. Languages with both two- and three-character code synonyms are promoted to the two-character synonym because the IANA registry file omits the synonymous three-character code; we cannot depend on browsers understanding the synonymous three-character codes in the lang= attribute. For {{lang-??}} templates, the parameters |script=, |region=, and |variant= are supported (not supported in {{lang}} because those parameters are superfluous to the IETF subtags in |code=). Returns six values; all lower case. Valid parts are returned as themselves; omitted parts are returned as empty strings, invalid parts are returned as nil; the sixth returned item is an error message (if an error detected) or nil. See http://www.rfc-editor.org/rfc/bcp/bcp47.txt section 2.1. ]] local function get_ietf_parts (source, args_script, args_region, args_variant) local code, script, region, variant, private; -- IETF tag parts if not is_set (source) then return nil, nil, nil, nil, nil, cfg.get_ietf_parts_t.missing_lang_tag; end local pattern = { -- table of tables holding acceptable IETF tag patterns and short names of the IETF part captured by the pattern {'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 1 - ll-Ssss-RR-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 2 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 4 digits) {'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 3 - ll-Ssss-RR-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 4 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$', 's', 'v'}, -- 5 - ll-Ssss-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%a%a%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'v'}, -- 6 - ll-Ssss-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$', 'r', 'v'}, -- 7 - ll-RR-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%d%d%d)%-(%d%d%d%d)$', 'r', 'v'}, -- 8 - ll-DDD-variant (where region is 3 digits; variant is 4 digits) {'^(%a%a%a?)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 9 - ll-RR-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 10 - ll-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%d%d%d%d)$', 'v'}, -- 11 - ll-variant (where variant is 4 digits) {'^(%a%a%a?)%-(%w%w%w%w%w%w?%w?%w?)$', 'v'}, -- 12 - ll-variant (where variant is 5-8 alnum characters) {'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)$', 's', 'r'}, -- 13 - ll-Ssss-RR {'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)$', 's', 'r'}, -- 14 - ll-Ssss-DDD (region is 3 digits) {'^(%a%a%a?)%-(%a%a%a%a)$', 's'}, -- 15 - ll-Ssss {'^(%a%a%a?)%-(%a%a)$', 'r'}, -- 16 - ll-RR {'^(%a%a%a?)%-(%d%d%d)$', 'r'}, -- 17 - ll-DDD (region is 3 digits) {'^(%a%a%a?)$'}, -- 18 - ll {'^(%a%a%a?)%-x%-(%w%w?%w?%w?%w?%w?%w?%w?)$', 'p'}, -- 19 - ll-x-pppppppp (private is 1-8 alnum characters) } local t = {}; -- table of captures; serves as a translator between captured IETF tag parts and named variables for i, v in ipairs (pattern) do -- spin through the pattern table looking for a match local c1, c2, c3, c4; -- captures in the 'pattern' from the pattern table go here c1, c2, c3, c4 = source:match (pattern[i][1]); -- one or more captures set if source matches pattern[i]) if c1 then -- c1 always set on match code = c1; -- first capture is always code t = { [pattern[i][2] or 'x'] = c2, -- fill the table of captures with the rest of the captures [pattern[i][3] or 'x'] = c3, -- take index names from pattern table and assign sequential captures [pattern[i][4] or 'x'] = c4, -- index name may be nil in pattern[i] table so "or 'x'" spoofs a name for this index in this table }; script = t.s or ''; -- translate table contents to named variables; region = t.r or ''; -- absent table entries are nil so set named IETF parts to empty string for concatenation variant= t.v or ''; private = t.p or ''; break; -- and done end end if not code then return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_tag, {source}); -- don't know what we got but it is malformed end code = code:lower(); -- ensure that we use and return lower case version of this if not (override_table[code] or lang_table[code] or synonym_table[code] or lang_dep_table[code]) then return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_code, {code}); -- invalid language code, don't know about the others (don't care?) end if synonym_table[code] then -- if 639-2/639-2T code has a 639-1 synonym table.insert (maint_cats, substitute (cfg.get_ietf_parts_t.maint_promo_cat, {code})); table.insert (maint_msgs, substitute (cfg.get_ietf_parts_t.maint_promo_msg, {code, synonym_table[code]})); code = synonym_table[code]; -- use the synonym end if is_set (script) then if is_set (args_script) then return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_scr; -- both code with script and |script= not allowed end else script = args_script or ''; -- use args.script if provided end if is_set (script) then script = script:lower(); -- ensure that we use and return lower case version of this if not script_table[script] then return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_scr_code, {script, code}); -- language code OK, invalid script, don't know about the others (don't care?) end end if suppressed_table[script] then -- ensure that code-script does not use a suppressed script if in_array (code, suppressed_table[script]) then return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.script_code, {script, code}); -- language code OK, script is suppressed for this code end end if is_set (region) then if is_set (args_region) then return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_reg; -- both code with region and |region= not allowed end else region = args_region or ''; -- use args.region if provided end if is_set (region) then region = region:lower(); -- ensure that we use and return lower case version of this if not region_table[region] then return code, script, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_reg_code, {region, code}); end end if is_set (variant) then if is_set (args_variant) then return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_var; -- both code with variant and |variant= not allowed end else variant = args_variant or ''; -- use args.variant if provided end if is_set (variant) then variant = variant:lower(); -- ensure that we use and return lower case version of this if not variant_table[variant] then -- make sure variant is valid return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var, {variant}); end -- does this duplicate/replace tests in lang() and lang_xx()? if is_set (script) then -- if script set it must be part of the 'prefix' if not in_array (table.concat ({code, '-', script}), variant_table[variant]['prefixes']) then return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_scr, {variant, code, script}); end elseif is_set (region) then -- if region set, there are some prefixes that require lang code and region (en-CA-newfound) if not in_array (code, variant_table[variant]['prefixes']) then -- first see if lang code is all that's required (en-oxendict though en-GB-oxendict is preferred) if not in_array (table.concat ({code, '-', region}), variant_table[variant]['prefixes']) then -- now try for lang code and region (en-CA-newfound) return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_reg, {variant, code, region}); end end else -- cheap way to determine if there are prefixes; fonipa and others don't have prefixes; # operator always returns 0 if variant_table[variant]['prefixes'][1] and not in_array (code, variant_table[variant]['prefixes']) then return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code, {variant, code}); end end end if is_set (private) then private = private:lower(); -- ensure that we use and return lower case version of this if not override_table[table.concat ({code, '-x-', private})] then -- make sure private tag is valid; note that index return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_pri, {private}); end end return code, script, region, variant, private, nil; -- return the good bits; make sure that msg is nil end --[=[-------------------------< M A K E _ W I K I L I N K >---------------------------------------------------- Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an empty string. ]=] local function make_wikilink (link, display) if is_set (link) then if is_set (display) then return table.concat ({'[[', link, '|', display, ']]'}); else return table.concat ({'[[', link, ']]'}); end else return ''; end end --[[--------------------------< D I V _ M A R K U P _ A D D >-------------------------------------------------- Adds <i> and </i> tags to list-item text or to implied <p>..</p> text. Mixed not supported. ]] local function div_markup_add (text, style) if text:find ('^\n[%*:;#]') then -- look for list markup; list markup must begin at start of text if 'italic' == style then return text:gsub ('(\n[%*:;#]+)([^\n]+)', '%1<i>%2</i>'); -- insert italic markup at each list item else return text; end end if text:find ('\n+') then -- look for any number of \n characters in text text = text:gsub ('([^\n])\n([^\n])', '%1 %2'); -- replace single newline characters with a space character which mimics MediaWiki if 'italic' == style then text = text:gsub('[^\n]+', '<p><i>%1</i></p>'); -- insert p and italic markup tags at each implied p (two or more consecutive '\n\n' sequences) else text = text:gsub ('[^\n]+', '<p>%1</p>'); -- insert p markup at each implied p text = text:gsub ('\n', ''); -- strip newline characters end end return text; end --[[--------------------------< T I T L E _ W R A P P E R _ M A K E >------------------------------------------ Makes a <span title="<title text>"><content_text></span> or <div title="<title text>"><content_text></div> where <title text> is in the tool-tip in the wiki's local language and <content_text> is non-local-language text in HTML markup. This because the lang= attribute applies to the content of its enclosing tag. <tag> holds a string 'div' or 'span' used to choose the correct wrapping tag. ]] local function title_wrapper_make (title_text, content_text, tag) local wrapper_t = {}; table.insert (wrapper_t, table.concat ({'<', tag})); -- open opening wrapper tag table.insert (wrapper_t, ' title=\"'); -- begin title attribute table.insert (wrapper_t, title_text); -- add <title_text> table.insert (wrapper_t, '\">'); -- end title attribute and close opening wrapper tag table.insert (wrapper_t, content_text); -- add <content_text> table.insert (wrapper_t, table.concat ({'</', tag, '>'})); -- add closing wrapper tag return table.concat (wrapper_t); -- make a big string and done end --[[--------------------------< M A K E _ T E X T _ H T M L >-------------------------------------------------- Add the HTML markup to text according to the type of content that it is: <span> or <i> tags for inline content or <div> tags for block content The lang= attribute also applies to the content of the tag where it is placed so this is wrong because 'Spanish language text' is English: <i lang="es" title="Spanish language text">casa</i> should be: <span title="Spanish language text"><i lang="es">casa</i></span> or for <div>...</div>: <div title="Spanish language text"><div lang="es"><spanish-language-text></div></div> ]] local function make_text_html (code, text, tag, rtl, style, size, language) local html_t = {}; local style_added = ''; local wrapper_tag = tag; -- <tag> gets modified so save a copy for use when/if we create a wrapper span or div if text:match ('^%*') then table.insert (html_t, '&#42;'); -- move proto language text prefix outside of italic markup if any; use numeric entity because plain splat confuses MediaWiki text = text:gsub ('^%*', ''); -- remove the splat from the text end if 'span' == tag then -- default HTML tag for inline content if 'italic' == style then -- but if italic tag = 'i'; -- change to <i> tags end else -- must be div so go text = div_markup_add (text, style); -- handle implied <p>, implied <p> with <i>, and list markup (*;:#) with <i> end table.insert (html_t, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> HTML tag code = code:gsub ('%-x%-.*', ''); -- strip private use subtag from code tag because meaningless outside of Wikipedia table.insert (html_t, table.concat ({' lang="', code, '\"'})); -- add language attribute if (rtl or unicode.is_rtl(text)) and ('ltr' == this_wiki_lang_dir) then -- text is right-to-left on a left-to-right wiki table.insert (html_t, ' dir="rtl"'); -- add direction attribute for right-to-left languages elseif not (rtl or unicode.is_rtl(text)) and ('rtl' == this_wiki_lang_dir) then -- text is left-to-right on a right-to-left wiki table.insert (html_t, ' dir="ltr"'); -- add direction attribute for left-to-right languages end if 'normal' == style then -- when |italic=no table.insert (html_t, ' style=\"font-style: normal;'); -- override external markup, if any style_added = '\"'; -- remember that style attribute added and is not yet closed end if is_set (size) then -- when |size=<something> if is_set (style_added) then table.insert (html_t, table.concat ({' font-size: ', size, ';'})); -- add when style attribute already inserted else table.insert (html_t, table.concat ({' style=\"font-size: ', size, ';'})); -- create style attribute style_added = '\"'; -- remember that style attribute added and is not yet closed end end table.insert (html_t, table.concat ({style_added, '>'})); -- close the opening HTML tag table.insert (html_t, text); -- insert the text table.insert (html_t, table.concat ({'</', tag, '>'})); -- close the 'text' <i>, <span>, or <div> HTML tag if is_set (language) then -- create a <title_text> string for the title= attribute in a wrapper span or div local title_text; if 'zxx' == code then -- special case for this tag 'no linguistic content' title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.zxx}); -- not a language so don't use 'language' in title text elseif mw.ustring.find (language, 'languages', 1, true) then title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.collective}); -- for collective languages else title_text = substitute ('$2 $1', {language, cfg.make_text_html_t.individual}); end return title_wrapper_make (title_text, table.concat (html_t), wrapper_tag); else return table.concat (html_t); end end --[=[-------------------------< M A K E _ C A T E G O R Y >---------------------------------------------------- For individual language, <language>, returns: [[Ronney:Artyn goaill stiagh teks ayns <language>]] For English: [[Ronney:Artyn goaill stiagh teks ayns Baarle]] For ISO 639-2 collective languages (and for 639-1 bh): [[Ronney:Artyn goaill stiagh teks ayns <language>]] ]=] local function make_category (code, language_name, nocat, name_get) if ((0 ~= namespace) or nocat) and not name_get then -- only categorize in article space return ''; -- return empty string for concatenation end if mw.ustring.find (language_name, 'languages', 1, true) then return substitute ('[[$1 $2]]', {cfg.make_category_t.collective_cat, language_name}); end if this_wiki_lang_tag == code then return substitute ('[[$1 $2 $3]]', { -- unique category name for the local language cfg.make_category_t.cat_prefix, language_name, cfg.make_category_t.explicit_cat, }); else return substitute ('[[$1 $2$3]]', { cfg.make_category_t.cat_prefix, language_name, cfg.make_category_t.cat_postfix }); end end --[[--------------------------< M A K E _ T R A N S L I T >---------------------------------------------------- Return translit <i lang=xx-Latn>...</i> where xx is the language code; else return empty string. The value |script= is not used in {{transliteration}} for this purpose; instead it uses |code. Because language scripts are listed in the {{transliteration}} switches they are included in the data tables. The script parameter is introduced at {{Language with name and transliteration}}. If |script= is set, this function uses it in preference to code. To avoid confusion, in this module and the templates that use it, the transliteration script parameter is renamed to be |translit-script= (in this function, tscript). This function is used by both lang_xx() and xlit() lang_xx() always provides code, language_name, and translit; may provide tscript; never provides style xlit() always provides language_name, translit, and one of code or tscript, never both; always provides style For {{transliteration}}, style only applies when a language code is provided. ]] local function make_translit (code, language_name, translit, std, tscript, style, engvar) local title_t = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards local title_text = ''; -- tool tip text for title= attribute std = std and std:lower(); -- lower case for table indexing if not is_set (std) and not is_set (tscript) then -- when neither standard nor script specified title_text = language_name; -- write a generic tool tip if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name) title_text = substitute ('$1-$2', {title_text, cfg.misc_text_t.language}); -- skip this text (individual and macro languages only) end title_text = substitute ('$1 $2', {title_text, mw.ustring.lower (cfg.engvar_t[engvar]['romanisz_lc'])}); -- finish the tool tip; use romanization when neither script nor standard supplied elseif is_set (std) and is_set (tscript) then -- when both are specified if title_t[std] then -- and if standard is legitimate if title_t[std][tscript] then -- and if script for that standard is legitimate if script_table[tscript] then title_text = substitute ('$1$2 ($3 $4) $5', { -- add the appropriate text to the tool tip title_text, title_t[std][tscript:lower()], script_table[tscript], cfg.make_translit_t.script, cfg.make_translit_t.transliteration, }); else title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard? end else title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard? end else return ''; -- invalid standard, setup for error message end elseif is_set (std) then -- translit-script not set, use language code if not title_t[std] then return ''; end -- invalid standard, setup for error message if title_t[std][code] then -- if language code is in the table (xlit may not provide a language code) local fmt_str = '$1$2 ($3 $4) $5'; -- generic format string for tool tip if language_name:match ('languages') then fmt_str = '$1$2 ($3) $5'; -- format string for collective languages tool tip end title_text = substitute (fmt_str, { -- add the appropriate text to the tool tip title_text, title_t[std][code:lower()], language_name, cfg.misc_text_t.language, cfg.make_translit_t.transliteration, }); else -- code doesn't match title_text = title_text .. title_t[std]['default']; -- so use the standard's default end else -- here if translit-script set but translit-std not set if title_t['no_std'][tscript] then title_text = title_text .. title_t['no_std'][tscript]; -- use translit-script if set elseif title_t['no_std'][code] then title_text = title_text .. title_t['no_std'][code]; -- use language code else if is_set (tscript) then title_text = substitute ('$1$2-$3 $4', { -- write a script tool tip title_text, language_name, cfg.make_translit_t.script, cfg.make_translit_t.transliteration, }); elseif is_set (code) then if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name) title_text = substitute ('$1-$2', { -- skip this text (individual and macro languages only) title_text, cfg.misc_text_t.language, }); end title_text = substitute ('$1 $2', { -- finish the tool tip title_text, cfg.make_translit_t.transliteration, }); else title_text = substitute ('$1 $2', { -- generic tool tip (can we ever get here?) title_text, cfg.make_translit_t.transliteration, }); end end end local tag if is_set (code) then -- when a language code is provided (always with {{lang-??}} templates, not always with {{transliteration}}) code = code:match ('^(%a%a%a?)'); -- strip all subtags leaving only the language subtag if not style then -- nil for the default italic style tag = '<i lang="%s-Latn">%s</i>' else tag = '<span style="font-style: %s" lang="%s-Latn">%s</span>' -- non-standard style, construct a span tag for it tag = string.format(tag, style, "%s", "%s") end tag = string.format(tag, code, "%s") else tag = '<span>%s</span>' -- when no language code: no lang= attribute, not italic ({{transliteration}} only) end tag = string.format(tag, translit) -- add the translit text if '' == title_text then -- when there is no need for a tool-tip return tag; -- done else title_text = cfg.engvar_sel_t.gb == engvar and title_text:gsub ('([Rr]omani)z', '%1s') or title_text; -- gb eng when engvar specifies gb eng; us eng else return title_wrapper_make (title_text, tag, 'span'); -- wrap with a tool-tip span and done end end --[[--------------------------< V A L I D A T E _ T E X T >---------------------------------------------------- This function checks the content of args.text and returns empty string if nothing is amiss else it returns an error message. The tests are for empty or missing text and for improper or disallowed use of apostrophe markup. Italic rendering is controlled by the |italic= template parameter so italic markup should never appear in args.text either as ''itself'' or as '''''bold italic''''' unless |italic=unset or |italic=invert. ]] local function validate_text (template, args) if not is_set (args.text) then return make_error_msg (cfg.validate_text_t.no_text, args, template); end if args.text:find ("%f[\']\'\'\'\'%f[^\']") or args.text:find ("\'\'\'\'\'[\']+") then -- because we're looking, look for 4 appostrophes or 6+ appostrophes return make_error_msg (cfg.validate_text_t.malformed_markup, args, template); end local style = args.italic; if (cfg.keywords_t.unset ~= style) and (cfg.keywords_t.invert ~=style) then if args.text:find ("%f[\']\'\'%f[^\']") or args.text:find ("%f[\']\'\'\'\'\'%f[^\']") then -- italic but not bold, or bold italic return make_error_msg (cfg.validate_text_t.italic_markup, args, template); end end end --[[--------------------------< R E N D E R _ M A I N T >------------------------------------------------------ Render mainenance messages and categories. ]] local function render_maint (nocat) local maint = {}; if 0 < #maint_msgs then -- when there are maintenance messages table.insert (maint, table.concat ({'<span class="lang-comment" style="font-style: normal; display: none; color: #33aa33; margin-left: 0.3em;">'})); -- opening <span> tag for _, msg in ipairs (maint_msgs) do table.insert (maint, table.concat ({msg, ' '})); -- add message strings end table.insert (maint, '</span>'); -- close the span end if (0 < #maint_cats) and (0 == namespace) and not nocat then -- when there are maintenance categories; article namespace only for _, cat in ipairs (maint_cats) do table.insert (maint, table.concat ({'[[Category:', cat, ']]'})); -- format and add the categories end end return table.concat (maint); end --[[--------------------------< P R O T O _ P R E F I X >------------------------------------------------------ For proto languages, text is prefixed with a splat. We do that here as a flag for make_text_html() so that a splat will be rendered outside of italic markup (if used). If the first character in text here is already a splat, we do nothing. proto_param is boolean or nil; true adds splat prefix regardless of language name; false removes and inhibits regardless of language name; nil does nothing; presumes that the value in text is correct but removes extra splac. ]] local function proto_prefix (text, language_name, proto_param) if false == proto_param then -- when forced by |proto=no return text:gsub ('^%**', ''); -- return text without splat prefix regardless of language name or existing splat prefix in text elseif (language_name:find ('^Proto%-') or (true == proto_param)) then -- language is a proto or forced by |proto=yes return text:gsub ('^%**', '*'); -- prefix proto-language text with a splat; also removes duplicate prefixing splats end return text:gsub ('^%*+', '*'); -- return text unmolested except multiple splats reduced to one splat end --[[--------------------------< H A S _ P O E M _ T A G >------------------------------------------------------ Looks for a poem strip marker in text; returns true when found; false else. Auto-italic detection disabled when text has poem stripmarker because it is not possible for this code to know the content that will replace the stripmarker. ]] local function has_poem_tag (text) return text:find ('\127[^\127]*UNIQ%-%-poem%-[%a%d]+%-QINU[^\127]*\127') and true or false; end --[[--------------------------< H T M L _ T A G _ S E L E C T >------------------------------------------------ Inspects content of and selectively trims text. Returns text and the name of an appropriate HTML tag for text. If text contains: \n\n text has implied <p>..</p> tags - trim leading and trailing whitespace and return If text begins with list markup: \n* unordered \n; definition \n: definition \n# ordered trim all leading whitespace except \n and trim all trailing whitespace If text contains <poem>...</poem> stripmarker, return text unmodified and choose <div>..</div> tags because the stripmarker is replaced with text wrapped in <div>..</div> tags. If the text contains any actual <div>...</div> tags, then it's again returned unmodified and <div>...</div> tags are used to wrap it, to prevent div/span inversion. ]] local function html_tag_select (text) local tag; if has_poem_tag (text) then -- contains poem stripmarker (we can't know the content of that) tag = 'div'; -- poem replacement is in div tags so lang must use div tags elseif text:find ('<div') then -- reductive; if the text contains a div tag, we must use div tags tag = 'div'; elseif mw.text.trim (text):find ('\n\n+') then -- contains implied p tags text = mw.text.trim (text); -- trim leading and trailing whitespace characters tag = 'div'; -- must be div because span may not contain p tags (added later by MediaWiki); poem replacement is in div tags elseif text:find ('\n[%*:;%#]') then -- if text has list markup text = text:gsub ('^[\t\r\f ]*', ''):gsub ('%s*$', ''); -- trim all whitespace except leading newline character '\n' tag = 'div'; -- must be div because span may not contain ul, dd, dl, ol tags (added later by MediaWiki) else text = mw.text.trim (text); -- plain text tag = 'span'; -- so span is fine end return text, tag; end --[[--------------------------< V A L I D A T E _ P R O T O >-------------------------------------------------- Validates value assigned to |proto=; permitted values are yes and no; yes returns as true, no returns as false, empty string (or parameter omitted) returns as nil; any other value returns nil with <proto_param> as second return value for use in error message. ]] local function validate_proto (proto_param) if cfg.keywords_t.affirmative == proto_param then return true; elseif cfg.keywords_t.negative == proto_param then return false; elseif is_set (proto_param) then return nil, proto_param; -- |proto= something other than 'yes' or 'no' else return nil; -- missing or empty end end --[[--------------------------< L A N G U A G E _ N A M E _ G E T >-------------------------------------------- Common function to return language name from the data set according to IETF tag. Returns language name if found in data tables; nil else. ]] local function language_name_get (ietf, code, cat) ietf = ietf:lower(); -- ietf:lower() because format_ietf_tag() returns mixed case local name; -- remains nil if not found if override_table[ietf] then -- look for whole IETF tag in override table name = override_table[ietf]; elseif override_table[code] then -- not there so try basic language tag name = override_table[code]; elseif lang_table[code] then -- shift to IANA active tag/name table name = lang_table[code]; elseif lang_dep_table[code] then -- try the IANA deprecated tag/name table name = lang_dep_table[code]; end if lang_dep_table[code] and cat then -- because deprecated code may have been overridden to en.wiki preferred name table.insert (maint_cats, substitute (cfg.language_name_get_t.deprecated_cat, {code})); table.insert (maint_msgs, substitute (cfg.language_name_get_t.deprecated_msg, {code})); end return name; -- name from data tables or nil end --[[--------------------------< T E X T _ S C R I P T _ M A T C H _ T E S T >---------------------------------- IETF script subtag should match the script of the <text>. This module does not attempt to know all scripts and what they look like. It does know what Latn script looks like so when <text> is written using other than the Latn script, the IETF script subtag, if present, should not be Latn. Conversely, when <text> is written using the Latn script, the IETF script subtag, if present, should be Latn. For the purposes of this test, Latf (Fraktur) and Latg (Gaelic) are considered to be equivalent to Latn because unicode treats these two scripts as font-specific variants of Latn. Returns an error message when mismatch detected; nil else. ]] local function text_script_match_test (script, is_latn_text, pos, char) local scripts_t = {['latf'] = true, ['latg'] = true, ['latn'] = true}; -- unicode 'latn' scripts; 'latf' and 'latg' are font variants so there are no Fraktur or Gaelic codepoints if is_set (script) then -- don't bother with the rest of this if <script> is nil or empty string script = script:lower(); -- lower case to index into <scripts_t> if is_latn_text then -- when text is wholly Latn script if not scripts_t[script] then -- but a non-Latn script is specified return cfg.text_script_match_test_t.latn_txt_mismatch; -- emit an error message end else -- when text is not wholly Latn script if scripts_t[script] then -- but a Latn script is specified return substitute (cfg.text_script_match_test_t.latn_scr_mismatch, {pos, char}); -- emit an error message with position of first offending character end end end end --[[--------------------------< B I N A R Y _ S E A R C H >--------------------------------------------------- conducts a binary search of <ranges_t> for a sub-range that holds <target>. returns boolean true if a sub-range holding <target> is found; boolean false else. ]] local function binary_search (target, ranges_t) local idx_bot = 1; -- initialize to index of first key local idx_top = sizeof_ranges_t; -- initialize to index of last key (number of keys) if (target < ranges_t[idx_bot][1]) or (target > ranges_t[idx_top][2]) then -- invalid; target out of range return; -- abandon end local idx_mid; -- calculated index of range midway between top index and bottom index local flag = false; -- flag to tell us when we've evaluated last (highest) range in <ranges_t> while 1 do idx_mid = math.ceil ((idx_bot + idx_top) / 2); -- get the mid-point in the <ranges_t> sequence if (target >= ranges_t[idx_mid][1]) and (target <= ranges_t[idx_mid][2]) then -- indexed range low value <= target <= indexed range high value return true; -- we found the range that holds the <target> character; return true elseif (target > ranges_t[idx_mid][2]) then -- is <target> > indexed range high value? idx_bot = idx_mid; -- adjust <idx_bot> up else -- here when <target> less than indexed range low value idx_top = idx_mid - 1; -- adjust <idx_top> down end if flag then break; -- here when we just evaluated the last range and <target> not found end if not flag and (idx_bot == idx_top) then -- set true just before we evaluate the last (highest) range in <ranges_t> flag = true; end end end --[[--------------------------< I S _ L A T I N >-------------------------------------------------------------- compare <text> as codepoints to lists of known codepoints accepted as Latn script returns boolean true and modified <text> when <text> is wrapped in accept-as-written markup returns boolean true and <text> when codepoint is known returns boolean false, <text>, non-Latn codepoint position in <text> (left to right), and the codepoint character when codepoint is not known TODO: when text has accept-as-written markup, return a non-boolean value to indicate that <text> is not wholly latn script? Use that return value to create non-Latn HTML lang= attribute because <text> isn't really latn so lang=und (undetermined)? or instead, omit the -Latn subtag? (without -Latn need to force |italic=yes) ]] local function is_latin (text, tag) local count; text, count = text:gsub ('^%(%((.+)%)%)$', '%1'); -- remove accept-as-written markup if present if 0 ~= count then return true, text; -- markup present so assume that <text> is Latn-script end local pos = 0; -- position counter for error messaging for codepoint in mw.ustring.gcodepoint (text) do -- fetch each code point pos = pos + 1; -- bump the position counter if not is_latn_data.singles_t[codepoint] and -- codepoint not found in the singles list? not binary_search (codepoint, is_latn_data.ranges_t) and -- codepoint not a member of a listed range? not (tag and is_latn_data.specials_t[codepoint] and is_latn_data.specials_t[codepoint][tag]) then -- not a language-specific codepoint? return false, text, pos, mw.ustring.char (codepoint); -- codepoint not known; return false with codepoint position and character representation end end return true, text; -- is known; return <text> end --[[--------------------------< _ L A N G >-------------------------------------------------------------------- Entry point for {{lang}}. There should be no reason to set parameters in the {{lang}} {{#invoke:}} <includeonly>{{#invoke:lang|lang}}</includeonly> Parameters are received from the template's frame (parent frame). ]] local function _lang (args) local out = {}; local language_name; -- used to make category names local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set local subtags = {}; -- IETF subtags script, region, variant, and private local code; -- the language code local msg; -- for error messages local tag = 'span'; -- initial value for make_text_html() local template = args.template or cfg.templates_t.lang; maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once maint_msgs = {}; validate_cat_args (args); -- determine if categorization should be suppressed if args[1] and args.code then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'1', cfg.lang_t.conflict_n_param_types.code}), args, template); else args.code = args[1] or args.code; -- prefer args.code end if args[2] and args.text then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'2', cfg.lang_t.conflict_n_param_types.text}), args, template); else args.text = args[2] or args.text; -- prefer args.text end msg = validate_text (template, args); -- ensure that |text= is set if is_set (msg) then -- msg is an already-formatted error message return msg; end args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag if msg then return make_error_msg (substitute (cfg.lang_t.invalid_proto, {msg}), args, template); end code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code); -- |script=, |region=, |variant= not supported because they should be part of args.code ({{{1}}} in {{lang}}) if msg then return make_error_msg (msg, args, template); end local is_latn_text, pos, char; is_latn_text, args.text, pos, char= is_latin (args.text, code); -- make a boolean msg = text_script_match_test (subtags.script, is_latn_text, pos, char) if msg then -- if an error detected then there is an error message return make_error_msg (msg, args, template); end args.italic, msg = validate_italic (args); if msg then return make_error_msg (msg, args, template); end if nil == args.italic then -- nil when |italic= absent or not set or |italic=default; args.italic controls if ('latn' == subtags.script) or -- script is latn (this_wiki_lang_tag ~= code and not is_set (subtags.script) and not has_poem_tag (args.text) and is_latn_text) then -- text not this wiki's language, no script specified and not in poem markup but is wholly latn script (auto-italics) args.italic = 'italic'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic else args.italic = 'inherit'; -- italic not set; script not latn; inherit current style end end if is_set (subtags.script) then -- if script set, override rtl setting if in_array (subtags.script, lang_data.rtl_scripts) then args.rtl = true; -- script is an rtl script else args.rtl = false; -- script is not an rtl script end end args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant if cfg.keywords_t.invert == args.italic and 'span' == tag then -- invert only supported for in-line content args.text = invert_italics (args.text) end args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.italic, args.size, language_name)); table.insert (out, make_category (code, language_name, args.nocat)); table.insert (out, render_maint (args.nocat)); -- maintenance messages and categories return table.concat (out); -- put it all together and done end --[[--------------------------< L A N G >---------------------------------------------------------------------- Entry point for {{lang}}. There should be no reason to set parameters in the {{lang}} {{#invoke:}} <includeonly>{{#invoke:lang|lang}}</includeonly> Parameters are received from the template's frame (parent frame). ]] local function lang (frame) local args_t = getArgs (frame, { -- this code so that we can detect and handle wiki list markup in text valueFunc = function (key, value) if 2 == key or 'text' == key then -- the 'text' parameter; do not trim wite space return value; -- return untrimmed 'text' elseif value then -- all other values: if the value is not nil value = mw.text.trim (value); -- trim whitespace if '' ~= value then -- empty string when value was only whitespace return value; end end return nil; -- value was empty or contained only whitespace end -- end of valueFunc }); args_t.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang|...}} local msg = parameter_validate (args_t, cfg.templates_t.lang); -- verify that all supplied parameters are supported by {{lang-??}} if msg then return make_error_msg (msg, args_t, cfg.templates_t.lang); -- when template has unsupported params, abandon with error message end return _lang (args_t); end --[[--------------------------< T R A N S L A T I O N _ M A K E >---------------------------------------------- Stand-alone function to create literal translation of main text. Also used by {{lang-x2}}. ]] local function translation_make (args_t) local translation_t = {', '}; -- initialize output if 'none' ~= args_t.label then -- if we want a label table.insert (translation_t, '<small>'); -- open the <small> HTML tag if cfg.keywords_t.negative == args_t.link then table.insert (translation_t, substitute ('<abbr title="$1">$2</abbr>', {cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr})); -- unlinked form else table.insert (translation_t, make_wikilink (cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr)); -- linked form end table.insert (translation_t, "&thinsp;</small>"); -- close the <small> HTML tag end table.insert (translation_t, table.concat ({ -- user styling spans match spand from {{gloss}} '<span class="gloss-quot">\'</span>', -- user styling span for quote marks; use HTML entities to avoid wiki markup confusion '<span class="gloss-text">', -- open user styling span for the translation args_t.translation, -- the translation '</span>', -- close user styling span for the translation '<span class="gloss-quot">\'</span>' -- user styling span for quote marks })); return table.concat (translation_t); -- make a big string and done end --[[--------------------------< _ L A N G _ X X >-------------------------------------------------------------- For the {{lang-??}} templates, the only parameter required to be set in the template is the language code. All other parameters can, usually should, be written in the template call. For {{lang-??}} templates for languages that can have multiple writing systems, it may be appropriate to set |script= as well. For each {{lang-??}} template choose the appropriate entry-point function so that this function knows the default styling that should be applied to text. For normal, upright style: <includeonly>{{#invoke:lang|lang_xx_inherit|code=xx}}</includeonly> For italic style: <includeonly>{{#invoke:lang|lang_xx_italic|code=xx}}</includeonly> All other parameters should be received from the template's frame (parent frame) Supported parameters are: |code = (required) the IANA language code |script = IANA script code; especially for use with languages that use multiple writing systems |region = IANA region code |variant = IANA variant code |text = (required) the displayed text in language specified by code |link = boolean false ('no') does not link code-spcified language name to associated language article |rtl = boolean true ('yes') identifies the language specified by code as a right-to-left language |nocat = boolean true ('yes') inhibits normal categorization; error categories are not affected |cat = boolian false ('no') opposite form of |nocat= |italic = boolean true ('yes') renders displayed text in italic font; boolean false ('no') renders displayed text in normal font; not set renders according to initial_style_state |lit = text that is a literal translation of text |label = 'none' to suppress all labeling (language name, 'translit.', 'lit.') any other text replaces language-name label - automatic wikilinking disabled for those {{lang-??}} templates that support transliteration (those templates where |text= is not entirely latn script): |translit = text that is a transliteration of text |translit-std = the standard that applies to the transliteration |translit-script = ISO 15924 script name; falls back to code For {{lang-??}}, the positional parameters are: {{{1}}} text {{{2}}} transliterated text {{{3}}} literal translation text no other positional parameters are allowed ]] local function _lang_xx (args, base_template) -- base_template will be either of 'langx' or 'lang-xx' local out = {}; local language_name; -- used to make display text, article links local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set local subtags = {}; -- IETF subtags script, region, and variant local code; -- the language code local translit_script_name; -- name associated with IANA (ISO 15924) script code local translit; local msg; -- for error messages local tag = 'span'; -- initial value for make_text_html() local template = args.template or base_template; maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once maint_msgs = {}; local text_idx = (cfg.templates_t.langx == base_template) and 2 or 1; -- for {{langx}} 'text' positional parameter is '2' local translit_idx = (cfg.templates_t.langx == base_template) and 3 or 2; local xlate_idx = (cfg.templates_t.langx == base_template) and 4 or 3; if args[text_idx] and args.text then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {text_idx, cfg.lang_t.conflict_n_param_types.text}), args, template); else args.text = args[text_idx] or args.text; -- prefer positional 'text' parameter end msg = validate_text (template, args); -- ensure that |text= is set, does not contain italic markup and is protected from improper bolding if is_set (msg) then return msg; end args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly if args[translit_idx] and args.translit then return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.translit}), args, template); else args.translit = args[translit_idx] or args.translit -- prefer positional 'translit' parameter end args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else if args[xlate_idx] and (args.translation or args.lit) then return make_error_msg (substitute (cfg.lang_xx_t.conflict_n_lit, {xlate_idx}), args, template); elseif args.translation and args.lit then return make_error_msg (cfg.lang_xx_t.conflict_lit, args, template); else args.translation = args[xlate_idx] or args.translation or args.lit; -- prefer positional 'translation' parameter end if args.links and args.link then return make_error_msg (cfg.lang_xx_t.conflict_link, args, template); else args.link = args.link or args.links; -- prefer args.link end validate_cat_args (args); -- determine if categorization should be suppressed args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code, args.script, args.region, args.variant); -- private omitted because private if msg then -- if an error detected then there is an error message return make_error_msg (msg, args, template); end if args.translit then local latn, pos, char; latn, args.translit, pos, char = is_latin (args.translit, (('' ~= subtags.private) and (code .. '-x-' .. subtags.private)) or code); if not latn then return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); end end local is_latn_text, text, pos, char = is_latin (args.text, code); -- make a boolean args.text = text; -- may have been modified (accept-as-written markup removed) msg = text_script_match_test (subtags.script, is_latn_text, pos, char) if msg then -- if an error detected then there is an error message return make_error_msg (msg, args, template); end args.italic, msg = validate_italic (args); if msg then return make_error_msg (msg, args, template); end if cfg.templates_t.langx == base_template then -- auto-italics for {{langx}} templates; adapted from {{lang}} (no support for poem tag) if nil == args.italic then -- nil when |italic= absent or not set or |italic=default; args.italic controls if ('latn' == subtags.script) or -- script is latn (this_wiki_lang_tag ~= code and not is_set (subtags.script) and is_latn_text) then -- text is not this wiki's language, no script specified and is wholly latn script (auto-italics) args.italic = 'italic'; -- set font-style:italic else args.italic = 'inherit'; -- italic not set; script not latn; inherit current style end end else -- {{lang-xx}} does not do auto italics; retained for those wikis that don't support {{langx}} if nil == args.italic then -- args.italic controls if is_set (subtags.script) then if 'latn' == subtags.script then args.italic = 'italic'; -- |script=Latn; set for font-style:italic else args.italic = initial_style_state; -- italic not set; script is not latn; set for font-style:<initial_style_state> end else args.italic = initial_style_state; -- here when |italic= and |script= not set; set for font-style:<initial_style_state> end end end if is_set (subtags.script) then -- if script set override rtl setting if in_array (subtags.script, lang_data.rtl_scripts) then args.rtl = true; -- script is an rtl script else args.rtl = false; -- script is not an rtl script end end args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag if msg then return make_error_msg (substitute (cfg.lang_t.invalid_proto, {args.proto}), args, template); end args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant category_name = language_name; -- category names retain IANA parenthetical diambiguators (if any) language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them if args.label then if 'none' ~= args.label then table.insert (out, table.concat ({args.label, ': '})); -- custom label end else if cfg.keywords_t.negative == args.link then table.insert (out, language_name); -- language name without wikilink else if mw.ustring.find (language_name, 'languages', 1, true) then table.insert (out, make_wikilink (language_name)); -- collective language name uses simple wikilink elseif lang_data.article_name[args.code:lower()] then -- is IETF tag in article name over ride? table.insert (out, make_wikilink (lang_data.article_name[args.code:lower()], language_name)); -- language name with wikilink from override data elseif lang_data.article_name[code] then -- is language tag in article override table.insert (out, make_wikilink (lang_data.article_name[code], language_name)); -- language name with wikilink from override data else table.insert (out, make_wikilink (language_name, language_name)); -- Manx language name with wikilink end end table.insert (out, ': '); -- separator end if cfg.keywords_t.invert == args.italic then args.text = invert_italics (args.text) end args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.italic, args.size, ('none' == args.label) and language_name or nil)) if is_set (args.translit) and not is_latn_text then -- transliteration; not supported when args.text is wholly latn text (this is an imperfect test) table.insert (out, ', '); -- comma to separate text from translit if 'none' ~= args.label then table.insert (out, '<small>'); if script_table[args['translit-script']] then -- when |translit-script= is set, try to use the script's name translit_script_name = script_table[args['translit-script']]; else translit_script_name = language_name; -- fall back on language name end local translit_title_obj = mw.title.makeTitle (0, substitute ('$1 $2',{cfg.lang_xx_t.romanization, translit_script_name})); -- make a title object; no engvar, article titles use US spelling if translit_title_obj.exists and (cfg.keywords_t.negative ~= args.link) then table.insert (out, make_wikilink (substitute ('$1 $2', {cfg.lang_xx_t.romanization, translit_script_name or language_name}), substitute ('$1', {cfg.engvar_t[args.engvar]['romanisz_pt']})) .. ':'); -- make a wikilink if there is an article to link to; engvar the display text else table.insert (out, substitute ('$1:', {cfg.engvar_t[args.engvar]['romanisz_pt']})); -- else plain text per engvar end table.insert (out, '&nbsp;</small>'); -- close the small tag end translit = make_translit (args.code, language_name, args.translit, args['translit-std'], args['translit-script'], nil, args.engvar) if is_set (translit) then table.insert (out, translit); else return make_error_msg (substitute ('$1: $2', {cfg.lang_xx_t.invalid_xlit_std, args['translit-std'] or '[missing]'}), args, template); end elseif is_set (args.translit) and is_latn_text then -- when creating a transliteration of Latn script <text> return make_error_msg (cfg.lang_xx_t.xlit_of_latn, args, template); -- emit error message and abandon end if is_set (args.translation) then -- translation (not supported in {{lang}}) table.insert (out, translation_make (args)); end table.insert (out, make_category (code, category_name, args.nocat)); table.insert (out, render_maint(args.nocat)); -- maintenance messages and categories return table.concat (out); -- put it all together and done end --[[--------------------------< L A N G _ X X _ A R G S _ G E T >---------------------------------------------- Common function to get args table from {{lang-??}} templates. Returns table of args. Text positional parameters are not trimmed here but are selectively trimmed at html_tag_select(). ]] local function lang_xx_args_get (frame, base_template) local args_t = getArgs(frame, { parentFirst= true, -- parameters in the template override parameters set in the {{#invoke:}} valueFunc = function (key, value) if ((cfg.templates_t.langx == base_template) and 2 or 1) == key then -- the 'text' positional parameter; 1 for {{lang-??}}, 2 for {{langx}}; do not trim wite space return value; -- return untrimmed 'text' positional parameter elseif value then -- all other values: if the value is not nil value = mw.text.trim (value); -- trim whitespace if '' ~= value then -- empty string when value was only whitespace return value; end end return nil; -- value was empty or contained only whitespace end -- end of valueFunc }); return args_t; end --[[--------------------------< L A N G _ X X _ I T A L I C >-------------------------------------------------- Entry point for those {{lang-??}} templates that call lang_xx_italic(). Sets the initial style state to italic. ]] local function lang_xx_italic (frame) local args = lang_xx_args_get (frame, cfg.templates_t.langxx); args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_italic|...}} local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}} if msg then return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message end initial_style_state = 'italic'; return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category end --[[--------------------------< _ L A N G _ X X _ I T A L I C >------------------------------------------------ Entry point from another module. Sets the initial style state to italic. ]] local function _lang_xx_italic (args) initial_style_state = 'italic'; return _lang_xx (args, cfg.templates_t.langxx); end --[[--------------------------< L A N G _ X X _ I N H E R I T >------------------------------------------------ Entry point for those {{lang-??}} templates that call lang_xx_inherit(). Sets the initial style state to inherit. ]] local function lang_xx_inherit (frame) local args = lang_xx_args_get (frame, cfg.templates_t.langxx); args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_inherit|...}} local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}} if msg then return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message end initial_style_state = 'inherit'; return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category end --[[--------------------------< _ L A N G _ X X _ I N H E R I T >---------------------------------------------- Entry point from another module. Sets the initial style state to inherit. ]] local function _lang_xx_inherit (args) initial_style_state = 'inherit'; return _lang_xx (args, cfg.templates_t.langxx); end --[[--------------------------< _ L A N G X >------------------------------------------------------------------ Entry point from another module. ]] local function _langx (args_t) local langx_data = mw.loadData ('Module:Lang/langx'); -- get necessary data local rtl_t = langx_data.rtl_t; -- get list of language tags for languages that are rendered right-to-left local link_t = langx_data.link_t; -- get list of language tags for {{lang-??}} templates that set |link=<something> local size_t = langx_data.size_t; -- get list of language tags for {{lang-??}} templates that set |size=<something> local msg = parameter_validate (args_t, cfg.templates_t.langx); if msg then return make_error_msg (msg, args_t, cfg.templates_t.langx); end args_t.code = args_t[1] or args_t.code; -- get the language tag; must be {{{1}}} or |code= if not args_t.code then return make_error_msg (cfg.get_ietf_parts_t.missing_lang_tag, args_t, cfg.templates_t.langx); end args_t.rtl = args_t.rtl or (rtl_t[args_t.code] and cfg.keywords_t.affirmative); -- prefer |rtl= in template call, use rtl_t else args_t.link = args_t.link or link_t[args_t.code]; -- prefer |link= in template call, use link_t felse args_t.size = args_t.size or size_t[args_t.code]; -- prefer |size= in template call, use size_t else args_t[1] = nil; -- unset to mimic {{lang-??}} templates which set |code=xx local lang_subtag = args_t.code; -- use only the base language subtag for unsupported tag test; some args_t.code are modified by |script= etc return _lang_xx (args_t, cfg.templates_t.langx); end --[[--------------------------< L A N G X >-------------------------------------------------------------------- Entry point for {{langx}}. this function calls _lang_xx() to render non-English text. The {{lang-??}} templates have three positional paramters but {{langx}} has four: | 1 | 2 | 3 | 4 {{lang-xx |<text> |<xlit> |<xlat> }} {{langx |<tag> |<text> |<xlit> |<xlat> }} The calls to lang_xx_args_get() and _lang_xx() use 'langx' as a flag for those functions to select the proper positional parameters. {{lang-??}} depends on the calling template to select 'inherit' or 'italic' to establish the default rendering. {{langx}} can't do that. The initial version of {{langx}} relied on a list of language tags (inherit_t in ~/langx) scraped from those {{lang-??}} templates that call lang_xx_inherit() to render text in upright font. langx() now uses auto-italics code adapted from {{lang}} (doesn't support poem tags). ]] local function langx (frame) local args_t = lang_xx_args_get (frame, cfg.templates_t.langx); -- get the arguments; 'langx' is the <base_template> used to decide which positional param is 'text', 'translit', 'lit' return _langx (args_t); end --[[--------------------------< _ I S _ I E T F _ T A G >------------------------------------------------------ Returns true when a language name associated with IETF language tag exists; nil else. IETF language tag must be valid. All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function. Module entry point from another module. ]] local function _is_ietf_tag (tag) -- entry point when this module is require()d into another local c, s, r, v, p, err; -- code, script, region, variant, private, error message c, s, r, v, p, err = get_ietf_parts (tag); -- disassemble tag into constituent part and validate return ((c and not err) and true) or nil; -- return true when code portion has a value without error message; nil else end --[[--------------------------< I S _ I E T F _ T A G >-------------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function is_ietf_tag (frame) return _is_ietf_tag (getArgs (frame)[1]); -- args[1] is the IETF language tag to be tested; also get parent frame end --[[--------------------------< I S _ I E T F _ T A G _ F R A M E >-------------------------------------------- Module entry point from an {{#invoke:}}; same as is_ietf_tag() except does not get parameters from the parent (template) frame. This function not useful when called by {{lang|fn=is_ietf_tag_frame|<tag>}} because <tag> is in the parent frame. ]] local function is_ietf_tag_frame (frame) return _is_ietf_tag (getArgs (frame, {frameOnly = true,})[1]); -- args[1] is the IETF language tag to be tested; do not get parent frame end --[[--------------------------< _ N A M E _ F R O M _ T A G >-------------------------------------------------- Returns language name associated with IETF language tag if valid; error message else. All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function. Set invoke's |link= parameter to yes to get wikilinked version of the language name. Module entry point from another module. ]] local function _name_from_tag (args) local subtags = {}; -- IETF subtags script, region, variant, and private local raw_code = args[1]; -- save a copy of the input IETF subtag local link = cfg.keywords_t.affirmative == args['link']; -- make a boolean local label = args.label; local code; -- the language code local msg; -- gets an error message if IETF language tag is malformed or invalid local language_name = ''; code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code); if msg then local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template) return make_error_span (template, msg); end raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private language_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant if 'yes' ~= args.raw then language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them end if link then -- when |link=yes, wikilink the language name if mw.ustring.find (language_name, 'languages', 1, true) then language_name = make_wikilink (language_name, label); -- collective language name uses simple wikilink elseif lang_data.article_name[raw_code:lower()] then -- is IETF tag in article name override? language_name = make_wikilink (lang_data.article_name[raw_code:lower()], label or language_name); -- language name with wikilink from override data elseif lang_data.article_name[code] then -- is language tag in article name override? language_name = make_wikilink (lang_data.article_name[code], label or language_name); -- language name with wikilink from override data else language_name = make_wikilink (language_name, label or language_name); -- Manx language name with wikilink end end return language_name; end --[[--------------------------< N A M E _ F R O M _ T A G >---------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function name_from_tag (frame) -- entry point from an {{#invoke:lang|name_from_tag|<IETF tag>|link=<yes>|template=<template name>}} return _name_from_tag (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame end --[[--------------------------< _ T A G _ F R O M _ N A M E >-------------------------------------------------- Returns the IETF language tag associated with the language name. Spelling of language name must be correct according to the spelling in the source tables. When a standard language name has a parenthetical disambiguator, that disambiguator must be omitted (they are not present in the data name-to-tag tables). Module entry point from another module. ]] local function _tag_from_name (args) -- entry point from another module local msg; if args[1] and '' ~= args[1] then local data = mw.loadData ('Module:Lang/tag from name'); -- get the reversed data tables TODO: change when going live local lang = args[1]:lower(); -- allow any-case for the language name (speeling must till be correct) local tag = data.rev_override_table[lang] or data.rev_lang_table[lang] or data.rev_lang_dep_table[lang]; -- get the code; look first in the override then in the standard if tag then return tag, true; -- language name found so return tag and done; second return used by is_lang_name() else msg = substitute (cfg.tag_from_name_t.lang_not_found, {args[1]}); -- language name not found, error message end else msg = cfg.tag_from_name_t.missing_lang_name; -- language name not found, error message end local template = ''; if args.template and '' ~= args.template then template = table.concat ({'{{', args['template'], '}}: '}); -- make template name (if provided by the template) end return make_error_span (template, msg); end --[[--------------------------< T A G _ F R O M _ N A M E >---------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function tag_from_name (frame) -- entry point from an {{#invoke:lang|tag_from_name|<language name>|link=<yes>|template=<template name>}} local result, _ = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by is_lang_name() return result; end --[[--------------------------< I S _ L A N G _ N A M E >------------------------------------------------------ Module entry point from an {{#invoke:}}. ]] local function is_lang_name (frame) local _, result = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by tag_from_name() return result and true or nil; end --[[--------------------------< _ X L I T >-------------------------------------------------------------------- Module entry point from another module. ]] local function _xlit (args) local title_table = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards local language_name; -- language name that matches language code; used for tool tip local translit; -- transliterated text to display local script; -- IANA script local msg; -- for when called functions return an error message local template = args.template or cfg.templates_t.transliteration; maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once maint_msgs = {}; if is_set (args[3]) then -- [3] set when {{transliteration|code|standard|text}} args.text = args[3]; -- get the transliterated text args.translit_std = args[2] and args[2]:lower(); -- get the standard; lower case for table indexing if not title_table[args.translit_std] then return make_error_msg (substitute (cfg.transl_t.unrecog_xlit_std, {args.translit_std}), args, template); end else if is_set (args[2]) then -- [2] set when {{transliteration|code|text}} args.text = args[2]; -- get the transliterated text else if args[1] and (args[1]:match ('^%a%a%a?%a?$') or -- args[2] missing; is args[1] a language or script tag or is it the transliterated text? args[1]:match ('^%a%a%a?%-x%-')) then -- or is args[1] a private-use tag return make_error_msg (cfg.transl_t.no_text, args, template); -- args[1] is a code so we're missing text else args.text = args[1]; -- args[1] is not a code so we're missing that; assign args.text for error message return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); end end end if is_set (args[1]) then -- IANA language code used for HTML lang= attribute; or ISO 15924 script code if args[1]:match ('^%a%a%a?%a?$') or args[1]:match ('^%a%a%a?%-x%-') then -- args[1] has correct form? args.code = args[1]:lower(); -- use the language/script code; only (2, 3, or 4 alpha characters) or private-use; lower case because table indexes are lower case else return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args[1]}), args, template); -- invalid language / script code end else return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); -- missing language / script code so quit end local is_latn_text, pos, char; is_latn_text, args.text, pos, char= is_latin (args.text, args.code); -- is latn text? strip accept-as-written markup if not is_latn_text then -- when text is not latn return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); -- abandon with error message end args.italic, msg = validate_italic (args); if msg then return make_error_msg (msg, args, template); end if 'italic' == args.italic then -- 'italic' when |italic=yes; because that is same as absent or not set and |italic=default args.italic = nil; -- set to nil; end args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else if override_table[args.code] then -- is code a language code defined in the override table? language_name = override_table[args.code]; args.code = args.code:match ('^%a%a%a?'); -- if private use, strip all but language subtag elseif lang_table[args.code] then -- is code a language code defined in the standard language code tables? language_name = lang_table[args.code]; elseif lang_dep_table[args.code] then -- is code a language code defined in the deprecated language code tables? language_name = lang_dep_table[args.code]; elseif script_table[args.code] then -- if here, code is not a language code; is it a script code? language_name = script_table[args.code]; script = args.code; -- code was an ISO 15924 script so use that instead args.code = ''; -- unset because not a language code else return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args.code}), args, template); -- invalid language / script code end -- here only when all parameters passed to make_translit() are valid return make_translit (args.code, language_name, args.text, args.translit_std, script, args.italic, args.engvar); end --[[--------------------------< X L I T >---------------------------------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function xlit (frame) return _xlit (getArgs(frame)); end --[[--------------------------< C A T E G O R Y _ F R O M _ T A G >-------------------------------------------- Returns category name associated with IETF language tag if valid; error message else. All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function. Module entry point from another module. ]] local function _category_from_tag (args_t) local subtags = {}; -- IETF subtags script, region, variant, and private local raw_code = args_t[1]; -- save a copy of the input IETF subtag local link = cfg.keywords_t.affirmative == args_t.link; -- make a boolean local label = args_t.label; local code; -- the language code local msg; -- gets an error message if IETF language tag is malformed or invalid local category_name = ''; code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code); if msg then local template = (args_t.template and table.concat ({'{{', args_t.template, '}}: '})) or ''; -- make template name (if provided by the template) return make_error_span (template, msg); end raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private category_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', ''); if link then return table.concat ({'[[:', category_name, ']]'}); else return category_name; end end --[[--------------------------< C A T E G O R Y _ F R O M _ T A G >-------------------------------------------- Module entry point from an {{#invoke:}}. ]] local function category_from_tag (frame) -- entry point from an {{#invoke:lang|category_from_tag|<IETF tag>|template=<template name>}} return _category_from_tag (getArgs (frame)); -- pass-on the args table, nothing else; getArgs() so we also get parent frame end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { category_from_tag = category_from_tag, -- frame entry points when this module is #invoke:ed into templates/wikitext lang = lang, -- entry point for {{lang}} langx = langx, -- entry point for {{langx}} lang_xx_inherit = lang_xx_inherit, -- entry points for {{lang-??}} lang_xx_italic = lang_xx_italic, is_ietf_tag = is_ietf_tag, is_ietf_tag_frame = is_ietf_tag_frame, is_lang_name = is_lang_name, tag_from_name = tag_from_name, -- returns IETF tag associated with language name name_from_tag = name_from_tag, -- used for template documentation; possible use in ISO 639 name from code templates xlit = xlit, -- entry point for {{transliteration}} _category_from_tag = _category_from_tag, -- API entry points when this module is require()d into other modules _lang = _lang, _langx = _langx, _lang_xx_inherit = _lang_xx_inherit, _lang_xx_italic = _lang_xx_italic, _is_ietf_tag = _is_ietf_tag, get_ietf_parts = get_ietf_parts, _tag_from_name = _tag_from_name, _name_from_tag = _name_from_tag, _xlit = _xlit, _translation_make = translation_make, }; dowhx1laqy8vqvojwjfh6utmn1ejo40 Ronney:Toshiaghtyn rere traa 14 30941 393765 348549 2026-10-02T00:19:45Z MacTire02 219 -ronney 393765 wikitext text/x-wiki {{see also|Ronney:Jerraghyn rere traa}} {{Commonscat|Beginnings by time|Toshiaghtyn rere traa}} {{Moir-ronney}} [[Ronney:Toshiaghtyn| Traa]] [[Ronney:Ronnaghyn rere traa]] kk7zx0u2wg25v013vsijvf0wn4a0fay Ronney:Toshiaghtyn 14 30942 393805 341061 2026-10-02T02:43:50Z MacTire02 219 ++ 393805 wikitext text/x-wiki {{commons category|Beginnings|Toshiaghtyn}} {{category see also|Jerraghyn}} [[Ronney:Traa]] [[Ronney:Brennyn]] [[Ronney:Kied reddyn]] cahju9u0fkbzapnsangkfhprxbw7vdi Ronney:Streeughyn rere traa 14 31519 393764 328969 2026-10-02T00:19:27Z MacTire02 219 -ronney 393764 wikitext text/x-wiki {{Commons category|Conflicts by date|Streeughyn rere date}} {{moir-ronney}} [[Ronney:Streeughyn| Traa]] [[Ronney:Ronnaghyn rere traa]] ivfha5yl1gdran6t93r1lmjh3cvyddk Ronney:Bunneeaghtyn ayns Mannin 14 32967 393771 334182 2026-10-02T00:28:12Z MacTire02 219 ronnaghyn elley 393771 wikitext text/x-wiki [[Ronney:Shennaghys Vannin]] [[Ronney:Bunneeaghtyn rere croghane y Reeriaght Unnanesit|Mannin]] [[Ronney:Bunneeaghtyn 'syn Oarpey|Mannin]] pzpdpotn1ngwqwg9wh6l7q7gmk0bk8y 393773 393771 2026-10-02T00:30:19Z MacTire02 219 neeym eh shoh ny s'anmee 393773 wikitext text/x-wiki [[Ronney:Shennaghys Vannin]] [[Ronney:Bunneeaghtyn ayns croghaneyn y Reeriaght Unnanesit|Mannin]] [[Ronney:Bunneeaghtyn 'syn Oarpey|Mannin]] koibx7daxws90ec9nhx6rn5lzro1yc3 393774 393773 2026-10-02T00:30:54Z MacTire02 219 Undid revision [[Special:Diff/393773|393773]] by [[Special:Contributions/MacTire02|MacTire02]] ([[User talk:MacTire02|talk]]) 393774 wikitext text/x-wiki [[Ronney:Shennaghys Vannin]] [[Ronney:Bunneeaghtyn rere croghane y Reeriaght Unnanesit|Mannin]] [[Ronney:Bunneeaghtyn 'syn Oarpey|Mannin]] pzpdpotn1ngwqwg9wh6l7q7gmk0bk8y 393777 393774 2026-10-02T00:32:32Z MacTire02 219 ronney elley 393777 wikitext text/x-wiki [[Ronney:Shennaghys Vannin]] [[Ronney:Bunneeaghtyn ayns croghaneyn y Reeriaght Unnanesit|Mannin]] [[Ronney:Bunneeaghtyn 'syn Oarpey|Mannin]] koibx7daxws90ec9nhx6rn5lzro1yc3 393778 393777 2026-10-02T00:33:07Z MacTire02 219 lettyraghey 393778 wikitext text/x-wiki [[Ronney:Shennaghys Vannin]] [[Ronney:Bunneeaghtyn ayns croghaneyn y Reeriaght Unnaneysit|Mannin]] [[Ronney:Bunneeaghtyn 'syn Oarpey|Mannin]] icoi2phszsb66ff3ya3jvuwxdepn834 Ronney:Taghyrtyn reaghit ayns Mannin 14 32970 393779 334185 2026-10-02T00:33:54Z MacTire02 219 MacTire02 moved page [[Ronney:Taghyrtyn ayns Mannin]] to [[Ronney:Taghyrtyn reaghit ayns Mannin]] without leaving a redirect: aght 334185 wikitext text/x-wiki {{CategoryTOC}} {{Commons category|Events in the Isle of Man|Taghyrtyn ayns Mannin}} [[Ronney:Cultoor Vannin]] [[Ronney:Taghyrtyn 'syn Oarpey rere çheer|Mannin]] [[Ronney:Taghyrtyn rere croghane|Mannin]] [[Ronney:Taghyrtyn 'sy Reeriaght Unnaneysit|+Mannin]] 716farfgbuhwkfr8zduugc8v29ooly0 393780 393779 2026-10-02T00:36:00Z MacTire02 219 ronnaghyn elley 393780 wikitext text/x-wiki {{CatAutoTOC}} {{Commons category|Events in the Isle of Man|Taghyrtyn ayns Mannin}} [[Ronney:Cultoor Vannin]] [[Ronney:Shennaghys Vannin]] [[Ronney:Taghyrtyn reaghit rere croghane y Reeriaght Unnaneysit|Mannin]] [[Ronney:Taghyrtyn reaghit 'syn Oarpey rere çheer|+Mannin]] 7zqxztttilj3b1tuioel9e8y9jqt5y2 Ronney:Jerraghyn rere traa 14 36817 393763 348550 2026-10-02T00:19:02Z MacTire02 219 -ronney 393763 wikitext text/x-wiki {{see also|Ronney:Toshiaghtyn rere traa}} {{Commonscat|Endings by time|Jerraghyn rere traa}} {{Moir-ronney}} [[Ronney:Jerraghyn| Traa]] [[Ronney:Ronnaghyn rere traa]] naodb31hxq8hvg65srzxk1zbo4lgqch Ronney:Jerraghyn 14 36818 393804 348551 2026-10-02T02:42:00Z MacTire02 219 -ronney 393804 wikitext text/x-wiki {{commonscat|Ends|Jerraghyn}} [[Ronney:Traa]] [[Ronney:Shagh-heihll]] fr9n33xkrrrey64q4rnwme3x7hw90k7 Ronney:Bunneeaghtyn ayns ny 2000yn 14 37561 393751 380583 2026-10-02T00:12:25Z MacTire02 219 -ronney 393751 wikitext text/x-wiki {{category series navigation}} {{Commonscat|2000s establishments|Bunneeaghtyn ayns ny 2000yn}} [[Ronney:Bunneeaghtyn 'sy 21d eash| 00]] [[Ronney:Toshiaghtyn ayns ny 2000yn]] [[Ronney:Bunneeaghtyn rere jeihaght|2000]] 80pwbe9gy34q67y2bpola4m5otg19ax Ronney:Bunneeaghtyn rere jeihaght 14 37562 393702 349800 2026-10-01T23:35:24Z MacTire02 219 -ronney 393702 wikitext text/x-wiki {{Commons category|Establishments by decade|Bunneeaghtyn rere jeihaght}} {{moir-ronney}} {{see also|Ronney:Greesaghtyn rere jeihaght}} {{see also|Ronney:Jee-vunneeaghtyn rere jeihaght}} [[Ronney:Bunneeaghtyn rere traa|Jeihaght]] [[Ronney:Ronnaghyn rere jeihaght]] [[Ronney:Toshiaghtyn rere jeihaght]] {{CategoryTOC}} lxpz7avrlci8dxqpfgpu9ru8v45gc8g Ronney:Jee-vunneeaghtyn rere jeihaght 14 37563 393756 349806 2026-10-02T00:16:05Z MacTire02 219 -ronney 393756 wikitext text/x-wiki {{moir-ronney}} {{Commons category|Disestablishments by decade|Jee-vunneeaghtyn rere jeihaght}} {{see also|Ronney:Bunneeaghtyn rere jeihaght}} [[Ronney:Jee-vunneeaghtyn rere traa|Jeihaght]] [[Ronney:Ronnaghyn rere jeihaght]] [[Ronney:Jerraghyn rere jeihaght]] oq2lsj8di7o2ds8f4706lur0toooy8c Ronney:Bunneeaghtyn rere eash 14 37570 393757 349809 2026-10-02T00:17:15Z MacTire02 219 -ronney 393757 wikitext text/x-wiki {{moir-ronney}} {{Commons category|Establishments by century|Bunneeaghtyn rere eash}} {{see also|Ronney:Jee-vunneeaghtyn rere eash}} [[Ronney:Bunneeaghtyn rere traa|Eash]] [[Ronney:Toshiaghtyn rere eash]] 3hfxa1ci4w10rsb2tdmu9sqx6g1xw0m Ronney:Jee-vunneeaghtyn rere eash 14 37571 393758 349810 2026-10-02T00:17:27Z MacTire02 219 -ronney 393758 wikitext text/x-wiki {{moir-ronney}} {{Commons category|Disestablishments by century|Jee-vunneeaghtyn rere eash}} {{see also|Ronney:Bunneeaghtyn rere eash}} [[Ronney:Jee-vunneeaghtyn rere traa|Eash]] [[Ronney:Jerraghyn rere eash]] am52n97fjw6thczontt3kc531y2t1eb Ronney:Bunneeaghtyn ayns ny 1850yn 14 37604 393737 360393 2026-10-01T23:49:51Z MacTire02 219 ronnaghyn 393737 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1850s establishments|Bunneeaghtyn ayns ny 1850yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 50]] [[Ronney:Toshiaghtyn ayns ny 1850yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1850]] 0ccxzj7ghc3xep2hdyuoz6wxjd9g4xf Ronney:Bunneeaghtyn rere milley bleeaney 14 37614 393760 349879 2026-10-02T00:18:14Z MacTire02 219 -ronney 393760 wikitext text/x-wiki {{moir-ronney}} {{Commons category|Establishments by millennium|Bunneeaghtyn rere milley bleeaney}} {{see also|Ronney:Jee-vunneeaghtyn rere milley bleeaney}} [[Ronney:Bunneeaghtyn rere traa|Milley bleeaney]] [[Ronney:Ronnaghyn rere milley bleeaney]] [[Ronney:Toshiaghtyn rere milley bleeaney]] gy8r1s31ce2oqo5dduoxc5qs3809ml9 Ronney:Jee-vunneeaghtyn rere milley bleeaney 14 37615 393762 349880 2026-10-02T00:18:47Z MacTire02 219 -ronney 393762 wikitext text/x-wiki {{moir-ronney}} {{Commons category|Disestablishments by millennium|Jee-vunneeaghtyn rere milley bleeaney}} {{see also|Ronney:Bunneeaghtyn rere milley bleeaney}} [[Ronney:Jee-vunneeaghtyn rere traa|Milley bleeaney]] [[Ronney:Ronnaghyn rere milley bleeaney]] [[Ronney:Jerraghyn rere milley bleeaney]] 6ufq608dvin8tlql8lnlvzehr61rzmk Ronney:Bunneeaghtyn ayns ny 1880yn 14 37619 393740 360390 2026-10-01T23:50:37Z MacTire02 219 ronnaghyn 393740 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1880s establishments|Bunneeaghtyn ayns ny 1880yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 80]] [[Ronney:Toshiaghtyn ayns ny 1880yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1880]] 2nz3qj0veb77n7btfspw3pzy86z1rf8 Ronney:Bunneeaghtyn ayns ny 2010yn 14 37632 393752 380549 2026-10-02T00:12:36Z MacTire02 219 -ronney 393752 wikitext text/x-wiki {{category series navigation}} {{Commonscat|2010s establishments|Bunneeaghtyn ayns ny 2010yn}} [[Ronney:Bunneeaghtyn 'sy 21d eash| 10]] [[Ronney:Toshiaghtyn ayns ny 2010yn]] [[Ronney:Bunneeaghtyn rere jeihaght|2010]] q2apxpcsr0zdrthx1lj80w2cjajhxx0 Ronney:Bunneeaghtyn ayns ny 1510yn 14 37657 393719 349973 2026-10-01T23:41:07Z MacTire02 219 ronnaghyn 393719 wikitext text/x-wiki {{category series navigation}} [[Ronney:Bunneeaghtyn 'sy 16oo eash| 10]] [[Ronney:Toshiaghtyn ayns ny 1510yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1510]] 0fswqev8i4yilahv2t9xcj81yflbujs Ronney:Bunneeaghtyn ayns ny 1920yn 14 37722 393744 381283 2026-10-01T23:51:34Z MacTire02 219 -ronney 393744 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1920s establishments|Bunneeaghtyn ayns ny 1920yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 20]] [[Ronney:Toshiaghtyn ayns ny 1920yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1920]] 1aec6ewex9m0ywk1ksy50ywenrin316 Ronney:Bunneeaghtyn rere mooar-rheynn 14 37748 393800 350174 2026-10-02T02:35:37Z MacTire02 219 ronney elley 393800 wikitext text/x-wiki {{CategoryTOC}} {{moir-ronney}} {{Commons category|v|{{PAGENAME}}}} {{Category explanation|'''bunneeaghtyn''' rere '''[[mooar-rheynn]]'''}} {{see also|Ronney:Jee-vunneeaghtyn rere mooar-rheynn}} [[Ronney:Bunneeaghtyn| Mooar-rheynn]] [[Ronney:Shennaghys rere mooar-rheynn| Bunneeaghtyn]] 8z7u4vkcw72jn78yw41d16rlfys6p6j Ronney:Bunneeaghtyn 'syn Oarpey 14 37752 393801 350178 2026-10-02T02:36:50Z MacTire02 219 ronney elley 393801 wikitext text/x-wiki {{commonscat|Establishments in Europe|{{PAGENAME}}}} [[Ronney:Shennaghys yn Oarpey]] [[Ronney:Bunneeaghtyn rere mooar-rheynn|Oarpey]] o3u6n6nj1tttedlo7f11vvj9fywip8j Ronney:Bunneeaghtyn ayns Nerin 14 37754 393770 350180 2026-10-02T00:26:34Z MacTire02 219 ++ 393770 wikitext text/x-wiki {{commonscat|Establishments in Ireland|Bunneeaghtyn ayns Nerin}} {{see also|Ronney:Jee-vunneeaghtyn ayns Nerin}} [[Ronney:Shennaghys Nerin]] [[Ronney:Bunneeaghtyn 'syn Oarpey|Nerin]] [[Ronney:Bunneeaghtyn rere çheer|Nerin]] fqo50a3dcenu39wthw72ndd258hqo6b Ronney:Taghyrtyn reaghit ayns Nerin 14 37758 393768 350186 2026-10-02T00:23:37Z MacTire02 219 ronnaghyn elley 393768 wikitext text/x-wiki {{Commonscat|Events in Ireland|Taghyrtyn ayns Nerin}} [[Ronney:Cultoor Nerin]] [[Ronney:Taghyrtyn reaghit rere ard|+Nerin]] [[Ronney:Taghyrtyn reaghit 'syn Oarpey|+]] crae2eqbls5ch43zdwh060d07ykw84j 393769 393768 2026-10-02T00:24:53Z MacTire02 219 MacTire02 moved page [[Ronney:Taghyrtyn ayns Nerin]] to [[Ronney:Taghyrtyn reaghit ayns Nerin]] without leaving a redirect 393768 wikitext text/x-wiki {{Commonscat|Events in Ireland|Taghyrtyn ayns Nerin}} [[Ronney:Cultoor Nerin]] [[Ronney:Taghyrtyn reaghit rere ard|+Nerin]] [[Ronney:Taghyrtyn reaghit 'syn Oarpey|+]] crae2eqbls5ch43zdwh060d07ykw84j Ronney:Taghyrtyn reaghit rere ard 14 37759 393766 350187 2026-10-02T00:21:47Z MacTire02 219 ronnaghyn elley 393766 wikitext text/x-wiki {{Commons category|Events by region|Taghyrtyn rere ard}} {{moir-ronney}} [[Ronney:Ronnaghyn rere ard]] [[Ronney:Taghyrtyn reaghit rere boayl| Ard]] kajgzobxyqp345q0krnkysre86ova6q 393767 393766 2026-10-02T00:21:58Z MacTire02 219 MacTire02 moved page [[Ronney:Taghyrtyn rere ard]] to [[Ronney:Taghyrtyn reaghit rere ard]] without leaving a redirect 393766 wikitext text/x-wiki {{Commons category|Events by region|Taghyrtyn rere ard}} {{moir-ronney}} [[Ronney:Ronnaghyn rere ard]] [[Ronney:Taghyrtyn reaghit rere boayl| Ard]] kajgzobxyqp345q0krnkysre86ova6q Ronney:Bunneeaghtyn ayns ny 1860yn 14 37801 393738 381264 2026-10-01T23:50:11Z MacTire02 219 -ronney 393738 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1860s establishments|Bunneeaghtyn ayns ny 1860yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 1860yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1860]] pxjgbxg733ntjbiwd36x1bghfys60od Ronney:Bunneeaghtyn ayns ny 1990yn 14 37805 393750 381277 2026-10-02T00:12:15Z MacTire02 219 -ronney 393750 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1990s establishments|Bunneeaghtyn ayns ny 1990yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 90]] [[Ronney:Toshiaghtyn ayns ny 1990yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1990]] nysrxhtszctpxyn9r8h136cy6n9ps6h Ronney:Bunneeaghtyn ayns ny 1870yn 14 37809 393739 381507 2026-10-01T23:50:22Z MacTire02 219 -ronney 393739 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1870s establishments|Bunneeaghtyn ayns ny 1870yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 70]] [[Ronney:Toshiaghtyn ayns ny 1870yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1870]] crsod041cb806zc982i6hqtcxo4n4rg Ronney:Bunneeaghtyn ayns ny 1930yn 14 37912 393701 381282 2026-10-01T23:34:31Z MacTire02 219 -ronney 393701 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1930s establishments|Bunneeaghtyn ayns ny 1930yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 30]] [[Ronney:Toshiaghtyn ayns ny 1930yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1930]] 43fqwueh1bsppizxyh33prqo62gseri Ronney:Bunneeaghtyn ayns ny 960yn 14 38001 393711 381250 2026-10-01T23:38:19Z MacTire02 219 ronnaghyn 393711 wikitext text/x-wiki {{category series navigation}} {{Commonscat|960s establishments|Bunneeaghtyn ayns ny 960yn}} [[Ronney:Bunneeaghtyn 'sy 10oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 960yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0960]] 4q0r142dxkjqzz4igg8k8sjmhext62h Ronney:Bunneeaghtyn ayns ny 800yn 14 38006 393705 381188 2026-10-01T23:36:19Z MacTire02 219 -ronney 393705 wikitext text/x-wiki {{category series navigation}} {{Commonscat|800s establishments|Bunneeaghtyn ayns ny 800yn}} [[Ronney:Bunneeaghtyn 'sy 9oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 800yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0800]] g99m00ywirb5l0foyabk8afu779ul58 Ronney:Bunneeaghtyn ayns ny 840yn 14 38044 393706 381390 2026-10-01T23:36:29Z MacTire02 219 -ronney 393706 wikitext text/x-wiki {{category series navigation}} {{Commonscat|840s establishments|Bunneeaghtyn ayns ny 840yn}} [[Ronney:Bunneeaghtyn 'sy 9oo eash| 40]] [[Ronney:Toshiaghtyn ayns ny 840yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0840]] 8bt0owa1fsfpel4tvpue9w8gjldapys Ronney:Bunneeaghtyn ayns ny 1660yn 14 38074 393725 350693 2026-10-01T23:45:33Z MacTire02 219 ronnaghyn 393725 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1660s establishments|Bunneeaghtyn ayns ny 1660yn}} [[Ronney:Bunneeaghtyn 'sy 17oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 1660yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1660]] sqton0j6pawuywm0hihkqblz5m6u9re Ronney:Bunneeaghtyn ayns ny 1700yn 14 38087 393726 350714 2026-10-01T23:46:00Z MacTire02 219 ronnaghyn 393726 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1700s establishments|Bunneeaghtyn ayns ny 1700yn}} [[Ronney:Bunneeaghtyn 'sy 18oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 1700yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1700]] dfka9yryhe1i0wli0xs6pqjzio9xq4j Ronney:Bunneeaghtyn ayns ny 1540yn 14 38154 393721 350845 2026-10-01T23:41:40Z MacTire02 219 ronnaghyn 393721 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1540s establishments|Bunneeaghtyn ayns ny 1540yn}} [[Ronney:Bunneeaghtyn 'sy 16oo eash| 40]] [[Ronney:Toshiaghtyn ayns ny 1540yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1540]] 9fodeinqgdv19w1zwnl244vm5k50nbj Ronney:Bunneeaghtyn ayns ny 880yn 14 38170 393708 350869 2026-10-01T23:37:07Z MacTire02 219 ronnaghyn 393708 wikitext text/x-wiki {{category series navigation}} {{Commonscat|880s establishments|Bunneeaghtyn ayns ny 880yn}} [[Ronney:Bunneeaghtyn 'sy 9oo eash|80]] [[Ronney:Toshiaghtyn ayns ny 880yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0880]] ovqek5itoett0hefc8cksmp647vixqj Ronney:Bunneeaghtyn ayns ny 1320yn 14 38191 393682 350912 2026-10-01T15:16:19Z MacTire02 219 +catnav 393682 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1320s establishments|Bunneeaghtyn ayns ny 1320yn}} [[Ronney:Bunneeaghtyn 'sy 14oo eash| 20]] [[Ronney:Toshiaghtyn ayns ny 1320yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1320]] [[Ronney:Taghyrtyn ayns ny 1320yn]] 3eoxk6reyk09a3x8wlrdd5kb43fwk2b 393716 393682 2026-10-01T23:40:10Z MacTire02 219 -ronney 393716 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1320s establishments|Bunneeaghtyn ayns ny 1320yn}} [[Ronney:Bunneeaghtyn 'sy 14oo eash| 20]] [[Ronney:Toshiaghtyn ayns ny 1320yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1320]] 0lq6m3o7i5s7z42nsqe6yax5nrl8dkz Ronney:Bunneeaghtyn ayns ny 1890yn 14 38304 393741 380689 2026-10-01T23:50:49Z MacTire02 219 -ronney 393741 wikitext text/x-wiki {{category series navigation}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 90]] [[Ronney:Toshiaghtyn ayns ny 1890yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1890]] hbw18h5wicv4x6sm9zymzoizv3ofk6s Ronney:Bunneeaghtyn ayns ny 1520yn 14 38319 393720 351247 2026-10-01T23:41:21Z MacTire02 219 ronnaghyn 393720 wikitext text/x-wiki {{category series navigation}} [[Ronney:Bunneeaghtyn 'sy 16oo eash| 20]] [[Ronney:Toshiaghtyn ayns ny 1520yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1520]] 1omho8ou6nvn4he3if9txax3cmwwgp6 Ronney:Bunneeaghtyn ayns ny 1780yn 14 38329 393730 351262 2026-10-01T23:47:06Z MacTire02 219 ronnaghyn 393730 wikitext text/x-wiki {{category series navigation}} [[Ronney:Bunneeaghtyn 'sy 18oo eash| 80]] [[Ronney:Toshiaghtyn ayns ny 1780yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1780]] hyiopsvxbeyjupa4g8l61op7hmrtm63 Ronney:Bunneeaghtyn ayns ny 1430yn 14 38588 393717 351841 2026-10-01T23:40:32Z MacTire02 219 ronnaghyn 393717 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1430s establishments|Bunneeaghtyn ayns ny 1430yn}} [[Ronney:Bunneeaghtyn 'sy 15oo eash| 30]] [[Ronney:Toshiaghtyn ayns ny 1430yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1430]] tbjeql6f2pevk4mr2m3ylw96o60k188 Ronney:Bunneeaghtyn ayns ny 1810yn 14 38601 393733 380936 2026-10-01T23:48:43Z MacTire02 219 -ronney 393733 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1810s establishments|Bunneeaghtyn ayns ny 1810yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 10]] [[Ronney:Toshiaghtyn ayns ny 1810yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1810]] gh7srpqk5vzs32x7ihd9q4ksnfngi17 Ronney:Greesaghtyn ayns ny 1860yn 14 38609 393688 351886 2026-10-01T15:42:42Z MacTire02 219 +catnav 393688 wikitext text/x-wiki {{category series navigation}} {{Commons category|1860s introductions|Greesaghtyn ayns ny 1860yn}} [[Ronney:Toshiaghtyn ayns ny 1860yn]] [[Ronney:Greesaghtyn rere jeihaght|1860]] [[Ronney:Greesaghtyn 'sy 19oo eash| 60]] [[Ronney:Taghyrtyn ayns ny 1860yn]] d4ikocvvc8x7npuuqyhksvo3udi4hff 393753 393688 2026-10-02T00:14:35Z MacTire02 219 -ronney 393753 wikitext text/x-wiki {{category series navigation}} {{Commons category|1860s introductions|Greesaghtyn ayns ny 1860yn}} [[Ronney:Toshiaghtyn ayns ny 1860yn]] [[Ronney:Greesaghtyn rere jeihaght|1860]] [[Ronney:Greesaghtyn 'sy 19oo eash| 60]] 5ca4sattxea82yguzhlp6w4yp9uigq3 Ronney:Greesaghtyn rere milley bleeaney 14 38613 393761 351890 2026-10-02T00:18:35Z MacTire02 219 -ronney 393761 wikitext text/x-wiki {{Commonscat|Introductions by millennium|Greesaghtyn rere milley bleeaney}} {{moir-ronney}} [[Ronney:Greesaghtyn rere traa|Milley bleeaney]] [[Ronney:Toshiaghtyn rere milley bleeaney]] 5avaq93m1dioyd6oj1wczudnsr7mcsu Ronney:Streeughyn ayns ny 1930yn 14 38708 393700 380773 2026-10-01T23:34:18Z MacTire02 219 -ronney 393700 wikitext text/x-wiki {{category series navigation}} {{Commons category|1930s conflicts|Streeughyn ayns ny 1930yn}} [[Ronney:Streeughyn 'sy 20oo eash rere jeihaght| 30]] [[Ronney:Shennaghys caggee ayns ny 1930yn]] [[Ronney:Streeughyn rere jeihaght|1930]] 8pbukiep7drgh6jowe8pvhhdx4hgo4y Ronney:Streeughyn rere jeihaght 14 38709 393755 352077 2026-10-02T00:15:32Z MacTire02 219 -ronney 393755 wikitext text/x-wiki {{CategoryTOC}} [[Ronney:Streeughyn rere traa| Jeihaght]] [[Ronney:Ronnaghyn rere jeihaght]] 110gh61jixgrm791261pz32rav3eny0 Ronney:Cron-oaylleeaght chaggaghyn 14 38713 393803 383096 2026-10-02T02:40:50Z MacTire02 219 -ronney 393803 wikitext text/x-wiki [[Ronney:Caggaghyn]] [[Ronney:Cron-oaylleeaght y chaggey|:]] [[Ronney:Linnaghyn-traa caggee]] awgk43y92zqtg1ta8jiuhwdr51s7ps3 Ronney:Streeughyn rere eash 14 38734 393759 352109 2026-10-02T00:17:42Z MacTire02 219 -ronney 393759 wikitext text/x-wiki {{moir-ronney}} {{Commons category|Conflicts by century|Streeughyn rere eash}} [[Ronney:Streeughyn rere traa| eash]] [[Ronney:Craghyn laue-jeant rere eash]] 18skxamgfwtdz68566kko4pkvtu7y9k Ronney:Streeughyn ayns ny 1940yn 14 38745 393754 380771 2026-10-02T00:15:12Z MacTire02 219 -ronney 393754 wikitext text/x-wiki {{category series navigation}} {{Commons category|1940s conflicts|Streeughyn ayns ny 1940yn}} [[Ronney:Streeughyn 'sy 20oo eash rere jeihaght| 40]] [[Ronney:Shennaghys caggee ayns ny 1940yn]] [[Ronney:Streeughyn rere jeihaght|1940]] p16wqlen9wi9ulj8hhmj38ov0oe4vnx Ronney:Bunneeaghtyn ayns ny 930yn 14 38784 393710 352168 2026-10-01T23:38:04Z MacTire02 219 ronnaghyn 393710 wikitext text/x-wiki {{category series navigation}} {{Commonscat|930s establishments|Bunneeaghtyn ayns ny 930yn}} [[Ronney:Bunneeaghtyn 'sy 10oo eash| 30]] [[Ronney:Toshiaghtyn ayns ny 930yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0930]] se4b1m5ydgdnp66mdrruk6ia8i8lvwm Ronney:Bunneeaghtyn ayns ny 750yn 14 38805 393704 381231 2026-10-01T23:36:09Z MacTire02 219 -ronney 393704 wikitext text/x-wiki {{category series navigation}} {{Commonscat|750s establishments|Bunneeaghtyn ayns ny 750yn}} [[Ronney:Bunneeaghtyn 'sy 8oo eash| 50]] [[Ronney:Toshiaghtyn ayns ny 750yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0750]] ierz3mgk6gxydbrb2oi02qkhpx3yzjs Ronney:Bunneeaghtyn ayns ny 1790yn 14 38812 393731 352205 2026-10-01T23:47:30Z MacTire02 219 ronnaghyn 393731 wikitext text/x-wiki {{category series navigation}} [[Ronney:Bunneeaghtyn 'sy 18oo eash| 90]] [[Ronney:Toshiaghtyn ayns ny 1790yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1790]] pmo2we5s53injal8xzpk855dv4r6lop Ronney:Bunneeaghtyn ayns ny 1840yn 14 38816 393736 360392 2026-10-01T23:49:37Z MacTire02 219 ronnaghyn 393736 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1840s establishments|Bunneeaghtyn ayns ny 1840yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 40]] [[Ronney:Toshiaghtyn ayns ny 1840yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1840]] jclfo3yiovpf66zv57ls8646bjq78s8 Ronney:Bunneeaghtyn ayns ny 1960yn 14 39547 393747 381280 2026-10-02T00:11:34Z MacTire02 219 -ronney 393747 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1960s establishments|Bunneeaghtyn ayns ny 1960yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 1960yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1960]] 4a5ua0agfnufeqerovsth13wdtzkcgp Ronney:Bunneeaghtyn ayns ny 1980yn 14 39555 393749 381278 2026-10-02T00:11:58Z MacTire02 219 -ronney 393749 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1980s establishments|Bunneeaghtyn ayns ny 1980yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 80]] [[Ronney:Toshiaghtyn ayns ny 1980yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1980]] 4trjvz4cpecybhm0isscy8p2uzfk0rn Ronney:Bunneeaghtyn ayns ny 1970yn 14 39575 393748 381279 2026-10-02T00:11:48Z MacTire02 219 -ronney 393748 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1970s establishments|Bunneeaghtyn ayns ny 1970yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 70]] [[Ronney:Toshiaghtyn ayns ny 1970yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1970]] e977es0j9wuodezo23jhv3hd0pc35dv Ronney:Bunneeaghtyn ayns ny 1820yn 14 40048 393734 356453 2026-10-01T23:49:04Z MacTire02 219 ronnaghyn 393734 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1820s establishments|Bunneeaghtyn ayns ny 1820yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 20]] [[Ronney:Toshiaghtyn ayns ny 1820yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1820]] 0nae1zgvgsyappvjf8b1i0a2ko3m8p4 Ronney:Bunneeaghtyn ayns ny 1950yn 14 40373 393746 381281 2026-10-02T00:11:18Z MacTire02 219 -ronney 393746 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1950s establishments|Bunneeaghtyn ayns ny 1950yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 50]] [[Ronney:Toshiaghtyn ayns ny 1950yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1950]] 2m0s4fmpdfxe36g0vqiobt0xjis7jul Ronney:Bunneeaghtyn ayns ny 1500yn 14 40392 393718 357761 2026-10-01T23:40:51Z MacTire02 219 ronnaghyn 393718 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1500s establishments|Bunneeaghtyn ayns ny 1500yn}} [[Ronney:Bunneeaghtyn 'sy 16oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 1500yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1500]] 4i49y190vrbwp7kxhhd5yzpo00kqjg7 Ronney:Bunneeaghtyn ayns ny 1900yn 14 40490 393742 381285 2026-10-01T23:51:01Z MacTire02 219 -ronney 393742 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1900s establishments|Bunneeaghtyn ayns ny 1900yn}} [[Ronney:Bunneeaghtyn 'sy 20oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 1900yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1900]] rjqrx3aep38kwzw6zjj0bcuthugi6dm Ronney:Bunneeaghtyn ayns ny 1740yn 14 40505 393727 358213 2026-10-01T23:46:16Z MacTire02 219 ronnaghyn 393727 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1740s establishments|Bunneeaghtyn ayns ny 1740yn}} [[Ronney:Bunneeaghtyn 'sy 18oo eash| 40]] [[Ronney:Toshiaghtyn ayns ny 1740yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1740]] dyzdub814ldlh9x4bqza4bg0vnfqi41 Ronney:Bunneeaghtyn ayns ny 1560yn 14 40561 393722 358380 2026-10-01T23:42:03Z MacTire02 219 ronnaghyn 393722 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1560s establishments|Bunneeaghtyn ayns ny 1560yn}} [[Ronney:Bunneeaghtyn 'sy 16oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 1560yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1560]] 9gug58xmprjm450ub1ifvr4yl5x9xwx Ronney:Bunneeaghtyn ayns ny 1760yn 14 40571 393728 358404 2026-10-01T23:46:30Z MacTire02 219 ronnaghyn 393728 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1760s establishments|Bunneeaghtyn ayns ny 1760yn}} [[Ronney:Bunneeaghtyn 'sy 18oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 1760yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1760]] i2rvrf8x5od0e7x1t3cy6g5llh64t5w Ronney:Bunneeaghtyn ayns ny 1270yn 14 40609 393684 358558 2026-10-01T15:18:17Z MacTire02 219 +catnav 393684 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1270s establishments|Bunneeaghtyn ayns ny 1270yn}} [[Ronney:Bunneeaghtyn 'sy 13oo eash| 70]] [[Ronney:Toshiaghtyn ayns ny 1270yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1270]] [[Ronney:Taghyrtyn ayns ny 1270yn]] 6xm1z1obkxmscp62mgi05df1b9n1mfy 393714 393684 2026-10-01T23:39:27Z MacTire02 219 -ronney 393714 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1270s establishments|Bunneeaghtyn ayns ny 1270yn}} [[Ronney:Bunneeaghtyn 'sy 13oo eash| 70]] [[Ronney:Toshiaghtyn ayns ny 1270yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1270]] t1d1djqxmhkgqy0hpgt0uv7so6n8h2s Ronney:Bunneeaghtyn ayns ny 680yn 14 40618 393703 381221 2026-10-01T23:35:58Z MacTire02 219 -ronney 393703 wikitext text/x-wiki {{category series navigation}} {{Commonscat|680s establishments|Bunneeaghtyn ayns ny 680yn}} [[Ronney:Bunneeaghtyn 'sy 7oo eash| 80]] [[Ronney:Toshiaghtyn ayns ny 680yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0680]] byy00e4s9wgfe0cxl3vtvwekrcpgck6 Ronney:Bunneeaghtyn ayns ny 1830yn 14 40630 393735 358598 2026-10-01T23:49:23Z MacTire02 219 ronnaghyn 393735 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1830s establishments|Bunneeaghtyn ayns ny 1830yn}} [[Ronney:Bunneeaghtyn 'sy 19oo eash| 30]] [[Ronney:Toshiaghtyn ayns ny 1830yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1830]] c8v6mq1tk1niipzigda8r72fogzvnfv Ronney:Bunneeaghtyn ayns ny 1000yn 14 40644 393712 358660 2026-10-01T23:38:41Z MacTire02 219 ronnaghyn 393712 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1000s establishments|Bunneeaghtyn ayns ny 1000yn}} [[Ronney:Bunneeaghtyn 'sy 11d eash| 00]] [[Ronney:Toshiaghtyn ayns ny 1000yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1000]] iwgpmtbs0ma1lbdxh6s3aygy9jm2q90 Ronney:Bunneeaghtyn ayns ny 890yn 14 40650 393709 358671 2026-10-01T23:37:38Z MacTire02 219 ronnaghyn 393709 wikitext text/x-wiki {{category series navigation}} {{Commonscat|890s establishments|Bunneeaghtyn ayns ny 890yn}} [[Ronney:Bunneeaghtyn 'sy 9oo eash| 90]] [[Ronney:Toshiaghtyn ayns ny 890yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0890]] 45hyxheogcjfx8ynr4mkprweoik2slg Ronney:Bunneeaghtyn ayns ny 860yn 14 40672 393707 381391 2026-10-01T23:36:40Z MacTire02 219 -ronney 393707 wikitext text/x-wiki {{category series navigation}} {{Commonscat|860s establishments|Bunneeaghtyn ayns ny 860yn}} [[Ronney:Bunneeaghtyn 'sy 9oo eash| 60]] [[Ronney:Toshiaghtyn ayns ny 860yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0860]] l5g713dqrp9g9fz8ud8g4c71m6owsri Ronney:Bunneeaghtyn ayns ny 300yn 14 40743 393699 381260 2026-10-01T23:32:55Z MacTire02 219 -ronney 393699 wikitext text/x-wiki {{category series navigation}} {{Commonscat|300s establishments|Bunneeaghtyn ayns ny 300yn}} [[Ronney:Bunneeaghtyn 'sy 4oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 300yn]] [[Ronney:Bunneeaghtyn rere jeihaght|0300]] ivpu79r9wru804ehtq5xhc1krmfrtzh Ronney:Bunneeaghtyn ayns ny 1770yn 14 40775 393729 360389 2026-10-01T23:46:48Z MacTire02 219 ronnaghyn 393729 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1770s establishments|Bunneeaghtyn ayns ny 1770yn}} [[Ronney:Bunneeaghtyn 'sy 18oo eash| 70]] [[Ronney:Toshiaghtyn ayns ny 1770yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1770]] 7u3552ugv06zj7r1itwpkk74c8i5wlv Ronney:Bunneeaghtyn ayns ny 1610yn 14 40856 393723 359541 2026-10-01T23:42:40Z MacTire02 219 ronnaghyn 393723 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1610s establishments|Bunneeaghtyn ayns ny 1610yn}} [[Ronney:Bunneeaghtyn 'sy 17oo eash| 10]] [[Ronney:Toshiaghtyn ayns ny 1610yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1610]] gged1mpynrjt5cx3rp799mx6ucxve0v Ronney:Bunneeaghtyn ayns ny 1650yn 14 40926 393698 359803 2026-10-01T23:32:13Z MacTire02 219 -ronney 393698 wikitext text/x-wiki {{Commonscat|1650s establishments|Bunneeaghtyn ayns ny 1650yn}} [[Ronney:Bunneeaghtyn 'sy 17oo eash| 50]] [[Ronney:Toshiaghtyn ayns ny 1650yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1650]] 91nl02rpe4693873r2iw19v4umucpmr 393724 393698 2026-10-01T23:45:19Z MacTire02 219 +clowan 393724 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1650s establishments|Bunneeaghtyn ayns ny 1650yn}} [[Ronney:Bunneeaghtyn 'sy 17oo eash| 50]] [[Ronney:Toshiaghtyn ayns ny 1650yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1650]] 95qujjzg6ql2tb7dnr740s2e30gok5y Ronney:Bunneeaghtyn ayns ny 1200yn 14 41061 393713 360388 2026-10-01T23:39:06Z MacTire02 219 ronnaghyn 393713 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1200s establishments|Bunneeaghtyn ayns ny 1200yn}} [[Ronney:Bunneeaghtyn 'sy 13oo eash| 00]] [[Ronney:Toshiaghtyn ayns ny 1200yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1200]] lu3wnn0zl6hqibtkvieuudk3m3cmy5a Ronney:Eiyrtys taghyrtyn 14 51019 393802 382797 2026-10-02T02:37:54Z MacTire02 219 -ronney 393802 wikitext text/x-wiki {{CatRel|Cooishyn taghyrtyn|Eiyrtyssyn}} [[Ronney:Eiyrtyssyn|-]] cnajbcqcuebh2kwgdmh62a58qfob4gw Ronney:Steatyn as thallooyn bunnit ayns ny 1290yn 14 55984 393680 2026-10-01T14:58:51Z MacTire02 219 ronney noa 393680 wikitext text/x-wiki {{Stateestdecade|12|9|13oo}} ry8tlmpd2cn5drzok12ghm8gz0ob7pj Ronney:Bunneeaghtyn ayns ny 1290yn 14 55985 393681 2026-10-01T15:00:40Z MacTire02 219 r 393681 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1290s establishments|Bunneeaghtyn ayns ny 1290yn}} [[Ronney:Bunneeaghtyn 'sy 13oo eash| 90]] [[Ronney:Toshiaghtyn ayns ny 1290yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1290]] [[Ronney:Taghyrtyn ayns ny 1290yn]] 79ao1l891ws38gnp0xz5lelfscqwmkt 393715 393681 2026-10-01T23:39:44Z MacTire02 219 -ronney 393715 wikitext text/x-wiki {{category series navigation}} {{Commonscat|1290s establishments|Bunneeaghtyn ayns ny 1290yn}} [[Ronney:Bunneeaghtyn 'sy 13oo eash| 90]] [[Ronney:Toshiaghtyn ayns ny 1290yn]] [[Ronney:Bunneeaghtyn rere jeihaght|1290]] k4vt54r6d6tykh84zfh8rc5cf7hg5lq Ronney:Artyn lesh teks ayns Montenegrish 14 55991 393691 2026-10-01T21:32:06Z MacTire02 219 ronney noa 393691 wikitext text/x-wiki {{Non-Manx-language text category}} ftm4vo8zcojmgp8zf3wygcgvg0ztoi7 UTC±00:00 0 55992 393693 2026-10-01T21:35:25Z MacTire02 219 MacTire02 moved page [[UTC±00:00]] to [[UTC+00:00]]: rere ny stundayrtyn 393693 wikitext text/x-wiki #REDIRECT [[UTC+00:00]] p70j3m213hg338610uwcrxiaivwfqz5 Ronney:Taghyrtyn reaghit rere croghane y Reeriaght Unnaneysit 14 55994 393781 2026-10-02T00:37:32Z MacTire02 219 ronney noa 393781 wikitext text/x-wiki [[Ronney:Cultoor rere croghane y Reeriaght Unnaneysit]] [[Ronney:Shennaghys rere croghane y Reeriaght Unnaneysit]] [[Ronney:Taghyrtyn reaghit 'sy Reeriaght Unnaneysit|^Croghane]] [[Ronney:Taghyrtyn reaghit rere croghane|*Reeriaght Unnaneysit]] lp414orgccvpk61kbejmedel2z4obi6 393793 393781 2026-10-02T02:24:16Z MacTire02 219 catsort 393793 wikitext text/x-wiki [[Ronney:Cultoor rere croghane y Reeriaght Unnaneysit]] [[Ronney:Shennaghys rere croghane y Reeriaght Unnaneysit]] [[Ronney:Taghyrtyn reaghit 'sy Reeriaght Unnaneysit|,Croghane]] [[Ronney:Taghyrtyn reaghit rere croghane|*Reeriaght Unnaneysit]] 4k584hsnxshokg8fgit71isho73w7hq Ronney:Taghyrtyn reaghit rere croghane 14 55995 393782 2026-10-02T00:38:56Z MacTire02 219 ronney elley 393782 wikitext text/x-wiki {{moir-ronney}} [[Ronney:Taghyrtyn reaghit rere çheer|-Croghane]] [[Ronney:Cultoor rere croghane| Taghyrtyn reaghit]] oq1ljhsetkb0dp7q87otqnstp1m448i Ronney:Feaillaghyn 'sy Reeriaght Unnaneysit rere ard 14 55996 393784 2026-10-02T00:42:38Z MacTire02 219 ronney noa 393784 wikitext text/x-wiki [[Ronney:Feaillaghyn 'sy Reeriaght Unnaneysit| Ard]] [[Ronney:Ardjyn y Reeriaght Unnaneysit]] [[Ronney:Feaillaghyn rere çheer as ard|Reeriaght Unnaneysit]] [[Ronney:Feaillaghyn 'syn Oarpey rere çheer as ard|Reeriaght Unnaneysit]] 0a3gk0orqz451bpqoq14quzkafjlrja Ronney:Feaillaghyn rere çheer as ard 14 55997 393785 2026-10-02T00:43:51Z MacTire02 219 ronney noa 393785 wikitext text/x-wiki {{CatAutoTOC}} [[Ronney:Feaillaghyn rere çheer| Ard]] [[Ronney:Feaillaghyn rere ard|+Cheer]] a7f2jeidaktd5jbbfjqysiz5gn13v33 Ronney:Feaillaghyn rere ard 14 55998 393786 2026-10-02T01:06:02Z MacTire02 219 ronney noa 393786 wikitext text/x-wiki {{Commons category|Festivals by region|Feaillaghyn rere ard}} {{moir-ronney}} [[Ronney:Feaillaghyn| Ard]] [[Ronney:Eunysseyrys rere ard| Feaillaghyn]] [[Ronney:Taghyrtyn reaghit rere ard]] 9k4jqg61pat5drtwrn8iwxxu2mrwzbm Ronney:Feaillaghyn 'syn Oarpey rere çheer as ard 14 55999 393787 2026-10-02T01:08:10Z MacTire02 219 ronney noa 393787 wikitext text/x-wiki {{CatAutoTOC}} [[Ronney:Feaillaghyn 'syn Oarpey rere çheer|+Ard]] [[Ronney:Feaillaghyn 'syn Oarpey rere ard|+Cheer]] [[Ronney:Ardjyn yn Oarpey rere çheer|+Feaillaghyn]] bs1y0j6f6njm1hioulewfpggde4ox1d Ronney:Feaillaghyn 'syn Oarpey rere ard 14 56000 393788 2026-10-02T01:09:23Z MacTire02 219 ronney noa 393788 wikitext text/x-wiki [[Ronney:Feaillaghyn 'syn Oarpey| Ard]] [[Ronney:Feaillaghyn rere mooar-rheynn as ard|Oarpey]] [[Ronney:Cultoor yn Oarpey rere ard| Feaillaghyn]] gf01s04olox8p28zshdgy3n4krebt07 Ronney:Feaillaghyn rere mooar-rheynn as ard 14 56001 393789 2026-10-02T01:10:54Z MacTire02 219 ronney noa 393789 wikitext text/x-wiki {{CatAutoTOC}} {{moir-ronney}} [[Ronney:Feaillaghyn rere mooar-rheynn| Ard]] [[Ronney:Feaillaghyn rere ard|+Mooar-rheynn]] [[Ronney:Ardjyn rere mooar-rheynn|+]] bq6apojx7lvtavrimmzjk802trgx07u Ronney:Feaillaghyn 'sy Reeriaght Unnaneysit 14 56002 393790 2026-10-02T01:13:11Z MacTire02 219 ronney noa 393790 wikitext text/x-wiki {{Commons category|Festivals in the United Kingdom|Feaillaghyn 'sy Reeriaght Unnaneysit}} [[Ronney:Taghyrtyn eunysseyrys 'sy Reeriaght Unnaneysit]] [[Ronney:Feaillaghyn rere çheer|Reeriaght Unnaneysit]] [[Ronney:Feaillaghyn 'syn Oarpey rere çheer|Reeriaght Unnaneysit]] 7mbj5mk75y8rmcgz1c0pe253jv4asps Ronney:Taghyrtyn eunysseyrys 'sy Reeriaght Unnaneysit 14 56003 393791 2026-10-02T02:21:50Z MacTire02 219 ronney noa 393791 wikitext text/x-wiki [[Ronney:Eunysseyrys 'sy Reeriaght Unnaneysit]] [[Ronney:Cleaynyn turryssagh 'sy Reeriaght Unnaneysit]] [[Ronney:Taghyrtyn eunysseyrys rere çheer|Reeriaght Unnaneysit]] [[Ronney:Taghyrtyn reaghit 'sy Reeriaght Unnaneysit|Eunysseyrys]] [[Ronney:Taghyrtyn eunysseyrys 'syn Oarpey rere çheer|Reeriaght Unnaneysit]] i058g3sloq5hz201a28afi6k1u0gvf7 Ronney:Taghyrtyn reaghit 'sy Reeriaght Unnaneysit 14 56004 393792 2026-10-02T02:23:42Z MacTire02 219 ronney noa 393792 wikitext text/x-wiki {{Commons category|Events in the United Kingdom|Taghyrtyn 'sy Reeriaght Unnaneysit}} [[Ronney:Cultoor y Reeriaght Unnaneysit]] [[Ronney:Taghyrtyn reaghit 'syn Oarpey rere çheer|Reeriaght Unnaneysit]] [[Ronney:Taghyrtyn reaghit rere çheer|Reeriaght Unnaneysit]] htivo6bg25eviwkrfzp2rya84z1p269 Ronney:Taghyrtyn eunysseyrys ayns Mannin 14 56005 393794 2026-10-02T02:27:00Z MacTire02 219 ronney noa 393794 wikitext text/x-wiki [[Ronney:Taghyrtyn eunysseyrys rere croghane y Reeriaght Unnaneysit|Mannin]] [[Ronney:Taghyrtyn reaghit ayns Mannin|Eunysseyrys]] [[Ronney:Eunysseyrys ayns Mannin]] [[Ronney:Cleaynyn turryssagh ayns Mannin]] [[Ronney:Taghrtyn eunysseyrys 'syn Oarpey rere çheer|+Mannin]] 1nfg16ivkvbwzjojrapps2r6n0440h8 Ronney:Taghyrtyn eunysseyrys rere croghane y Reeriaght Unnaneysit 14 56006 393795 2026-10-02T02:30:19Z MacTire02 219 ronney noa 393795 wikitext text/x-wiki [[Ronney:Taghyrtyn eunysseyrys 'sy Reeriaght Unnaneysit|,]] [[Ronney:Taghyrtyn reaghit rere croghane y Reeriaght Unnaneysit| Eunysseyrys]] [[Ronney:Eunysseyrys rere croghane y Reeriaght Unnaneysit|+Taghyrtyn]] [[Ronney:Taghyrtyn eunysseyrys rere croghane|-]] [[Ronney:Cleaynyn turryssagh rere croghane y Reeriaght Unnaneysit| Taghyrtyn eunysseyrys]] oymr79t7j8c0o7bpl88gm2vs9ggoftx 393796 393795 2026-10-02T02:30:56Z MacTire02 219 catsort 393796 wikitext text/x-wiki [[Ronney:Taghyrtyn eunysseyrys 'sy Reeriaght Unnaneysit|,]] [[Ronney:Taghyrtyn reaghit rere croghane y Reeriaght Unnaneysit| Eunysseyrys]] [[Ronney:Eunysseyrys rere croghane y Reeriaght Unnaneysit|+Taghyrtyn]] [[Ronney:Taghyrtyn eunysseyrys rere croghane|-]] [[Ronney:Cleaynyn turryssagh rere croghane y Reeriaght Unnaneysit|*Taghyrtyn eunysseyrys]] 4t1toezkykvmf00g8vsdzll370hgy12 Ronney:Eunysseyrys rere croghane y Reeriaght Unnaneysit 14 56007 393797 2026-10-02T02:32:35Z MacTire02 219 ronney noa 393797 wikitext text/x-wiki [[Ronney:Eunysseyrys 'sy Reeriaght Unnaneysit|.croghane]] [[Ronne:Cultoor rere croghane y Reeriaght Unnaneysit]] [[Ronney:Eunysseyrys rere croghane|-Reeriaght Unnaneysit]] lgg99pujx8u8zkrmx4k7lyszks1sr7q 393798 393797 2026-10-02T02:32:47Z MacTire02 219 lettyraghey 393798 wikitext text/x-wiki [[Ronney:Eunysseyrys 'sy Reeriaght Unnaneysit|.croghane]] [[Ronney:Cultoor rere croghane y Reeriaght Unnaneysit]] [[Ronney:Eunysseyrys rere croghane|-Reeriaght Unnaneysit]] m5msyp4sqsyhi0fgabourunkb2o3y65 Ronney:Eunysseyrys rere croghane 14 56008 393799 2026-10-02T02:33:55Z MacTire02 219 ronney noa 393799 wikitext text/x-wiki {{moir-ronney}} [[Ronney:Eunysseyrys rere çheer|/Croghane]] [[Ronney:Cultoor rere croghane| Eunysseyrys]] t10sg9hu3ulx4sdvkcam1qdx86rpn7n Ronney:Kied reddyn 14 56009 393806 2026-10-02T02:45:09Z MacTire02 219 ronney noa 393806 wikitext text/x-wiki [[Ronney:Sur-cheimyn traa]] [[Ronney:1 (earroo)]] py6sq5f0i54z64o6i2yrgcd5mh60qwg Ronney:Sur-cheimyn traa 14 56010 393807 2026-10-02T02:45:52Z MacTire02 219 ronney noa 393807 wikitext text/x-wiki [[Ronney:Traa]] [[Ronney:Sur-cheimyn|Traa]] n0ar1ilrxpw9im8b008wwej67b86ybc Ronney:Sur-cheimyn 14 56011 393808 2026-10-02T02:48:34Z MacTire02 219 ronney noa 393808 wikitext text/x-wiki {{Commonscat|Superlatives|Sur-cheimyn}} {{Cat main}} [[Ronney:Rhenkalyn]] ce45fwlo7a4j0u4nyrni7b7l6cgf8wr Ronney:Rhenkalyn 14 56012 393809 2026-10-02T02:53:06Z MacTire02 219 ronney noa 393809 wikitext text/x-wiki {{cat main|Rhenkal}} {{cat see also|Recortyssyn}} {{distinguish|Ronney:Rheynkyn}} {{commons category|Rankings|Rhenkalyn}} [[Ronney:Cosoylaght (maddaght)]] [[Ronney:Earrooyn ayndagh]] [[Ronney:Staddyssaght neu-pharameadragh]] [[Ronney:Oardaghey]] [[Ronney:Coryssyn raatys|*]] [[Ronney:Sorçhyn fysseree staddyssaghtoil]] d9rh24xlhfuq5j0s9wspphwujjejj0o 393810 393809 2026-10-02T02:54:10Z MacTire02 219 lettyraghey 393810 wikitext text/x-wiki {{cat main|Rhenkal}} {{cat see also|Recortyssyn}} {{distinguish|Ronney:Rhenkyn}} {{commons category|Rankings|Rhenkalyn}} [[Ronney:Cosoylaght (maddaght)]] [[Ronney:Earrooyn ayndagh]] [[Ronney:Staddyssaght neu-pharameadragh]] [[Ronney:Oardaghey]] [[Ronney:Coryssyn raatys|*]] [[Ronney:Sorçhyn fysseree staddyssaghtoil]] g55d33hyoto2yuqyj1zwnuqbzu3igjx Ronney:Sorçhyn fysseree staddyssaghtoil 14 56013 393811 2026-10-02T02:54:52Z MacTire02 219 ronney noa 393811 wikitext text/x-wiki {{Commons category|Statistical data types|Sorçhyn fysseree staddyssaghtoil}} [[Ronney:Fysseree staddyssaghtoil|Sorchyn]] aulknnic5taztrrxerti1oue506vqja