diff --git a/package.json b/package.json index 5c991cff..4a2f2453 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "js-base64": "^3.7.6", "json5": "^2.2.3", "jwt-decode": "^3.1.2", + "korean-unpacker": "^1.0.3", "libphonenumber-js": "^1.10.28", "lodash": "^4.17.21", "markdown-it": "^14.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3798ae17..b583c4d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,6 +113,9 @@ dependencies: jwt-decode: specifier: ^3.1.2 version: 3.1.2 + korean-unpacker: + specifier: ^1.0.3 + version: 1.0.3 libphonenumber-js: specifier: ^1.10.28 version: 1.10.28 @@ -3412,7 +3415,7 @@ packages: dependencies: '@unhead/dom': 0.5.1 '@unhead/schema': 0.5.1 - '@vueuse/shared': 11.0.3(vue@3.3.4) + '@vueuse/shared': 11.1.0(vue@3.3.4) unhead: 0.5.1 vue: 3.3.4 transitivePeerDependencies: @@ -4054,8 +4057,8 @@ packages: - vue dev: false - /@vueuse/shared@11.0.3(vue@3.3.4): - resolution: {integrity: sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==} + /@vueuse/shared@11.1.0(vue@3.3.4): + resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==} dependencies: vue-demi: 0.14.10(vue@3.3.4) transitivePeerDependencies: @@ -6699,6 +6702,10 @@ packages: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} dev: true + /korean-unpacker@1.0.3: + resolution: {integrity: sha512-s0VIyZOFOtalBSp51NECPvM1g9Af8M0Oxe1ZdMMGL7nvG/ecVNYkCAzPU+f52f0R83ytVCOd3fd14TTOFx2GXQ==} + dev: false + /less@4.1.3: resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} engines: {node: '>=6'} diff --git a/src/tools/text-to-nato-alphabet/korean-unpacker.d.ts b/src/tools/text-to-nato-alphabet/korean-unpacker.d.ts new file mode 100644 index 00000000..ad950aa7 --- /dev/null +++ b/src/tools/text-to-nato-alphabet/korean-unpacker.d.ts @@ -0,0 +1,3 @@ +declare module 'korean-unpacker' { + function unpack(text: string): string; +} \ No newline at end of file diff --git a/src/tools/text-to-nato-alphabet/nato.alphabets.json b/src/tools/text-to-nato-alphabet/nato.alphabets.json new file mode 100644 index 00000000..3e22513e --- /dev/null +++ b/src/tools/text-to-nato-alphabet/nato.alphabets.json @@ -0,0 +1,2844 @@ +[ + { + "Letter": "A", + "(International)": "Alfa", + "(France)": "Anatole", + "(Belgium)": "Arthur", + "(Switzerland)": "Anna", + "(Québec)": "Alice", + "(Germany, 2022)": "Aachen", + "(Austria)": "Anton", + "(Germany, informal, 2022)": "Albert", + "(Netherlands)": "Anna/Anton", + "Italian": "Ancona", + "Spanish": "Antonio", + "(Brazil)": "Amor", + "(Portugal)": "Aveiro", + "Swedish": "Adam", + "Danish": "Anna", + "Norwegian": "Anna", + "Finnish": "Aarne", + "Turkish": "Adana", + "Romanian": "Ana", + "Czech": "Adam", + "Yugoslav": "Avala", + "Serbian": "Avala", + "Slovene": "Ankaran" + }, + { + "Letter": "Å", + "(Germany, 2022)": "Ringakzent-Aachen", + "Swedish": "Åke", + "Danish": "Åse", + "Norwegian": "Åse", + "Finnish": "Åke" + }, + { + "Letter": "Ä", + "(Germany, 2022)": "Umlaut-Aachen", + "(Austria)": "Ärger", + "(Germany, informal, 2022)": "Änderung", + "Swedish": "Ärlig", + "Finnish": "Äiti" + }, + { + "Letter": "Æ", + "(Germany, 2022)": "Verbund-Aachen-Essen", + "Danish": "Ægir", + "Norwegian": "Ærlig" + }, + { + "Letter": "B", + "(International)": "Bravo", + "(France)": "Berthe", + "(Belgium)": "Brussel", + "(Switzerland)": "Berthe", + "(Québec)": "Berthe", + "(Germany, 2022)": "Berlin", + "(Austria)": "Berta", + "(Germany, informal, 2022)": "Bernhard", + "(Netherlands)": "Bern(h)ard", + "Italian": "Bologna", + "Spanish": "Burgos", + "(Brazil)": "Bandeira", + "(Portugal)": "Braga", + "Swedish": "Bertil", + "Danish": "Bernhard", + "Norwegian": "Bernhard", + "Finnish": "Bertta", + "Turkish": "Bolu", + "Romanian": "Barbu", + "Czech": "Božena", + "Yugoslav": "Beograd", + "Serbian": "Beograd", + "Slovene": "Bled" + }, + { + "Letter": "C", + "(International)": "Charlie", + "(France)": "Célestin", + "(Belgium)": "Carolina", + "(Switzerland)": "Cécile", + "(Québec)": "Charles", + "(Germany, 2022)": "Chemnitz", + "(Austria)": "Cäsar", + "(Germany, informal, 2022)": "Cäsar", + "(Netherlands)": "Cornelis", + "Italian": "Como", + "Spanish": "Carmen", + "(Brazil)": "Cobra", + "(Portugal)": "Coimbra", + "Swedish": "Caesar", + "Danish": "Cecilie", + "Norwegian": "Caesar", + "Finnish": "Celsius", + "Turkish": "Ceyhan", + "Romanian": "Constantin", + "Czech": "Cyril", + "Yugoslav": "Cetinje", + "Serbian": "Cetinje", + "Slovene": "Celje" + }, + { + "Letter": "Ç", + "(Germany, 2022)": "Hakenstrich-Chemnitz", + "Turkish": "Çanakkale" + }, + { + "Letter": "CH", + "(Austria)": "Charlotte", + "(Germany, informal, 2022)": "Charlotte", + "Spanish": "Chocolate", + "Czech": "Chrudim" + }, + { + "Letter": "Č", + "(Germany, 2022)": "Winkelakzent-Chemnitz", + "Czech": "Čeněk", + "Yugoslav": "Čačak", + "Serbian": "Čačak", + "Slovene": "Čatež" + }, + { + "Letter": "Ć", + "(Germany, 2022)": "Aufwärtsakzent-Chemnitz", + "Yugoslav": "Ćuprija", + "Serbian": "Ćuprija" + }, + { + "Letter": "D", + "(International)": "Delta", + "(France)": "Désiré", + "(Belgium)": "Desiré", + "(Switzerland)": "Daniel", + "(Québec)": "David", + "(Germany, 2022)": "Düsseldorf", + "(Austria)": "Dora", + "(Germany, informal, 2022)": "David", + "(Netherlands)": "Dirk", + "Italian": "Domodossola", + "Spanish": "David", + "(Brazil)": "Dado", + "(Portugal)": "Dafundo", + "Swedish": "David", + "Danish": "David", + "Norwegian": "David", + "Finnish": "Daavid", + "Turkish": "Denizli", + "Romanian": "Dumitru", + "Czech": "David", + "Yugoslav": "Dubrovnik", + "Serbian": "Drina", + "Slovene": "Drava" + }, + { + "Letter": "DŽ", + "Yugoslav": "džamija", + "Serbian": "Džep" + }, + { + "Letter": "Đ", + "(Germany, 2022)": "Querstrich Düsseldorf", + "Yugoslav": "Đakovo", + "Serbian": "Đeravica" + }, + { + "Letter": "Ď", + "Czech": "Ďáblice" + }, + { + "Letter": "E", + "(International)": "Echo", + "(France)": "Eugène", + "(Belgium)": "Emiel", + "(Switzerland)": "Émile", + "(Québec)": "Édouard", + "(Germany, 2022)": "Essen", + "(Austria)": "Emil", + "(Germany, informal, 2022)": "Emil", + "(Netherlands)": "Eduard", + "Italian": "Empoli", + "Spanish": "España", + "(Brazil)": "Estrela", + "(Portugal)": "Évora", + "Swedish": "Erik", + "Danish": "Erik", + "Norwegian": "Edith", + "Finnish": "Eemeli", + "Turkish": "Edirne", + "Romanian": "Elena", + "Czech": "Emil", + "Yugoslav": "Evropa", + "Serbian": "Evropa", + "Slovene": "Evropa" + }, + { + "Letter": "F", + "(International)": "Foxtrot", + "(France)": "François", + "(Belgium)": "Frederik", + "(Switzerland)": "François", + "(Québec)": "François", + "(Germany, 2022)": "Frankfurt", + "(Austria)": "Friedrich", + "(Germany, informal, 2022)": "Friedrich", + "(Netherlands)": "Ferdinand", + "Italian": "Firenze", + "Spanish": "Francia", + "(Brazil)": "Feira", + "(Portugal)": "Faro", + "Swedish": "Filip", + "Danish": "Frederik", + "Norwegian": "Fredrik", + "Finnish": "Faarao", + "Turkish": "Fatsa", + "Romanian": "Florea", + "Czech": "František", + "Yugoslav": "Foča", + "Serbian": "Futog", + "Slovene": "Fala" + }, + { + "Letter": "G", + "(International)": "Golf", + "(France)": "Gaston", + "(Belgium)": "Gustaaf", + "(Switzerland)": "Gustave", + "(Québec)": "George", + "(Germany, 2022)": "Goslar", + "(Austria)": "Gustav", + "(Germany, informal, 2022)": "Gustav", + "(Netherlands)": "Gerard", + "Italian": "Genova", + "Spanish": "Granada", + "(Brazil)": "Goiaba", + "(Portugal)": "Guarda", + "Swedish": "Gustav", + "Danish": "Georg", + "Norwegian": "Gustav", + "Finnish": "Gideon", + "Turkish": "Giresun", + "Romanian": "Gheorghe", + "Czech": "Gustav", + "Yugoslav": "Gorica", + "Serbian": "Golija", + "Slovene": "Gorica" + }, + { + "Letter": "Ğ", + "(Germany, 2022)": "Bogenakzent-Goslar", + "Turkish": "Yumuşak-G" + }, + { + "Letter": "H", + "(International)": "Hotel", + "(France)": "Henri", + "(Belgium)": "Hendrik", + "(Germany, 2022)": "Hamburg", + "(Austria)": "Heinrich", + "(Germany, informal, 2022)": "Heinrich", + "(Netherlands)": "Hendrik", + "Italian": "Hotel", + "Spanish": "Historia", + "(Brazil)": "Hotel", + "(Portugal)": "Horta", + "Swedish": "Helge", + "Danish": "Hans", + "Norwegian": "Harald", + "Finnish": "Heikki", + "Turkish": "Hatay", + "Romanian": "Haralambie", + "Czech": "Helena", + "Yugoslav": "Hercegovina", + "Serbian": "Heroj", + "Slovene": "Hrastnik" + }, + { + "Letter": "I", + "(International)": "India", + "(France)": "Irma", + "(Belgium)": "Isidoor", + "(Switzerland)": "Ida", + "(Québec)": "Isabelle", + "(Germany, 2022)": "Ingelheim", + "(Austria)": "Ida", + "(Germany, informal, 2022)": "Ida", + "(Netherlands)": "Izaak", + "Italian": "Imola", + "Spanish": "Inés", + "(Brazil)": "Índio", + "(Portugal)": "Itália", + "Swedish": "Ivar", + "Danish": "Ida", + "Norwegian": "Ivar", + "Finnish": "Iivari", + "Turkish": "Isparta", + "Romanian": "Ion", + "Czech": "Ivan", + "Yugoslav": "Istra", + "Serbian": "Igalo", + "Slovene": "Izola" + }, + { + "Letter": "İ", + "(Germany, 2022)": "Überpunkt-Ingelheim", + "Turkish": "İzmir" + }, + { + "Letter": "J", + "(International)": "Juliett", + "(France)": "Joseph", + "(Belgium)": "Jozef", + "(Switzerland)": "Jeanne", + "(Québec)": "Jacques", + "(Germany, 2022)": "Jena", + "(Austria)": "Julius", + "(Germany, informal, 2022)": "Jakob", + "(Netherlands)": "Johan/Jacob/Julius", + "Italian": "Jolly/Juventus", + "Spanish": "José", + "(Brazil)": "José", + "(Portugal)": "José", + "Swedish": "Johan", + "Danish": "Johan", + "Norwegian": "Johan", + "Finnish": "Jussi", + "Turkish": "Jandarma", + "Romanian": "Jean", + "Czech": "Josef", + "Yugoslav": "Jadran", + "Serbian": "Jadran", + "Slovene": "Jadran" + }, + { + "Letter": "K", + "(International)": "Kilo", + "(France)": "Kléber", + "(Belgium)": "Kilogram", + "(Switzerland)": "Kilo", + "(Québec)": "Kilo", + "(Germany, 2022)": "Köln", + "(Austria)": "Kaufmann / Konrad", + "(Germany, informal, 2022)": "Katharina", + "(Netherlands)": "Karel", + "Italian": "Kappa,Kiwi", + "Spanish": "Kilo", + "(Brazil)": "Kiwi", + "(Portugal)": "Kodak", + "Swedish": "Kalle", + "Danish": "Karen", + "Norwegian": "Karin", + "Finnish": "Kalle", + "Turkish": "Kars", + "Romanian": "Kilogram", + "Czech": "Karel", + "Yugoslav": "Kosovo", + "Serbian": "Kosovo", + "Slovene": "Kamnik" + }, + { + "Letter": "L", + "(International)": "Lima", + "(France)": "Louis", + "(Belgium)": "Leopold", + "(Switzerland)": "Louise", + "(Québec)": "Louis", + "(Germany, 2022)": "Leipzig", + "(Austria)": "Ludwig", + "(Germany, informal, 2022)": "Ludwig", + "(Netherlands)": "Lodewijk/Leo", + "Italian": "Livorno", + "Spanish": "Lorenzo", + "(Brazil)": "Lua", + "(Portugal)": "Lisboa", + "Swedish": "Ludvig", + "Danish": "Ludvig", + "Norwegian": "Ludvig", + "Finnish": "Lauri", + "Turkish": "Lüleburgaz", + "Romanian": "Lazăr", + "Czech": "Ludvik", + "Yugoslav": "Lika", + "Serbian": "Lovćen", + "Slovene": "Ljubljana" + }, + { + "Letter": "LL", + "Spanish": "Llave" + }, + { + "Letter": "LJ", + "Yugoslav": "Ljubljana", + "Serbian": "Ljubovija" + }, + { + "Letter": "M", + "(International)": "Mike", + "(France)": "Marcel", + "(Belgium)": "Maria", + "(Switzerland)": "Marie", + "(Québec)": "Marie", + "(Germany, 2022)": "München", + "(Austria)": "Martha", + "(Germany, informal, 2022)": "Marie", + "(Netherlands)": "Maria", + "Italian": "Milano", + "Spanish": "Madrid", + "(Brazil)": "Maria", + "(Portugal)": "Maria", + "Swedish": "Martin", + "Danish": "Mari", + "Norwegian": "Martin", + "Finnish": "Matti", + "Turkish": "Muş", + "Romanian": "Maria", + "Czech": "Marie", + "Yugoslav": "Mostar", + "Serbian": "Morava", + "Slovene": "Maribor" + }, + { + "Letter": "N", + "(International)": "November", + "(France)": "Nicolas", + "(Belgium)": "Napoleon", + "(Switzerland)": "Nicolas", + "(Québec)": "Nicolas", + "(Germany, 2022)": "Nürnberg", + "(Austria)": "Nordpol", + "(Germany, informal, 2022)": "Nathan", + "(Netherlands)": "Nico", + "Italian": "Napoli", + "Spanish": "Navidad", + "(Brazil)": "Navio", + "(Portugal)": "Nazaré", + "Swedish": "Niklas", + "Danish": "Nikolaj", + "Norwegian": "Nils", + "Finnish": "Niilo", + "Turkish": "Niğde", + "Romanian": "Nicolae", + "Czech": "Norbert", + "Yugoslav": "Niš", + "Serbian": "Niš", + "Slovene": "Nanos" + }, + { + "Letter": "Ñ", + "(Germany, 2022)": "Tilde-Nürnberg", + "Spanish": "Ñoño" + }, + { + "Letter": "NJ", + "Yugoslav": "Njegoš", + "Serbian": "Njegoš" + }, + { + "Letter": "Ň", + "Czech": "Nina" + }, + { + "Letter": "O", + "(International)": "Oscar", + "(France)": "Oscar", + "(Belgium)": "Oscar", + "(Switzerland)": "Olga", + "(Québec)": "Olivier", + "(Germany, 2022)": "Offenbach", + "(Austria)": "Otto", + "(Germany, informal, 2022)": "Otto", + "(Netherlands)": "Otto", + "Italian": "Otranto", + "Spanish": "Oviedo", + "(Brazil)": "Ouro", + "(Portugal)": "Ovar", + "Swedish": "Olof", + "Danish": "Odin", + "Norwegian": "Olivia", + "Finnish": "Otto", + "Turkish": "Ordu", + "Romanian": "Olga", + "Czech": "Oto-(Otakar)", + "Yugoslav": "Osijek", + "Serbian": "Obilić", + "Slovene": "Ormož" + }, + { + "Letter": "Ö", + "(Germany, 2022)": "Umlaut-Offenbach", + "(Austria)": "Ökonom/Österreich/Öse", + "(Germany, informal, 2022)": "Ökonom", + "Swedish": "Östen", + "Finnish": "Öljy", + "Turkish": "Ödemiş" + }, + { + "Letter": "Ø", + "(Germany, 2022)": "Schräggestrichen-Offenbach", + "Danish": "Øresund", + "Norwegian": "Østen" + }, + { + "Letter": "P", + "(International)": "Papa", + "(France)": "Pierre", + "(Belgium)": "Piano", + "(Switzerland)": "Paul", + "(Québec)": "Pierre", + "(Germany, 2022)": "Potsdam", + "(Austria)": "Paula", + "(Germany, informal, 2022)": "Paula", + "(Netherlands)": "Pieter", + "Italian": "Padova", + "Spanish": "París", + "(Brazil)": "Pipa", + "(Portugal)": "Porto", + "Swedish": "Petter", + "Danish": "Peter", + "Norwegian": "Petter", + "Finnish": "Paavo", + "Turkish": "Polatlı", + "Romanian": "Petre", + "Czech": "Petr", + "Yugoslav": "Pirot", + "Serbian": "Pirot", + "Slovene": "Piran" + }, + { + "Letter": "Q", + "(International)": "Quebec", + "(France)": "Quintal", + "(Belgium)": "Quotiënt", + "(Switzerland)": "Quittance", + "(Québec)": "Québec", + "(Germany, 2022)": "Quickborn", + "(Austria)": "Quelle", + "(Germany, informal, 2022)": "Quelle", + "(Netherlands)": "Quirinus/Quinten/Quotiënt", + "Italian": "Quadro", + "Spanish": "Queso", + "(Brazil)": "Quilombo", + "(Portugal)": "Queluz", + "Swedish": "Quintus", + "Danish": "Quintus", + "Norwegian": "Quintus", + "Finnish": "Kuu", + "Romanian": "Qu-(Chiu)", + "Czech": "Quido", + "Yugoslav": "kvadrat", + "Serbian": "Ku", + "Slovene": "Queen" + }, + { + "Letter": "R", + "(International)": "Romeo", + "(France)": "Raoul", + "(Belgium)": "Robert", + "(Switzerland)": "Robert", + "(Québec)": "Robert", + "(Germany, 2022)": "Rostock", + "(Austria)": "Richard", + "(Germany, informal, 2022)": "Richard", + "(Netherlands)": "Richard/Rudolf", + "Italian": "Roma", + "Spanish": "Ramón", + "(Brazil)": "Raiz", + "(Portugal)": "Rossio", + "Swedish": "Rudolf", + "Danish": "Rasmus", + "Norwegian": "Rikard", + "Finnish": "Risto", + "Turkish": "Rize", + "Romanian": "Radu", + "Czech": "Rudolf", + "Yugoslav": "Rijeka", + "Serbian": "Ruma", + "Slovene": "Ravne" + }, + { + "Letter": "Ř", + "Czech": "Řehoř" + }, + { + "Letter": "S", + "(International)": "Sierra", + "(France)": "Suzanne", + "(Belgium)": "Sofie", + "(Switzerland)": "Suzanne", + "(Québec)": "Samuel", + "(Germany, 2022)": "Salzwedel", + "(Austria)": "Samuel/Siegfried", + "(Germany, informal, 2022)": "Samuel", + "(Netherlands)": "Simon", + "Italian": "Savona", + "Spanish": "Sábado", + "(Brazil)": "Saci", + "(Portugal)": "Setúbal", + "Swedish": "Sigurd", + "Danish": "Søren", + "Norwegian": "Sigrid", + "Finnish": "Sakari", + "Turkish": "Sinop", + "Romanian": "Sandu", + "Czech": "Svatopluk", + "Yugoslav": "Skopje", + "Serbian": "Sava", + "Slovene": "Soča" + }, + { + "Letter": "Ş", + "(Germany, 2022)": "Hakenstrich-Salzwedel", + "Turkish": "Şırnak" + }, + { + "Letter": "SCH", + "(Austria)": "Schule", + "(Germany, informal, 2022)": "Schule" + }, + { + "Letter": "ß", + "(Germany, 2022)": "Eszett", + "(Austria)": "Eszett/scharfes-S", + "(Germany, informal, 2022)": "Eszett" + }, + { + "Letter": "Š", + "(Germany, 2022)": "Winkelakzent-Salzwedel", + "Czech": "Šimon", + "Yugoslav": "Šibenik", + "Serbian": "Šabac", + "Slovene": "Šmarje" + }, + { + "Letter": "T", + "(International)": "Tango", + "(France)": "Thérèse", + "(Belgium)": "Telefoon", + "(Switzerland)": "Thérèse", + "(Québec)": "Thomas", + "(Germany, 2022)": "Tübingen", + "(Austria)": "Theodor", + "(Germany, informal, 2022)": "Theodor", + "(Netherlands)": "Theodor", + "Italian": "Torino", + "Spanish": "Toledo", + "(Brazil)": "Tatu", + "(Portugal)": "Tavira", + "Swedish": "Tore", + "Danish": "Theodor", + "Norwegian": "Teodor", + "Finnish": "Tyyne", + "Turkish": "Tokat", + "Romanian": "Tudor", + "Czech": "Tomáš", + "Yugoslav": "Tuzla", + "Serbian": "Timok", + "Slovene": "Triglav" + }, + { + "Letter": "Ť", + "Czech": "Těšnov" + }, + { + "Letter": "U", + "(International)": "Uniform", + "(France)": "Ursule", + "(Belgium)": "Ursula", + "(Switzerland)": "Ulysse", + "(Québec)": "Ursule", + "(Germany, 2022)": "Unna", + "(Austria)": "Ulrich", + "(Germany, informal, 2022)": "Ulrich", + "(Netherlands)": "Utrecht", + "Italian": "Udine", + "Spanish": "Ulises", + "(Brazil)": "Uva", + "(Portugal)": "Unidade", + "Swedish": "Urban", + "Danish": "Ulla", + "Norwegian": "Ulrik", + "Finnish": "Urho", + "Turkish": "Uşak", + "Romanian": "Udrea", + "Czech": "Urban", + "Yugoslav": "Užice", + "Serbian": "Užice", + "Slovene": "Unec" + }, + { + "Letter": "Ü", + "(Germany, 2022)": "Umlaut-Unna", + "(Austria)": "Übermut/Übel", + "(Germany, informal, 2022)": "Überfluss", + "Turkish": "Ünye" + }, + { + "Letter": "V", + "(International)": "Victor", + "(France)": "Victor", + "(Belgium)": "Victor", + "(Germany, 2022)": "Völklingen", + "(Austria)": "Viktor", + "(Germany, informal, 2022)": "Viktor", + "(Netherlands)": "Victor", + "Italian": "Verona/Venezia", + "Spanish": "Valencia", + "(Brazil)": "Vitória", + "(Portugal)": "Vidago", + "Swedish": "Viktor", + "Danish": "Viggo", + "Norwegian": "Enkelt-V", + "Finnish": "Vihtori", + "Turkish": "Van", + "Romanian": "Vasile", + "Czech": "Václav", + "Yugoslav": "Valjevo", + "Serbian": "Valjevo", + "Slovene": "Velenje" + }, + { + "Letter": "W", + "(International)": "Whiskey", + "(France)": "William", + "(Belgium)": "Waterloo", + "(Switzerland)": "William", + "(Québec)": "William", + "(Germany, 2022)": "Wuppertal", + "(Austria)": "Wilhelm", + "(Germany, informal, 2022)": "Wilhelm", + "(Netherlands)": "Willem", + "Italian": "Whiskey/Washington", + "Spanish": "Washington", + "(Brazil)": "Wilson", + "(Portugal)": "Waldemar", + "Swedish": "Wilhelm", + "Danish": "William", + "Norwegian": "Dobbelt-W", + "Finnish": "Wiski", + "Romanian": "dublu-v", + "Czech": "dvojité-V", + "Yugoslav": "duplo-ve", + "Serbian": "Duplo-ve", + "Slovene": "Dvojni-v" + }, + { + "Letter": "X", + "(International)": "X-ray", + "(France)": "Xavier", + "(Belgium)": "Xavier", + "(Switzerland)": "Xavier", + "(Québec)": "Xavier", + "(Germany, 2022)": "Xanten", + "(Austria)": "Xanthippe / Xaver", + "(Germany, informal, 2022)": "Xanthippe", + "(Netherlands)": "Xant(h)ippe", + "Italian": "Ics, Xilofono", + "Spanish": "Xilófono", + "(Brazil)": "Xadrez", + "(Portugal)": "Xavier", + "Swedish": "Xerxes", + "Danish": "Xerxes", + "Norwegian": "Xerxes", + "Finnish": "Äksä", + "Romanian": "Xenia", + "Czech": "Xaver", + "Yugoslav": "iks", + "Serbian": "Iks", + "Slovene": "Iks" + }, + { + "Letter": "Y", + "(International)": "Yankee", + "(France)": "Yvonne", + "(Belgium)": "Yvonne", + "(Germany, 2022)": "Ypsilon", + "(Austria)": "Ypsilon", + "(Germany, informal, 2022)": "Ypsilon", + "(Netherlands)": "Ypsilon", + "Italian": "York, yogurt", + "Spanish": "Yolanda", + "(Brazil)": "Yolanda", + "(Portugal)": "York", + "Swedish": "Yngve", + "Danish": "Yrsa", + "Norwegian": "Yngling", + "Finnish": "Yrjö", + "Turkish": "Yozgat", + "Romanian": "I-grec", + "Czech": "Ypsilon", + "Yugoslav": "ipsilon", + "Serbian": "Ipsilon", + "Slovene": "Ipsilon" + }, + { + "Letter": "IJ", + "(Germany, 2022)": "Verbund Ingelheim Jena", + "(Netherlands)": "IJmuiden/IJsbrand" + }, + { + "Letter": "Z", + "(International)": "Zulu", + "(France)": "Zoé", + "(Belgium)": "Zola", + "(Switzerland)": "Zurich", + "(Québec)": "Zoé", + "(Germany, 2022)": "Zwickau", + "(Austria)": "Zacharias/Zürich", + "(Germany, informal, 2022)": "Zacharias", + "(Netherlands)": "Zaandam/Zacharias", + "Italian": "Zara, Zorro", + "Spanish": "Zaragoza", + "(Brazil)": "Zebra", + "(Portugal)": "Zulmira", + "Swedish": "Zäta", + "Danish": "Zackarias", + "Norwegian": "Zakarias", + "Finnish": "Tseta", + "Turkish": "Zonguldak", + "Romanian": "Zahăr", + "Czech": "Zuzana", + "Yugoslav": "Zagreb", + "Serbian": "Zemun", + "Slovene": "Zalog" + }, + { + "Letter": "Ž", + "(Germany, 2022)": "Winkelakzent-Zwickau", + "Czech": "Žofie", + "Yugoslav": "Žirovnica", + "Serbian": "Žabljak", + "Slovene": "Žalec" + }, + { + "Letter": " ", + "(International)": "(SPACE)", + "(France)": "(ESPACE)", + "(Belgium)": "(ESPACE)", + "(Switzerland)": "(ESPACE)", + "(Québec)": "(ESPACE)", + "(Germany, 2022)": "(Leerzeichen)", + "(Austria)": "(Leerzeichen)", + "(Germany, informal, 2022)": "(Leerzeichen)", + "(Netherlands)": "(Spatie)", + "Italian": "(Spazio)", + "Spanish": "(Espacio)", + "(Brazil)": "(espaço)", + "(Portugal)": "(espaço)", + "Swedish": "(utrymme)", + "Danish": "(mellemrumstegn)", + "Norwegian": "(mellomromstegn)", + "Finnish": "(välilyönti)", + "Turkish": "(boşluk)", + "Romanian": "(spațiu)", + "Czech": "(prostorový)", + "Yugoslav": "(priestorový)", + "Serbian": "(prostorni)", + "Slovene": "(presledka)" + }, + { + "Letter": "А", + "Russian": "Анна" + }, + { + "Letter": "Б", + "Russian": "Борис" + }, + { + "Letter": "В", + "Russian": "Василий" + }, + { + "Letter": "Г", + "Russian": "Григорий" + }, + { + "Letter": "Д", + "Russian": "Дмитрий" + }, + { + "Letter": "Е", + "Russian": "Елена" + }, + { + "Letter": "Ё", + "Russian": "Елена" + }, + { + "Letter": "Ж", + "Russian": "Женя" + }, + { + "Letter": "З", + "Russian": "Зинаида" + }, + { + "Letter": "И", + "Russian": "Иван" + }, + { + "Letter": "Й", + "Russian": "Иван краткий" + }, + { + "Letter": "К", + "Russian": "Константин" + }, + { + "Letter": "Л", + "Russian": "Леонид" + }, + { + "Letter": "М", + "Russian": "Михаил" + }, + { + "Letter": "Н", + "Russian": "Николай" + }, + { + "Letter": "О", + "Russian": "Ольга" + }, + { + "Letter": "П", + "Russian": "Павел" + }, + { + "Letter": "Р", + "Russian": "Роман" + }, + { + "Letter": "С", + "Russian": "Семён" + }, + { + "Letter": "Т", + "Russian": "Татьяна" + }, + { + "Letter": "У", + "Russian": "Ульяна" + }, + { + "Letter": "Ф", + "Russian": "Фёдор" + }, + { + "Letter": "Х", + "Russian": "Харитон" + }, + { + "Letter": "Ц", + "Russian": "цапля" + }, + { + "Letter": "Ч", + "Russian": "человек" + }, + { + "Letter": "Ш", + "Russian": "Шура" + }, + { + "Letter": "Щ", + "Russian": "щука" + }, + { + "Letter": "Ъ", + "Russian": "твёрдый знак" + }, + { + "Letter": "Ы", + "Russian": "еры" + }, + { + "Letter": "Ь", + "Russian": "мягкий знак" + }, + { + "Letter": "Э", + "Russian": "эхо" + }, + { + "Letter": "Ю", + "Russian": "Юрий" + }, + { + "Letter": "Я", + "Russian": "Яков" + }, + { + "Letter": "12", + "Russian": "дюжина" + }, + { + "Letter": "50", + "Russian": "полсотни" + }, + { + "Letter": "Α", + "Greek": "αστήρ" + }, + { + "Letter": "Β", + "Greek": "Βύρων" + }, + { + "Letter": "Γ", + "Greek": "γαλή" + }, + { + "Letter": "Δ", + "Greek": "δόξα" + }, + { + "Letter": "Ε", + "Greek": "Ερμής" + }, + { + "Letter": "Ζ", + "Greek": "Ζευς" + }, + { + "Letter": "Η", + "Greek": "Ηρώ" + }, + { + "Letter": "Θ", + "Greek": "θεά" + }, + { + "Letter": "Ι", + "Greek": "ίσκιος" + }, + { + "Letter": "Κ", + "Greek": "κενόν" + }, + { + "Letter": "Λ", + "Greek": "λάμα" + }, + { + "Letter": "Μ", + "Greek": "μέλι" + }, + { + "Letter": "Ν", + "Greek": "ναός" + }, + { + "Letter": "Ξ", + "Greek": "Ξέρξης" + }, + { + "Letter": "Ο", + "Greek": "οσμή" + }, + { + "Letter": "Π", + "Greek": "Πέτρος" + }, + { + "Letter": "Ρ", + "Greek": "ρήγας" + }, + { + "Letter": "-ς", + "Greek": "σοφός" + }, + { + "Letter": "Σ", + "Greek": "σοφός" + }, + { + "Letter": "Τ", + "Greek": "τίγρης" + }, + { + "Letter": "Υ", + "Greek": "ύμνος" + }, + { + "Letter": "Φ", + "Greek": "Φωφώ" + }, + { + "Letter": "Χ", + "Greek": "χαρά" + }, + { + "Letter": "Ψ", + "Greek": "ψυχή" + }, + { + "Letter": "Ω", + "Greek": "ωμέγα" + }, + { + "Letter": "ー", + "Japanese": "長音" + }, + { + "Letter": "、", + "Japanese": "区切り点" + }, + { + "Letter": "∟", + "Japanese": "段落" + }, + { + "Letter": "(", + "Japanese": "下向括弧" + }, + { + "Letter": ")", + "Japanese": "上向括弧" + }, + { + "Letter": "あ", + "Japanese": "朝日のア" + }, + { + "Letter": "ア", + "Japanese": "朝日のア" + }, + { + "Letter": "い", + "Japanese": "いろはのイ" + }, + { + "Letter": "イ", + "Japanese": "いろはのイ" + }, + { + "Letter": "う", + "Japanese": "上野のウ" + }, + { + "Letter": "ウ", + "Japanese": "上野のウ" + }, + { + "Letter": "え", + "Japanese": "英語のエ" + }, + { + "Letter": "エ", + "Japanese": "英語のエ" + }, + { + "Letter": "お", + "Japanese": "大阪のオ" + }, + { + "Letter": "オ", + "Japanese": "大阪のオ" + }, + { + "Letter": "か", + "Japanese": "為替のカ" + }, + { + "Letter": "カ", + "Japanese": "為替のカ" + }, + { + "Letter": "き", + "Japanese": "切手のキ" + }, + { + "Letter": "キ", + "Japanese": "切手のキ" + }, + { + "Letter": "く", + "Japanese": "クラブのク" + }, + { + "Letter": "ク", + "Japanese": "クラブのク" + }, + { + "Letter": "け", + "Japanese": "景色のケ" + }, + { + "Letter": "ケ", + "Japanese": "景色のケ" + }, + { + "Letter": "こ", + "Japanese": "子供のコ" + }, + { + "Letter": "コ", + "Japanese": "子供のコ" + }, + { + "Letter": "さ", + "Japanese": "桜のサ" + }, + { + "Letter": "サ", + "Japanese": "桜のサ" + }, + { + "Letter": "し", + "Japanese": "新聞のシ" + }, + { + "Letter": "シ", + "Japanese": "新聞のシ" + }, + { + "Letter": "す", + "Japanese": "すずめのス" + }, + { + "Letter": "ス", + "Japanese": "すずめのス" + }, + { + "Letter": "せ", + "Japanese": "世界のセ" + }, + { + "Letter": "セ", + "Japanese": "世界のセ" + }, + { + "Letter": "そ", + "Japanese": "そろばんのソ" + }, + { + "Letter": "ソ", + "Japanese": "そろばんのソ" + }, + { + "Letter": "た", + "Japanese": "煙草のタ" + }, + { + "Letter": "タ", + "Japanese": "煙草のタ" + }, + { + "Letter": "ち", + "Japanese": "千鳥のチ" + }, + { + "Letter": "チ", + "Japanese": "千鳥のチ" + }, + { + "Letter": "つ", + "Japanese": "つるかめのツ" + }, + { + "Letter": "ツ", + "Japanese": "つるかめのツ" + }, + { + "Letter": "て", + "Japanese": "テレビのテ" + }, + { + "Letter": "テ", + "Japanese": "テレビのテ" + }, + { + "Letter": "と", + "Japanese": "東京のト" + }, + { + "Letter": "ト", + "Japanese": "東京のト" + }, + { + "Letter": "な", + "Japanese": "名古屋のナ" + }, + { + "Letter": "ナ", + "Japanese": "名古屋のナ" + }, + { + "Letter": "に", + "Japanese": "日本のニ" + }, + { + "Letter": "ニ", + "Japanese": "日本のニ" + }, + { + "Letter": "ぬ", + "Japanese": "沼津のヌ" + }, + { + "Letter": "ヌ", + "Japanese": "沼津のヌ" + }, + { + "Letter": "ね", + "Japanese": "ねずみのネ" + }, + { + "Letter": "ネ", + "Japanese": "ねずみのネ" + }, + { + "Letter": "の", + "Japanese": "野原のノ" + }, + { + "Letter": "ノ", + "Japanese": "野原のノ" + }, + { + "Letter": "は", + "Japanese": "はがきのハ" + }, + { + "Letter": "ハ", + "Japanese": "はがきのハ" + }, + { + "Letter": "ひ", + "Japanese": "飛行機のヒ" + }, + { + "Letter": "ヒ", + "Japanese": "飛行機のヒ" + }, + { + "Letter": "ふ", + "Japanese": "富士山のフ" + }, + { + "Letter": "フ", + "Japanese": "富士山のフ" + }, + { + "Letter": "へ", + "Japanese": "平和のヘ" + }, + { + "Letter": "ヘ", + "Japanese": "平和のヘ" + }, + { + "Letter": "ほ", + "Japanese": "保険のホ" + }, + { + "Letter": "ホ", + "Japanese": "保険のホ" + }, + { + "Letter": "ま", + "Japanese": "マッチのマ" + }, + { + "Letter": "マ", + "Japanese": "マッチのマ" + }, + { + "Letter": "み", + "Japanese": "三笠のミ" + }, + { + "Letter": "ミ", + "Japanese": "三笠のミ" + }, + { + "Letter": "む", + "Japanese": "無線のム" + }, + { + "Letter": "ム", + "Japanese": "無線のム" + }, + { + "Letter": "め", + "Japanese": "明治のメ" + }, + { + "Letter": "メ", + "Japanese": "明治のメ" + }, + { + "Letter": "も", + "Japanese": "もみじのモ" + }, + { + "Letter": "モ", + "Japanese": "もみじのモ" + }, + { + "Letter": "や", + "Japanese": "大和のヤ" + }, + { + "Letter": "ヤ", + "Japanese": "大和のヤ" + }, + { + "Letter": "ゆ", + "Japanese": "弓矢のユ" + }, + { + "Letter": "ユ", + "Japanese": "弓矢のユ" + }, + { + "Letter": "よ", + "Japanese": "吉野のヨ" + }, + { + "Letter": "ヨ", + "Japanese": "吉野のヨ" + }, + { + "Letter": "ら", + "Japanese": "ラジオのラ" + }, + { + "Letter": "ラ", + "Japanese": "ラジオのラ" + }, + { + "Letter": "り", + "Japanese": "りんごのリ" + }, + { + "Letter": "リ", + "Japanese": "りんごのリ" + }, + { + "Letter": "る", + "Japanese": "留守居のル" + }, + { + "Letter": "ル", + "Japanese": "留守居のル" + }, + { + "Letter": "れ", + "Japanese": "れんげのレ" + }, + { + "Letter": "レ", + "Japanese": "れんげのレ" + }, + { + "Letter": "ろ", + "Japanese": "ローマのロ" + }, + { + "Letter": "ロ", + "Japanese": "ローマのロ" + }, + { + "Letter": "わ", + "Japanese": "わらびのワ" + }, + { + "Letter": "ワ", + "Japanese": "わらびのワ" + }, + { + "Letter": "ゐ", + "Japanese": "ゐどのヰ" + }, + { + "Letter": "ヰ", + "Japanese": "ゐどのヰ" + }, + { + "Letter": "ゑ", + "Japanese": "かぎのあるヱ" + }, + { + "Letter": "ヱ", + "Japanese": "かぎのあるヱ" + }, + { + "Letter": "を", + "Japanese": "尾張のヲ" + }, + { + "Letter": "ヲ", + "Japanese": "尾張のヲ" + }, + { + "Letter": "ん", + "Japanese": "おしまいのン" + }, + { + "Letter": "ン", + "Japanese": "おしまいのン" + }, + { + "Letter": "゛", + "Japanese": "濁点" + }, + { + "Letter": "゜", + "Japanese": "半濁点" + }, + { + "Letter": "ㄱ", + "Korean": "기러기" + }, + { + "Letter": "ㄴ", + "Korean": "나폴리" + }, + { + "Letter": "ㄷ", + "Korean": "도라지" + }, + { + "Letter": "ㄹ", + "Korean": "로마" + }, + { + "Letter": "ㅁ", + "Korean": "미나리" + }, + { + "Letter": "ㅂ", + "Korean": "바가지" + }, + { + "Letter": "ㅅ", + "Korean": "서울" + }, + { + "Letter": "ㅇ", + "Korean": "잉어" + }, + { + "Letter": "ㅈ", + "Korean": "지게" + }, + { + "Letter": "ㅊ", + "Korean": "치마" + }, + { + "Letter": "ㅋ", + "Korean": "키다리" + }, + { + "Letter": "ㅌ", + "Korean": "통신" + }, + { + "Letter": "ㅍ", + "Korean": "파고다" + }, + { + "Letter": "ㅎ", + "Korean": "한강" + }, + { + "Letter": "ㅏ", + "Korean": "아버지" + }, + { + "Letter": "ㅑ", + "Korean": "야자수" + }, + { + "Letter": "ㅓ", + "Korean": "어머니" + }, + { + "Letter": "ㅕ", + "Korean": "연못" + }, + { + "Letter": "ㅗ", + "Korean": "오징어" + }, + { + "Letter": "ㅛ", + "Korean": "요지경" + }, + { + "Letter": "ㅜ", + "Korean": "우편" + }, + { + "Letter": "ㅠ", + "Korean": "유달산" + }, + { + "Letter": "ㅡ", + "Korean": "은방울" + }, + { + "Letter": "ㅣ", + "Korean": "이순신" + }, + { + "Letter": "ㅐ", + "Korean": "앵무새" + }, + { + "Letter": "ㅔ", + "Korean": "엑스레이" + }, + { + "Letter": "0", + "(International)": "zero", + "(France)": "zéro", + "(Belgium)": "zéro", + "(Switzerland)": "zéro", + "(Québec)": "zéro", + "(Germany, 2022)": "null", + "(Austria)": "null", + "(Germany, informal, 2022)": "null", + "(Netherlands)": "nul", + "Italian": "zero", + "Spanish": "cero", + "(Brazil)": "zero", + "(Portugal)": "zero", + "Swedish": "noll", + "Danish": "nul", + "Norwegian": "null", + "Finnish": "nolla", + "Turkish": "sıfır", + "Romanian": "zero", + "Czech": "nula", + "Yugoslav": "nula", + "Serbian": "nula", + "Slovene": "nič", + "Russian": "ноль (nol)", + "Korean": "영 (yeong)", + "Greek": "μηδέν (miden)", + "Japanese": "ゼロ (zero)" + }, + { + "Letter": "1", + "(International)": "one", + "(France)": "un", + "(Belgium)": "un", + "(Switzerland)": "un", + "(Québec)": "un", + "(Germany, 2022)": "eins", + "(Austria)": "eins", + "(Germany, informal, 2022)": "eins", + "(Netherlands)": "één", + "Italian": "uno", + "Spanish": "uno", + "(Brazil)": "um", + "(Portugal)": "um", + "Swedish": "ett", + "Danish": "en", + "Norwegian": "en", + "Finnish": "yksi", + "Turkish": "bir", + "Romanian": "unu", + "Czech": "jedna", + "Yugoslav": "jedan", + "Serbian": "jedan", + "Slovene": "ena", + "Russian": "один (odin)", + "Korean": "일 (il)", + "Greek": "ένα (ena)", + "Japanese": "いち (ichi)" + }, + { + "Letter": "2", + "(International)": "two", + "(France)": "deux", + "(Belgium)": "deux", + "(Switzerland)": "deux", + "(Québec)": "deux", + "(Germany, 2022)": "zwei", + "(Austria)": "zwei", + "(Germany, informal, 2022)": "zwei", + "(Netherlands)": "twee", + "Italian": "due", + "Spanish": "dos", + "(Brazil)": "dois", + "(Portugal)": "dois", + "Swedish": "två", + "Danish": "to", + "Norwegian": "to", + "Finnish": "kaksi", + "Turkish": "iki", + "Romanian": "doi", + "Czech": "dva", + "Yugoslav": "dva", + "Serbian": "dva", + "Slovene": "dva", + "Russian": "два (dva)", + "Korean": "이 (i)", + "Greek": "δύο (dyo)", + "Japanese": "に (ni)" + }, + { + "Letter": "3", + "(International)": "three", + "(France)": "trois", + "(Belgium)": "trois", + "(Switzerland)": "trois", + "(Québec)": "trois", + "(Germany, 2022)": "drei", + "(Austria)": "drei", + "(Germany, informal, 2022)": "drei", + "(Netherlands)": "drie", + "Italian": "tre", + "Spanish": "tres", + "(Brazil)": "três", + "(Portugal)": "três", + "Swedish": "tre", + "Danish": "tre", + "Norwegian": "tre", + "Finnish": "kolme", + "Turkish": "üç", + "Romanian": "trei", + "Czech": "tři", + "Yugoslav": "tri", + "Serbian": "tri", + "Slovene": "tri", + "Russian": "три (tri)", + "Korean": "삼 (sam)", + "Greek": "τρία (tria)", + "Japanese": "さん (san)" + }, + { + "Letter": "4", + "(International)": "four", + "(France)": "quatre", + "(Belgium)": "vier", + "(Switzerland)": "quatre", + "(Québec)": "quatre", + "(Germany, 2022)": "vier", + "(Austria)": "vier", + "(Germany, informal, 2022)": "vier", + "(Netherlands)": "vier", + "Italian": "quattro", + "Spanish": "cuatro", + "(Brazil)": "quatro", + "(Portugal)": "quatro", + "Swedish": "fyra", + "Danish": "fire", + "Norwegian": "fire", + "Finnish": "neljä", + "Turkish": "dört", + "Romanian": "patru", + "Czech": "čtyři", + "Yugoslav": "četiri", + "Serbian": "četiri", + "Slovene": "štiri", + "Russian": "четыре (chetyre)", + "Korean": "사 (sa)", + "Greek": "τέσσερα (tessera)", + "Japanese": "し (shi) / よん (yon)" + }, + { + "Letter": "5", + "(International)": "five", + "(France)": "cinq", + "(Belgium)": "vijf", + "(Switzerland)": "cinq", + "(Québec)": "cinq", + "(Germany, 2022)": "fünf", + "(Austria)": "fünf", + "(Germany, informal, 2022)": "fünf", + "(Netherlands)": "vijf", + "Italian": "cinque", + "Spanish": "cinco", + "(Brazil)": "cinco", + "(Portugal)": "cinco", + "Swedish": "fem", + "Danish": "fem", + "Norwegian": "fem", + "Finnish": "viisi", + "Turkish": "beş", + "Romanian": "cinci", + "Czech": "pět", + "Yugoslav": "pet", + "Serbian": "pet", + "Slovene": "pet", + "Russian": "пять (pyat')", + "Korean": "오 (o)", + "Greek": "πέντε (pente)", + "Japanese": "ご (go)" + }, + { + "Letter": "6", + "(International)": "six", + "(France)": "six", + "(Belgium)": "zes", + "(Switzerland)": "six", + "(Québec)": "six", + "(Germany, 2022)": "sechs", + "(Austria)": "sechs", + "(Germany, informal, 2022)": "sechs", + "(Netherlands)": "zes", + "Italian": "sei", + "Spanish": "seis", + "(Brazil)": "seis", + "(Portugal)": "seis", + "Swedish": "sex", + "Danish": "seks", + "Norwegian": "seks", + "Finnish": "kuusi", + "Turkish": "altı", + "Romanian": "șase", + "Czech": "šest", + "Yugoslav": "šest", + "Serbian": "šest", + "Slovene": "šest", + "Russian": "шесть (shest')", + "Korean": "육 (yuk)", + "Greek": "έξι (exi)", + "Japanese": "ろく (roku)" + }, + { + "Letter": "7", + "(International)": "seven", + "(France)": "sept", + "(Belgium)": "zeven", + "(Switzerland)": "sept", + "(Québec)": "sept", + "(Germany, 2022)": "sieben", + "(Austria)": "sieben", + "(Germany, informal, 2022)": "sieben", + "(Netherlands)": "zeven", + "Italian": "sette", + "Spanish": "siete", + "(Brazil)": "sete", + "(Portugal)": "sete", + "Swedish": "sju", + "Danish": "syv", + "Norwegian": "sju", + "Finnish": "seitsemän", + "Turkish": "yedi", + "Romanian": "șapte", + "Czech": "sedm", + "Yugoslav": "sedam", + "Serbian": "sedam", + "Slovene": "sedem", + "Russian": "семь (sem')", + "Korean": "칠 (chil)", + "Greek": "επτά (epta)", + "Japanese": "しち (shichi) / なな (nana)" + }, + { + "Letter": "8", + "(International)": "eight", + "(France)": "huit", + "(Belgium)": "acht", + "(Switzerland)": "huit", + "(Québec)": "huit", + "(Germany, 2022)": "acht", + "(Austria)": "acht", + "(Germany, informal, 2022)": "acht", + "(Netherlands)": "acht", + "Italian": "otto", + "Spanish": "ocho", + "(Brazil)": "oito", + "(Portugal)": "oito", + "Swedish": "åtta", + "Danish": "otte", + "Norwegian": "åtte", + "Finnish": "kahdeksan", + "Turkish": "sekiz", + "Romanian": "opt", + "Czech": "osm", + "Yugoslav": "osam", + "Serbian": "osam", + "Slovene": "osem", + "Russian": "восемь (vosem')", + "Korean": "팔 (pal)", + "Greek": "οκτώ (okto)", + "Japanese": "はち (hachi)" + }, + { + "Letter": "9", + "(International)": "nine", + "(France)": "neuf", + "(Belgium)": "negen", + "(Switzerland)": "neuf", + "(Québec)": "neuf", + "(Germany, 2022)": "neun", + "(Austria)": "neun", + "(Germany, informal, 2022)": "neun", + "(Netherlands)": "negen", + "Italian": "nove", + "Spanish": "nueve", + "(Brazil)": "nove", + "(Portugal)": "nove", + "Swedish": "nio", + "Danish": "ni", + "Norwegian": "ni", + "Finnish": "yhdeksän", + "Turkish": "dokuz", + "Romanian": "nouă", + "Czech": "devět", + "Yugoslav": "devet", + "Serbian": "devet", + "Slovene": "devet", + "Russian": "девять (devyat')", + "Korean": "구 (gu)", + "Greek": "εννέα (ennea)", + "Japanese": "きゅう (kyuu) / く (ku)" + }, + { + "Letter": ";", + "(International)": "semicolon", + "(France)": "point-virgule", + "(Belgium)": "point-virgule", + "(Switzerland)": "point-virgule", + "(Québec)": "point-virgule", + "(Germany, 2022)": "Semikolon", + "(Austria)": "Semikolon", + "(Germany, informal, 2022)": "Semikolon", + "(Netherlands)": "puntkomma", + "Italian": "punto e virgola", + "Spanish": "punto y coma", + "(Brazil)": "ponto e vírgula", + "(Portugal)": "ponto e vírgula", + "Swedish": "semikolon", + "Danish": "semikolon", + "Norwegian": "semikolon", + "Finnish": "puolipiste", + "Turkish": "noktalı virgül", + "Romanian": "punct și virgulă", + "Czech": "středník", + "Yugoslav": "tačka-zarez", + "Serbian": "tačka-zarez", + "Slovene": "podpičje", + "Russian": "точка с запятой (tochka s zapyatoy)", + "Korean": "세미콜론 (semikollon)", + "Greek": "άνω τελεία (áno teleía)", + "Japanese": "セミコロン (semikōron)" + }, + { + "Letter": ".", + "(International)": "period", + "(France)": "point", + "(Belgium)": "point", + "(Switzerland)": "point", + "(Québec)": "point", + "(Germany, 2022)": "Punkt", + "(Austria)": "Punkt", + "(Germany, informal, 2022)": "Punkt", + "(Netherlands)": "punt", + "Italian": "punto", + "Spanish": "punto", + "(Brazil)": "ponto", + "(Portugal)": "ponto", + "Swedish": "punkt", + "Danish": "punktum", + "Norwegian": "punktum", + "Finnish": "piste", + "Turkish": "nokta", + "Romanian": "punct", + "Czech": "tečka", + "Yugoslav": "tačka", + "Serbian": "tačka", + "Slovene": "pika", + "Russian": "точка (tochka)", + "Korean": "마침표 (machimpyo)", + "Greek": "τελεία (teleía)", + "Japanese": "句点 (kuten)" + }, + { + "Letter": ":", + "(International)": "colon", + "(France)": "deux-points", + "(Belgium)": "deux-points", + "(Switzerland)": "deux-points", + "(Québec)": "deux-points", + "(Germany, 2022)": "Doppelpunkt", + "(Austria)": "Doppelpunkt", + "(Germany, informal, 2022)": "Doppelpunkt", + "(Netherlands)": "dubbele punt", + "Italian": "due punti", + "Spanish": "dos puntos", + "(Brazil)": "dois pontos", + "(Portugal)": "dois pontos", + "Swedish": "kolon", + "Danish": "kolon", + "Norwegian": "kolon", + "Finnish": "kaksoispiste", + "Turkish": "iki nokta", + "Romanian": "două puncte", + "Czech": "dvojtečka", + "Yugoslav": "dvotačka", + "Serbian": "dvotačka", + "Slovene": "dvojna pika", + "Russian": "двоеточие (dvoetochie)", + "Korean": "콜론 (kollon)", + "Greek": "διπλή τελεία (diplí teleía)", + "Japanese": "コロン (koron)" + }, + { + "Letter": "!", + "(International)": "exclamation mark", + "(France)": "point d'exclamation", + "(Belgium)": "point d'exclamation", + "(Switzerland)": "point d'exclamation", + "(Québec)": "point d'exclamation", + "(Germany, 2022)": "Ausrufezeichen", + "(Austria)": "Ausrufezeichen", + "(Germany, informal, 2022)": "Ausrufezeichen", + "(Netherlands)": "uitroepteken", + "Italian": "punto esclamativo", + "Spanish": "signo de exclamación", + "(Brazil)": "ponto de exclamação", + "(Portugal)": "ponto de exclamação", + "Swedish": "utropstecken", + "Danish": "udråbstegn", + "Norwegian": "utropstegn", + "Finnish": "huutomerkki", + "Turkish": "ünlem", + "Romanian": "semnul exclamării", + "Czech": "vykřičník", + "Yugoslav": "uzvičnik", + "Serbian": "uzvičnik", + "Slovene": "klicaj", + "Russian": "восклицательный знак (vosklitsatel'nyy znak)", + "Korean": "느낌표 (neukkimpyo)", + "Greek": "θαυμαστικό (thavmastikó)", + "Japanese": "感嘆符 (kantanfu)" + }, + { + "Letter": "?", + "(International)": "question mark", + "(France)": "point d'interrogation", + "(Belgium)": "point d'interrogation", + "(Switzerland)": "point d'interrogation", + "(Québec)": "point d'interrogation", + "(Germany, 2022)": "Fragezeichen", + "(Austria)": "Fragezeichen", + "(Germany, informal, 2022)": "Fragezeichen", + "(Netherlands)": "vraagteken", + "Italian": "punto interrogativo", + "Spanish": "signo de interrogación", + "(Brazil)": "ponto de interrogação", + "(Portugal)": "ponto de interrogação", + "Swedish": "frågetecken", + "Danish": "spørgsmålstegn", + "Norwegian": "spørsmålstegn", + "Finnish": "kysymysmerkki", + "Turkish": "soru işareti", + "Romanian": "semnul întrebării", + "Czech": "otazník", + "Yugoslav": "upitnik", + "Serbian": "upitnik", + "Slovene": "vprašaj", + "Russian": "вопросительный знак (voprositel'nyy znak)", + "Korean": "물음표 (mureumpyo)", + "Greek": "ερωτηματικό (erotimatikó)", + "Japanese": "疑問符 (gimonfu)" + }, + { + "Letter": ",", + "(International)": "comma", + "(France)": "virgule", + "(Belgium)": "virgule", + "(Switzerland)": "virgule", + "(Québec)": "virgule", + "(Germany, 2022)": "Komma", + "(Austria)": "Komma", + "(Germany, informal, 2022)": "Komma", + "(Netherlands)": "komma", + "Italian": "virgola", + "Spanish": "coma", + "(Brazil)": "vírgula", + "(Portugal)": "vírgula", + "Swedish": "komma", + "Danish": "komma", + "Norwegian": "komma", + "Finnish": "pilkku", + "Turkish": "virgül", + "Romanian": "virgulă", + "Czech": "čárka", + "Yugoslav": "zarez", + "Serbian": "zarez", + "Slovene": "vejica", + "Russian": "запятая (zapyataya)", + "Korean": "쉼표 (swimpyo)", + "Greek": "κόμμα (kómma)", + "Japanese": "コンマ (konma)" + }, + { + "Letter": "{", + "(International)": "curly brace", + "(France)": "accolade", + "(Belgium)": "accolade", + "(Switzerland)": "accolade", + "(Québec)": "accolade", + "(Germany, 2022)": "geschweifte Klammer", + "(Austria)": "geschweifte Klammer", + "(Germany, informal, 2022)": "geschweifte Klammer", + "(Netherlands)": "geschweifte haakjes", + "Italian": "parentesi graffa", + "Spanish": "llave", + "(Brazil)": "chave", + "(Portugal)": "chave", + "Swedish": "klammerparentes", + "Danish": "accolade", + "Norwegian": "krøllparentes", + "Finnish": "hakasulje", + "Turkish": "küme parantezi", + "Romanian": "accoladă", + "Czech": "složená závorka", + "Yugoslav": "vitičasta zagrada", + "Serbian": "vitičasta zagrada", + "Slovene": "zaviti oklepaj", + "Russian": "фигурная скобка (figurnaya skobka)", + "Korean": "중괄호 (jung-gwalho)", + "Greek": "άγκιστρο (ágkistro)", + "Japanese": "中括弧 (nakakakko)" + }, + { + "Letter": "}", + "(International)": "curly brace", + "(France)": "accolade", + "(Belgium)": "accolade", + "(Switzerland)": "accolade", + "(Québec)": "accolade", + "(Germany, 2022)": "geschweifte Klammer", + "(Austria)": "geschweifte Klammer", + "(Germany, informal, 2022)": "geschweifte Klammer", + "(Netherlands)": "geschweifte haakjes", + "Italian": "parentesi graffa", + "Spanish": "llave", + "(Brazil)": "chave", + "(Portugal)": "chave", + "Swedish": "klammerparentes", + "Danish": "accolade", + "Norwegian": "krøllparentes", + "Finnish": "hakasulje", + "Turkish": "küme parantezi", + "Romanian": "accoladă", + "Czech": "složená závorka", + "Yugoslav": "vitičasta zagrada", + "Serbian": "vitičasta zagrada", + "Slovene": "zaviti oklepaj", + "Russian": "фигурная скобка (figurnaya skobka)", + "Korean": "중괄호 (jung-gwalho)", + "Greek": "άγκιστρο (ágkistro)", + "Japanese": "中括弧 (nakakakko)" + }, + { + "Letter": "(", + "(International)": "parenthesis", + "(France)": "parenthèse", + "(Belgium)": "parenthèse", + "(Switzerland)": "parenthèse", + "(Québec)": "parenthèse", + "(Germany, 2022)": "Klammer auf", + "(Austria)": "Klammer auf", + "(Germany, informal, 2022)": "Klammer auf", + "(Netherlands)": "haakje openen", + "Italian": "parentesi", + "Spanish": "paréntesis", + "(Brazil)": "parêntese", + "(Portugal)": "parêntese", + "Swedish": "parentes", + "Danish": "parentes", + "Norwegian": "parentes", + "Finnish": "sulku", + "Turkish": "parantez", + "Romanian": "paranteză", + "Czech": "závorka", + "Yugoslav": "zagrada", + "Serbian": "zagrada", + "Slovene": "oklepaj", + "Russian": "скобка (skobka)", + "Korean": "소괄호 (sogwalho)", + "Greek": "παρένθεση (parénthesi)", + "Japanese": "丸括弧 (marukakko)" + }, + { + "Letter": ")", + "(International)": "parenthesis", + "(France)": "parenthèse", + "(Belgium)": "parenthèse", + "(Switzerland)": "parenthèse", + "(Québec)": "parenthèse", + "(Germany, 2022)": "Klammer zu", + "(Austria)": "Klammer zu", + "(Germany, informal, 2022)": "Klammer zu", + "(Netherlands)": "haakje sluiten", + "Italian": "parentesi", + "Spanish": "paréntesis", + "(Brazil)": "parêntese", + "(Portugal)": "parêntese", + "Swedish": "parentes", + "Danish": "parentes", + "Norwegian": "parentes", + "Finnish": "sulku", + "Turkish": "parantez", + "Romanian": "paranteză", + "Czech": "závorka", + "Yugoslav": "zagrada", + "Serbian": "zagrada", + "Slovene": "oklepaj", + "Russian": "скобка (skobka)", + "Korean": "소괄호 (sogwalho)", + "Greek": "παρένθεση (parénthesi)", + "Japanese": "丸括弧 (marukakko)" + }, + { + "Letter": "[", + "(International)": "square bracket", + "(France)": "crochet", + "(Belgium)": "crochet", + "(Switzerland)": "crochet", + "(Québec)": "crochet", + "(Germany, 2022)": "eckige Klammer", + "(Austria)": "eckige Klammer", + "(Germany, informal, 2022)": "eckige Klammer", + "(Netherlands)": "vierkante haak", + "Italian": "parentesi quadra", + "Spanish": "corchete", + "(Brazil)": "colchete", + "(Portugal)": "colchete", + "Swedish": "hakparentes", + "Danish": "hård parentes", + "Norwegian": "klammeparentes", + "Finnish": "hakain", + "Turkish": "köşeli parantez", + "Romanian": "paranteză pătrată", + "Czech": "hranatá závorka", + "Yugoslav": "uglasta zagrada", + "Serbian": "uglasta zagrada", + "Slovene": "oglati oklepaj", + "Russian": "квадратная скобка (kvadratnaya skobka)", + "Korean": "대괄호 (daegwalho)", + "Greek": "αγκύλη (ankýli)", + "Japanese": "角括弧 (kakukakko)" + }, + { + "Letter": "]", + "(International)": "square bracket", + "(France)": "crochet", + "(Belgium)": "crochet", + "(Switzerland)": "crochet", + "(Québec)": "crochet", + "(Germany, 2022)": "eckige Klammer", + "(Austria)": "eckige Klammer", + "(Germany, informal, 2022)": "eckige Klammer", + "(Netherlands)": "vierkante haak", + "Italian": "parentesi quadra", + "Spanish": "corchete", + "(Brazil)": "colchete", + "(Portugal)": "colchete", + "Swedish": "hakparentes", + "Danish": "hård parentes", + "Norwegian": "klammeparentes", + "Finnish": "hakain", + "Turkish": "köşeli parantez", + "Romanian": "paranteză pătrată", + "Czech": "hranatá závorka", + "Yugoslav": "uglasta zagrada", + "Serbian": "uglasta zagrada", + "Slovene": "oglati oklepaj", + "Russian": "квадратная скобка (kvadratnaya skobka)", + "Korean": "대괄호 (daegwalho)", + "Greek": "αγκύλη (ankýli)", + "Japanese": "角括弧 (kakukakko)" + }, + { + "Letter": "%", + "(International)": "percent", + "(France)": "pour cent", + "(Belgium)": "pour cent", + "(Switzerland)": "pour cent", + "(Québec)": "pour cent", + "(Germany, 2022)": "Prozent", + "(Austria)": "Prozent", + "(Germany, informal, 2022)": "Prozent", + "(Netherlands)": "procent", + "Italian": "percento", + "Spanish": "por ciento", + "(Brazil)": "por cento", + "(Portugal)": "por cento", + "Swedish": "procent", + "Danish": "procent", + "Norwegian": "prosent", + "Finnish": "prosentti", + "Turkish": "yüzde", + "Romanian": "la sută", + "Czech": "procent", + "Yugoslav": "posto", + "Serbian": "posto", + "Slovene": "odstotek", + "Russian": "процент (protsent)", + "Korean": "퍼센트 (peosenteu)", + "Greek": "τοις εκατό (tois ekató)", + "Japanese": "パーセント (pāsento)" + }, + { + "Letter": "#", + "(International)": "hash", + "(France)": "dièse", + "(Belgium)": "dièse", + "(Switzerland)": "dièse", + "(Québec)": "dièse", + "(Germany, 2022)": "Raute", + "(Austria)": "Raute", + "(Germany, informal, 2022)": "Raute", + "(Netherlands)": "hekje", + "Italian": "cancelletto", + "Spanish": "almohadilla", + "(Brazil)": "jogo da velha", + "(Portugal)": "cardinal", + "Swedish": "fyrkant", + "Danish": "havelåge", + "Norwegian": "firkant", + "Finnish": "risuaita", + "Turkish": "kare", + "Romanian": "diez", + "Czech": "křížek", + "Yugoslav": "taraba", + "Serbian": "taraba", + "Slovene": "lonec", + "Russian": "решётка (reshyotka)", + "Korean": "우물정자 (umuljeongja)", + "Greek": "δίεση (díesi)", + "Japanese": "シャープ (shāpu)" + }, + { + "Letter": "\"", + "(International)": "quotation mark", + "(France)": "guillemet", + "(Belgium)": "guillemet", + "(Switzerland)": "guillemet", + "(Québec)": "guillemet", + "(Germany, 2022)": "Anführungszeichen", + "(Austria)": "Anführungszeichen", + "(Germany, informal, 2022)": "Anführungszeichen", + "(Netherlands)": "aanhalingsteken", + "Italian": "virgolette", + "Spanish": "comillas", + "(Brazil)": "aspas", + "(Portugal)": "aspas", + "Swedish": "citationstecken", + "Danish": "anførselstegn", + "Norwegian": "anførselstegn", + "Finnish": "lainausmerkki", + "Turkish": "tırnak işareti", + "Romanian": "ghilimele", + "Czech": "uvozovky", + "Yugoslav": "navodnici", + "Serbian": "navodnici", + "Slovene": "narekovaj", + "Russian": "кавычки (kavychki)", + "Korean": "따옴표 (ttaompyo)", + "Greek": "εισαγωγικά (eisagogiká)", + "Japanese": "引用符 (inyōfu)" + }, + { + "Letter": "&", + "(International)": "ampersand", + "(France)": "esperluette", + "(Belgium)": "esperluette", + "(Switzerland)": "esperluette", + "(Québec)": "esperluette", + "(Germany, 2022)": "Et-Zeichen", + "(Austria)": "Et-Zeichen", + "(Germany, informal, 2022)": "Et-Zeichen", + "(Netherlands)": "ampersand", + "Italian": "e commerciale", + "Spanish": "y comercial", + "(Brazil)": "e comercial", + "(Portugal)": "e comercial", + "Swedish": "och-tecken", + "Danish": "og-tegn", + "Norwegian": "og-tegn", + "Finnish": "et-merkki", + "Turkish": "ve işareti", + "Romanian": "ampersand", + "Czech": "ampersand", + "Yugoslav": "ampersand", + "Serbian": "ampersand", + "Slovene": "ampersand", + "Russian": "амперсанд (ampersand)", + "Korean": "앰퍼샌드 (aempeosaendeu)", + "Greek": "αντεστραμμένο (andestrammeno)", + "Japanese": "アンパサンド (anpasando)" + }, + { + "Letter": "$", + "(International)": "dollar", + "(France)": "dollar", + "(Belgium)": "dollar", + "(Switzerland)": "dollar", + "(Québec)": "dollar", + "(Germany, 2022)": "Dollar", + "(Austria)": "Dollar", + "(Germany, informal, 2022)": "Dollar", + "(Netherlands)": "dollar", + "Italian": "dollaro", + "Spanish": "dólar", + "(Brazil)": "real", + "(Portugal)": "dólar", + "Swedish": "dollar", + "Danish": "dollar", + "Norwegian": "dollar", + "Finnish": "dollari", + "Turkish": "dolar", + "Romanian": "dolar", + "Czech": "dolar", + "Yugoslav": "dolar", + "Serbian": "dolar", + "Slovene": "dolar", + "Russian": "доллар", + "Korean": "달러", + "Greek": "δολάριο", + "Japanese": "ドル" + }, + { + "Letter": "'", + "(International)": "apostrophe", + "(France)": "apostrophe", + "(Belgium)": "apostrophe", + "(Switzerland)": "apostrophe", + "(Québec)": "apostrophe", + "(Germany, 2022)": "Apostroph", + "(Austria)": "Apostroph", + "(Germany, informal, 2022)": "Apostroph", + "(Netherlands)": "apostrof", + "Italian": "apostrofo", + "Spanish": "apóstrofe", + "(Brazil)": "apóstrofo", + "(Portugal)": "apóstrofo", + "Swedish": "apostrof", + "Danish": "apostrof", + "Norwegian": "apostrof", + "Finnish": "apostrofi", + "Turkish": "kesme işareti", + "Romanian": "apozitiv", + "Czech": "apostrof", + "Yugoslav": "apostrof", + "Serbian": "apostrof", + "Slovene": "apostrof", + "Russian": "апостроф", + "Korean": "아포스트로프", + "Greek": "απόστροφος", + "Japanese": "アポストロフィ" + }, + { + "Letter": "*", + "(International)": "asterisk", + "(France)": "astérisque", + "(Belgium)": "astérisque", + "(Switzerland)": "astérisque", + "(Québec)": "astérisque", + "(Germany, 2022)": "Sternchen", + "(Austria)": "Sternchen", + "(Germany, informal, 2022)": "Sternchen", + "(Netherlands)": "asterisk", + "Italian": "asterisco", + "Spanish": "asterisco", + "(Brazil)": "asterisco", + "(Portugal)": "asterisco", + "Swedish": "asterisk", + "Danish": "stjerne", + "Norwegian": "stjerne", + "Finnish": "tähti", + "Turkish": "yıldız", + "Romanian": "stea", + "Czech": "hvězdička", + "Yugoslav": "zvezdica", + "Serbian": "zvezdica", + "Slovene": "zvezdica", + "Russian": "звездочка", + "Korean": "별표", + "Greek": "αστερίσκος", + "Japanese": "アスタリスク" + }, + { + "Letter": "+", + "(International)": "plus", + "(France)": "plus", + "(Belgium)": "plus", + "(Switzerland)": "plus", + "(Québec)": "plus", + "(Germany, 2022)": "Plus", + "(Austria)": "Plus", + "(Germany, informal, 2022)": "Plus", + "(Netherlands)": "plus", + "Italian": "più", + "Spanish": "más", + "(Brazil)": "mais", + "(Portugal)": "mais", + "Swedish": "plus", + "Danish": "plus", + "Norwegian": "pluss", + "Finnish": "plus", + "Turkish": "artı", + "Romanian": "plus", + "Czech": "plus", + "Yugoslav": "plus", + "Serbian": "plus", + "Slovene": "plus", + "Russian": "плюс", + "Korean": "플러스", + "Greek": "συν", + "Japanese": "プラス" + }, + { + "Letter": "-", + "(International)": "minus", + "(France)": "moins", + "(Belgium)": "moins", + "(Switzerland)": "moins", + "(Québec)": "moins", + "(Germany, 2022)": "Minus", + "(Austria)": "Minus", + "(Germany, informal, 2022)": "Minus", + "(Netherlands)": "min", + "Italian": "meno", + "Spanish": "menos", + "(Brazil)": "menos", + "(Portugal)": "menos", + "Swedish": "minus", + "Danish": "minus", + "Norwegian": "minus", + "Finnish": "miinus", + "Turkish": "eksi", + "Romanian": "minus", + "Czech": "mínus", + "Yugoslav": "minus", + "Serbian": "minus", + "Slovene": "minus", + "Russian": "минус", + "Korean": "마이너스", + "Greek": "μείον", + "Japanese": "マイナス" + }, + { + "Letter": "/", + "(International)": "slash", + "(France)": "barre oblique", + "(Belgium)": "barre oblique", + "(Switzerland)": "barre oblique", + "(Québec)": "barre oblique", + "(Germany, 2022)": "Schrägstrich", + "(Austria)": "Schrägstrich", + "(Germany, informal, 2022)": "Schrägstrich", + "(Netherlands)": "schuin", + "Italian": "barra", + "Spanish": "barra", + "(Brazil)": "barra", + "(Portugal)": "barra", + "Swedish": "snedstreck", + "Danish": "skråstreg", + "Norwegian": "skråstrek", + "Finnish": "viiva", + "Turkish": "eğik", + "Romanian": "bară", + "Czech": "lomítko", + "Yugoslav": "slash", + "Serbian": "slash", + "Slovene": "poševnica", + "Russian": "слэш", + "Korean": "슬래시", + "Greek": "σλάς", + "Japanese": "スラッシュ" + }, + { + "Letter": "<", + "(International)": "less than", + "(France)": "inférieur à", + "(Belgium)": "inférieur à", + "(Switzerland)": "inférieur à", + "(Québec)": "inférieur à", + "(Germany, 2022)": "kleiner als", + "(Austria)": "kleiner als", + "(Germany, informal, 2022)": "kleiner als", + "(Netherlands)": "kleiner dan", + "Italian": "minore di", + "Spanish": "menor que", + "(Brazil)": "menor que", + "(Portugal)": "menor que", + "Swedish": "mindre än", + "Danish": "mindre end", + "Norwegian": "mindre enn", + "Finnish": "pienempi kuin", + "Turkish": "küçüktür", + "Romanian": "mai mic decât", + "Czech": "menší než", + "Yugoslav": "manje od", + "Serbian": "manje od", + "Slovene": "manj kot", + "Russian": "меньше чем", + "Korean": "보다 작다", + "Greek": "μικρότερο από", + "Japanese": "より小さい" + }, + { + "Letter": ">", + "(International)": "greater than", + "(France)": "supérieur à", + "(Belgium)": "supérieur à", + "(Switzerland)": "supérieur à", + "(Québec)": "supérieur à", + "(Germany, 2022)": "größer als", + "(Austria)": "größer als", + "(Germany, informal, 2022)": "größer als", + "(Netherlands)": "groter dan", + "Italian": "maggiore di", + "Spanish": "mayor que", + "(Brazil)": "maior que", + "(Portugal)": "maior que", + "Swedish": "större än", + "Danish": "større end", + "Norwegian": "større enn", + "Finnish": "suurempi kuin", + "Turkish": "büyüktür", + "Romanian": "mai mare decât", + "Czech": "větší než", + "Yugoslav": "veće od", + "Serbian": "veće od", + "Slovene": "več kot", + "Russian": "больше чем", + "Korean": "보다 크다", + "Greek": "μεγαλύτερο από", + "Japanese": "より大きい" + }, + { + "Letter": "@", + "(International)": "at", + "(France)": "arobase", + "(Belgium)": "arobase", + "(Switzerland)": "arobase", + "(Québec)": "arobase", + "(Germany, 2022)": "Klammeraffe", + "(Austria)": "Klammeraffe", + "(Germany, informal, 2022)": "Klammeraffe", + "(Netherlands)": "apenstaartje", + "Italian": "chiocciola", + "Spanish": "arroba", + "(Brazil)": "arroba", + "(Portugal)": "arroba", + "Swedish": "snabel-a", + "Danish": "snabel-a", + "Norwegian": "snabel-a", + "Finnish": "at-merkki", + "Turkish": "et", + "Romanian": "at", + "Czech": "zavináč", + "Yugoslav": "at", + "Serbian": "at", + "Slovene": "at", + "Russian": "собака", + "Korean": "골뱅이", + "Greek": "παπάκι", + "Japanese": "アットマーク" + }, + { + "Letter": "\\", + "(International)": "backslash", + "(France)": "barre oblique inversée", + "(Belgium)": "barre oblique inversée", + "(Switzerland)": "barre oblique inversée", + "(Québec)": "barre oblique inversée", + "(Germany, 2022)": "Backslash", + "(Austria)": "Backslash", + "(Germany, informal, 2022)": "Backslash", + "(Netherlands)": "backslash", + "Italian": "barra rovesciata", + "Spanish": "barra invertida", + "(Brazil)": "barra invertida", + "(Portugal)": "barra invertida", + "Swedish": "bakåtsned", + "Danish": "backslash", + "Norwegian": "backslash", + "Finnish": "käänteinen viiva", + "Turkish": "ters eğik", + "Romanian": "bară inversă", + "Czech": "zpětné lomítko", + "Yugoslav": "backslash", + "Serbian": "backslash", + "Slovene": "backslash", + "Russian": "обратная косая черта", + "Korean": "역슬래시", + "Greek": "ανάστροφη κάθετος", + "Japanese": "バックスラッシュ" + }, + { + "Letter": "^", + "(International)": "caret", + "(France)": "accent circonflexe", + "(Belgium)": "accent circonflexe", + "(Switzerland)": "accent circonflexe", + "(Québec)": "accent circonflexe", + "(Germany, 2022)": "Zirkumflex", + "(Austria)": "Zirkumflex", + "(Germany, informal, 2022)": "Zirkumflex", + "(Netherlands)": "caret", + "Italian": "accento circonflesso", + "Spanish": "acento circunflejo", + "(Brazil)": "acento circunflexo", + "(Portugal)": "acento circunflexo", + "Swedish": "cirkumflex", + "Danish": "cirkumfleks", + "Norwegian": "cirkumfleks", + "Finnish": "hatun", + "Turkish": "şapka", + "Romanian": "cireș", + "Czech": "cirkumflex", + "Yugoslav": "cirkumfleks", + "Serbian": "cirkumfleks", + "Slovene": "cirkumfleks", + "Russian": "циркумфлекс", + "Korean": "캐럿", + "Greek": "περισπωμένη", + "Japanese": "キャレット" + }, + { + "Letter": "_", + "(International)": "underscore", + "(France)": "trait de soulignement", + "(Belgium)": "trait de soulignement", + "(Switzerland)": "trait de soulignement", + "(Québec)": "trait de soulignement", + "(Germany, 2022)": "Unterstrich", + "(Austria)": "Unterstrich", + "(Germany, informal, 2022)": "Unterstrich", + "(Netherlands)": "onderstreping", + "Italian": "trattino basso", + "Spanish": "guion bajo", + "(Brazil)": "sublinhado", + "(Portugal)": "sublinhado", + "Swedish": "understreck", + "Danish": "understreg", + "Norwegian": "understrek", + "Finnish": "alleviivain", + "Turkish": "alt çizgi", + "Romanian": "linia de subliniere", + "Czech": "podtržítko", + "Yugoslav": "donja crta", + "Serbian": "donja crta", + "Slovene": "spodnja črta", + "Russian": "подчеркивание", + "Korean": "밑줄", + "Greek": "κατω-γραμμή", + "Japanese": "アンダースコア" + }, + { + "Letter": "`", + "(International)": "grave accent", + "(France)": "accent grave", + "(Belgium)": "accent grave", + "(Switzerland)": "accent grave", + "(Québec)": "accent grave", + "(Germany, 2022)": "Gravis", + "(Austria)": "Gravis", + "(Germany, informal, 2022)": "Gravis", + "(Netherlands)": "grave accent", + "Italian": "accento grave", + "Spanish": "acento grave", + "(Brazil)": "acento grave", + "(Portugal)": "acento grave", + "Swedish": "grav accent", + "Danish": "grave accent", + "Norwegian": "grave accent", + "Finnish": "grave-äänne", + "Turkish": "açık tırnak", + "Romanian": "accent grav", + "Czech": "gravis", + "Yugoslav": "gravis", + "Serbian": "gravis", + "Slovene": "gravis", + "Russian": "гравис", + "Korean": "그레이브 액센트", + "Greek": "βαρύς τόνος", + "Japanese": "グレイヴアクセント" + }, + { + "Letter": "|", + "(International)": "vertical bar", + "(France)": "barre verticale", + "(Belgium)": "barre verticale", + "(Switzerland)": "barre verticale", + "(Québec)": "barre verticale", + "(Germany, 2022)": "senkrechte Linie", + "(Austria)": "senkrechte Linie", + "(Germany, informal, 2022)": "senkrechte Linie", + "(Netherlands)": "verticale streep", + "Italian": "barra verticale", + "Spanish": "barra vertical", + "(Brazil)": "barra vertical", + "(Portugal)": "barra vertical", + "Swedish": "vertikal linje", + "Danish": "lodret streg", + "Norwegian": "vertikal strek", + "Finnish": "pystysuora viiva", + "Turkish": "dikey çubuk", + "Romanian": "bară verticală", + "Czech": "svislá čára", + "Yugoslav": "vertikalna linija", + "Serbian": "vertikalna linija", + "Slovene": "navpična črta", + "Russian": "вертикальная черта", + "Korean": "세로 막대", + "Greek": "κάθετος", + "Japanese": "縦棒" + }, + { + "Letter": "~", + "(International)": "tilde", + "(France)": "tilde", + "(Belgium)": "tilde", + "(Switzerland)": "tilde", + "(Québec)": "tilde", + "(Germany, 2022)": "Tilde", + "(Austria)": "Tilde", + "(Germany, informal, 2022)": "Tilde", + "(Netherlands)": "tilde", + "Italian": "tilde", + "Spanish": "tilde", + "(Brazil)": "tilde", + "(Portugal)": "tilde", + "Swedish": "tilde", + "Danish": "tilde", + "Norwegian": "tilde", + "Finnish": "tilde", + "Turkish": "tilde", + "Romanian": "tilde", + "Czech": "tilde", + "Yugoslav": "tilde", + "Serbian": "tilde", + "Slovene": "tilde", + "Russian": "тильда", + "Korean": "틸다", + "Greek": "τιλντ", + "Japanese": "チルダ" + } +] diff --git a/src/tools/text-to-nato-alphabet/nato.test.data.json b/src/tools/text-to-nato-alphabet/nato.test.data.json new file mode 100644 index 00000000..d1fb7275 --- /dev/null +++ b/src/tools/text-to-nato-alphabet/nato.test.data.json @@ -0,0 +1,137 @@ +[ +{ + "lang": "(International)", + "input": "TesYW 123 ? = !@", + "output": "TANGO echo sierra YANKEE WHISKEY (SPACE) ONE TWO THREE (SPACE) (?) (SPACE) (=) (SPACE) (!) (@)" + }, + { + "lang": "(France)", + "input": "TesYW 123 ? = !@", + "output": "THÉRÈSE eugène suzanne YVONNE WILLIAM (ESPACE) UN DEUX TROIS (ESPACE) (?) (ESPACE) (=) (ESPACE) (!) (@)" + }, + { + "lang": "(Belgium)", + "input": "TesYW 123 ? = !@", + "output": "TELEFOON emiel sofie YVONNE WATERLOO (ESPACE) (1) (2) (3) (ESPACE) (?) (ESPACE) (=) (ESPACE) (!) (@)" + }, + { + "lang": "(Switzerland)", + "input": "TesYW 123 ? = !@", + "output": "THÉRÈSE émile suzanne (Y) WILLIAM (ESPACE) (1) (2) (3) (ESPACE) (?) (ESPACE) (=) (ESPACE) (!) (@)" + }, + { + "lang": "(Québec)", + "input": "TesYW 123 ? = !@", + "output": "THOMAS édouard samuel (Y) WILLIAM (ESPACE) (1) (2) (3) (ESPACE) (?) (ESPACE) (=) (ESPACE) (!) (@)" + }, + { + "lang": "(Germany, 2022)", + "input": "TesYü 123 ? = !@", + "output": "TÜBINGEN essen salzwedel YPSILON umlaut-unna (LEERZEICHEN) (1) (2) (3) (LEERZEICHEN) (?) (LEERZEICHEN) (=) (LEERZEICHEN) (!) (@)" + }, + { + "lang": "(Austria)", + "input": "TesYW 123 ? = !@", + "output": "THEODOR emil samuel/siegfried YPSILON WILHELM (LEERZEICHEN) (1) (2) (3) (LEERZEICHEN) (?) (LEERZEICHEN) (=) (LEERZEICHEN) (!) (@)" + }, + { + "lang": "(Germany, informal, 2022)", + "input": "TesYü 123 ? = !@", + "output": "THEODOR emil samuel YPSILON überfluss (LEERZEICHEN) (1) (2) (3) (LEERZEICHEN) (?) (LEERZEICHEN) (=) (LEERZEICHEN) (!) (@)" + }, + { + "lang": "(Netherlands)", + "input": "TesY huis rij 123 ? = !@", + "output": "THEODOR eduard simon YPSILON (SPATIE) hendrik utrecht izaak simon (SPATIE) richard/rudolf ijmuiden/ijsbrand (SPATIE) (1) (2) (3) (SPATIE) (?) (SPATIE) (=) (SPATIE) (!) (@)" + }, + { + "lang": "Italian", + "input": "TesYj 123 ? = !@", + "output": "TORINO empoli savona YORK, YOGURT jolly/juventus (SPAZIO) (1) (2) (3) (SPAZIO) (?) (SPAZIO) (=) (SPAZIO) (!) (@)" + }, + { + "lang": "Spanish", + "input": "TesYñj 123 ? = !@", + "output": "TOLEDO españa sábado YOLANDA ñoño josé (ESPACIO) (1) (2) (3) (ESPACIO) (?) (ESPACIO) (=) (ESPACIO) (!) (@)" + }, + { + "lang": "(Brazil)", + "input": "TesYÇj 123 ? = !@", + "output": "TATU estrela saci YOLANDA (Ç) josé (ESPAÇO) (1) (2) (3) (ESPAÇO) (?) (ESPAÇO) (=) (ESPAÇO) (!) (@)" + }, + { + "lang": "(Portugal)", + "input": "TesYúj 123 ? = !@", + "output": "TAVIRA évora setúbal YORK (ú) josé (ESPAÇO) (1) (2) (3) (ESPAÇO) (?) (ESPAÇO) (=) (ESPAÇO) (!) (@)" + }, + { + "lang": "Swedish", + "input": "TesYj 123 ? = !@", + "output": "TORE erik sigurd YNGVE johan (UTRYMME) (1) (2) (3) (UTRYMME) (?) (UTRYMME) (=) (UTRYMME) (!) (@)" + }, + { + "lang": "Danish", + "input": "TesÆYj 123 ? = !@", + "output": "THEODOR erik søren ÆGIR YRSA johan (MELLEMRUMSTEGN) (1) (2) (3) (MELLEMRUMSTEGN) (?) (MELLEMRUMSTEGN) (=) (MELLEMRUMSTEGN) (!) (@)" + }, + { + "lang": "Norwegian", + "input": "TesYÅj 123 ? = !@", + "output": "TEODOR edith sigrid YNGLING ÅSE johan (MELLOMROMSTEGN) (1) (2) (3) (MELLOMROMSTEGN) (?) (MELLOMROMSTEGN) (=) (MELLOMROMSTEGN) (!) (@)" + }, + { + "lang": "Finnish", + "input": "TesYj 123 ? = !@", + "output": "TYYNE eemeli sakari YRJÖ jussi (VÄLILYÖNTI) (1) (2) (3) (VÄLILYÖNTI) (?) (VÄLILYÖNTI) (=) (VÄLILYÖNTI) (!) (@)" + }, + { + "lang": "Turkish", + "input": "TesYj 123 ? = !@", + "output": "TOKAT edirne sinop YOZGAT jandarma (BOŞLUK) (1) (2) (3) (BOŞLUK) (?) (BOŞLUK) (=) (BOŞLUK) (!) (@)" + }, + { + "lang": "Romanian", + "input": "TesYj 123 ? = !@", + "output": "TUDOR elena sandu I-GREC jean (SPAȚIU) (1) (2) (3) (SPAȚIU) (?) (SPAȚIU) (=) (SPAȚIU) (!) (@)" + }, + { + "lang": "Czech", + "input": "TesYj 123 ? = !@", + "output": "TOMÁŠ emil svatopluk YPSILON josef (PROSTOROVÝ) (1) (2) (3) (PROSTOROVÝ) (?) (PROSTOROVÝ) (=) (PROSTOROVÝ) (!) (@)" + }, + { + "lang": "Yugoslav", + "input": "TesYČj 123 ? = !@", + "output": "TUZLA evropa skopje IPSILON ČAČAK jadran (PRIESTOROVÝ) (1) (2) (3) (PRIESTOROVÝ) (?) (PRIESTOROVÝ) (=) (PRIESTOROVÝ) (!) (@)" + }, + { + "lang": "Serbian", + "input": "TesYČj 123 ? = !@", + "output": "TIMOK evropa sava IPSILON ČAČAK jadran (PROSTORNI) (1) (2) (3) (PROSTORNI) (?) (PROSTORNI) (=) (PROSTORNI) (!) (@)" + }, + { + "lang": "Slovene", + "input": "TesYČj 123 ? = !@", + "output": "TRIGLAV evropa soča IPSILON ČATEŽ jadran (PRESLEDKA) (1) (2) (3) (PRESLEDKA) (?) (PRESLEDKA) (=) (PRESLEDKA) (!) (@)" + }, + { + "lang": "Russian", + "input": "Зинаида !.?", + "output": "ЗИНАИДА иван николай анна иван дмитрий анна ( ) (!) (.) (?)" + }, + { + "lang": "Korean", + "input": "안녕하세요 여러분", + "output": "잉어 아버지 나폴리 나폴리 연못 잉어 한강 아버지 서울 엑스레이 잉어 요지경 ( ) 잉어 연못 로마 어머니 바가지 우편 나폴리" + }, + { + "lang": "Greek", + "input": "τίγρης !?", + "output": "τίγρης (ί) γαλή ρήγας ηρώ σοφός ( ) (!) (?)" + }, + { + "lang": "Japanese", + "input": "数字のひと おしまいのン ?:", + "output": "(数) (字) 野原のノ 飛行機のヒ 東京のト ( ) 大阪のオ 新聞のシ マッチのマ いろはのイ 野原のノ おしまいのン ( ) (?) (:)" + } +] \ No newline at end of file diff --git a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.constants.ts b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.constants.ts index c6523d9b..51c198f7 100644 --- a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.constants.ts +++ b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.constants.ts @@ -1,28 +1,29 @@ -export const natoAlphabet = [ - 'Alpha', - 'Bravo', - 'Charlie', - 'Delta', - 'Echo', - 'Foxtrot', - 'Golf', - 'Hotel', - 'India', - 'Juliet', - 'Kilo', - 'Lima', - 'Mike', - 'November', - 'Oscar', - 'Papa', - 'Quebec', - 'Romeo', - 'Sierra', - 'Tango', - 'Uniform', - 'Victor', - 'Whiskey', - 'X-ray', - 'Yankee', - 'Zulu', +export const allLanguagesAndCountries = [ + '(International)', + '(France)', + '(Belgium)', + '(Switzerland)', + '(Québec)', + '(Germany, 2022)', + '(Austria)', + '(Germany, informal, 2022)', + '(Netherlands)', + 'Italian', + 'Spanish', + '(Brazil)', + '(Portugal)', + 'Swedish', + 'Danish', + 'Norwegian', + 'Finnish', + 'Turkish', + 'Romanian', + 'Czech', + 'Yugoslav', + 'Serbian', + 'Slovene', + 'Russian', + 'Korean', + 'Greek', + 'Japanese', ]; diff --git a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.test.ts b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.test.ts new file mode 100644 index 00000000..325f83c2 --- /dev/null +++ b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.test.ts @@ -0,0 +1,160 @@ +import { describe, expect, it } from 'vitest'; +import { textToNatoAlphabet } from './text-to-nato-alphabet.service'; + +const TestCase_TestYW = 'TesYW 123 ? = !@'; +const TestCase_TestYJ = 'TesYj 123 ? = !@'; +const natoTests = [ + { + lang: '(International)', + input: TestCase_TestYW, + output: 'TANGO echo sierra YANKEE WHISKEY (SPACE) (digit 1) (digit 2) (digit 3) (SPACE) (punctuation ?) (SPACE) (punctuation =) (SPACE) (punctuation !) (punctuation @)', + }, + { + lang: '(France)', + input: TestCase_TestYW, + output: 'THÉRÈSE eugène suzanne YVONNE WILLIAM (ESPACE) (digit 1) (digit 2) (digit 3) (ESPACE) (punctuation ?) (ESPACE) (punctuation =) (ESPACE) (punctuation !) (punctuation @)', + }, + { + lang: '(Belgium)', + input: TestCase_TestYW, + output: 'TELEFOON emiel sofie YVONNE WATERLOO (ESPACE) (digit 1) (digit 2) (digit 3) (ESPACE) (punctuation ?) (ESPACE) (punctuation =) (ESPACE) (punctuation !) (punctuation @)', + }, + { + lang: '(Switzerland)', + input: TestCase_TestYW, + output: 'THÉRÈSE émile suzanne (Y) WILLIAM (ESPACE) (digit 1) (digit 2) (digit 3) (ESPACE) (punctuation ?) (ESPACE) (punctuation =) (ESPACE) (punctuation !) (punctuation @)', + }, + { + lang: '(Québec)', + input: TestCase_TestYW, + output: 'THOMAS édouard samuel (Y) WILLIAM (ESPACE) (digit 1) (digit 2) (digit 3) (ESPACE) (punctuation ?) (ESPACE) (punctuation =) (ESPACE) (punctuation !) (punctuation @)', + }, + { + lang: '(Germany, 2022)', + input: 'TesYü 123 ? = !@', + output: 'TÜBINGEN essen salzwedel YPSILON umlaut-unna (LEERZEICHEN) (digit 1) (digit 2) (digit 3) (LEERZEICHEN) (punctuation ?) (LEERZEICHEN) (punctuation =) (LEERZEICHEN) (punctuation !) (punctuation @)', + }, + { + lang: '(Austria)', + input: TestCase_TestYW, + output: 'THEODOR emil samuel/siegfried YPSILON WILHELM (LEERZEICHEN) (digit 1) (digit 2) (digit 3) (LEERZEICHEN) (punctuation ?) (LEERZEICHEN) (punctuation =) (LEERZEICHEN) (punctuation !) (punctuation @)', + }, + { + lang: '(Germany, informal, 2022)', + input: 'TesYü 123 ? = !@', + output: 'THEODOR emil samuel YPSILON überfluss (LEERZEICHEN) (digit 1) (digit 2) (digit 3) (LEERZEICHEN) (punctuation ?) (LEERZEICHEN) (punctuation =) (LEERZEICHEN) (punctuation !) (punctuation @)', + }, + { + lang: '(Netherlands)', + input: 'TesY huis rij 123 ? = !@', + output: 'THEODOR eduard simon YPSILON (SPATIE) hendrik utrecht izaak simon (SPATIE) richard/rudolf ijmuiden/ijsbrand (SPATIE) (digit 1) (digit 2) (digit 3) (SPATIE) (punctuation ?) (SPATIE) (punctuation =) (SPATIE) (punctuation !) (punctuation @)', + }, + { + lang: 'Italian', + input: TestCase_TestYJ, + output: 'TORINO empoli savona YORK, YOGURT jolly/juventus (SPAZIO) (digit 1) (digit 2) (digit 3) (SPAZIO) (punctuation ?) (SPAZIO) (punctuation =) (SPAZIO) (punctuation !) (punctuation @)', + }, + { + lang: 'Spanish', + input: 'TesYñj 123 ? = !@', + output: 'TOLEDO españa sábado YOLANDA ñoño josé (ESPACIO) (digit 1) (digit 2) (digit 3) (ESPACIO) (punctuation ?) (ESPACIO) (punctuation =) (ESPACIO) (punctuation !) (punctuation @)', + }, + { + lang: '(Brazil)', + input: 'TesYÇj 123 ? = !@', + output: 'TATU estrela saci YOLANDA (Ç) josé (ESPAÇO) (digit 1) (digit 2) (digit 3) (ESPAÇO) (punctuation ?) (ESPAÇO) (punctuation =) (ESPAÇO) (punctuation !) (punctuation @)', + }, + { + lang: '(Portugal)', + input: 'TesYúj 123 ? = !@', + output: 'TAVIRA évora setúbal YORK (ú) josé (ESPAÇO) (digit 1) (digit 2) (digit 3) (ESPAÇO) (punctuation ?) (ESPAÇO) (punctuation =) (ESPAÇO) (punctuation !) (punctuation @)', + }, + { + lang: 'Swedish', + input: TestCase_TestYJ, + output: 'TORE erik sigurd YNGVE johan (UTRYMME) (digit 1) (digit 2) (digit 3) (UTRYMME) (punctuation ?) (UTRYMME) (punctuation =) (UTRYMME) (punctuation !) (punctuation @)', + }, + { + lang: 'Danish', + input: 'TesÆYj 123 ? = !@', + output: 'THEODOR erik søren ÆGIR YRSA johan (MELLEMRUMSTEGN) (digit 1) (digit 2) (digit 3) (MELLEMRUMSTEGN) (punctuation ?) (MELLEMRUMSTEGN) (punctuation =) (MELLEMRUMSTEGN) (punctuation !) (punctuation @)', + }, + { + lang: 'Norwegian', + input: 'TesYÅj 123 ? = !@', + output: 'TEODOR edith sigrid YNGLING ÅSE johan (MELLOMROMSTEGN) (digit 1) (digit 2) (digit 3) (MELLOMROMSTEGN) (punctuation ?) (MELLOMROMSTEGN) (punctuation =) (MELLOMROMSTEGN) (punctuation !) (punctuation @)', + }, + { + lang: 'Finnish', + input: TestCase_TestYJ, + output: 'TYYNE eemeli sakari YRJÖ jussi (VÄLILYÖNTI) (digit 1) (digit 2) (digit 3) (VÄLILYÖNTI) (punctuation ?) (VÄLILYÖNTI) (punctuation =) (VÄLILYÖNTI) (punctuation !) (punctuation @)', + }, + { + lang: 'Turkish', + input: TestCase_TestYJ, + output: 'TOKAT edirne sinop YOZGAT jandarma (BOŞLUK) (digit 1) (digit 2) (digit 3) (BOŞLUK) (punctuation ?) (BOŞLUK) (punctuation =) (BOŞLUK) (punctuation !) (punctuation @)', + }, + { + lang: 'Romanian', + input: TestCase_TestYJ, + output: 'TUDOR elena sandu I-GREC jean (SPAȚIU) (digit 1) (digit 2) (digit 3) (SPAȚIU) (punctuation ?) (SPAȚIU) (punctuation =) (SPAȚIU) (punctuation !) (punctuation @)', + }, + { + lang: 'Czech', + input: TestCase_TestYJ, + output: 'TOMÁŠ emil svatopluk YPSILON josef (PROSTOROVÝ) (digit 1) (digit 2) (digit 3) (PROSTOROVÝ) (punctuation ?) (PROSTOROVÝ) (punctuation =) (PROSTOROVÝ) (punctuation !) (punctuation @)', + }, + { + lang: 'Yugoslav', + input: 'TesYČj 123 ? = !@', + output: 'TUZLA evropa skopje IPSILON ČAČAK jadran (PRIESTOROVÝ) (digit 1) (digit 2) (digit 3) (PRIESTOROVÝ) (punctuation ?) (PRIESTOROVÝ) (punctuation =) (PRIESTOROVÝ) (punctuation !) (punctuation @)', + }, + { + lang: 'Serbian', + input: 'TesYČj 123 ? = !@', + output: 'TIMOK evropa sava IPSILON ČAČAK jadran (PROSTORNI) (digit 1) (digit 2) (digit 3) (PROSTORNI) (punctuation ?) (PROSTORNI) (punctuation =) (PROSTORNI) (punctuation !) (punctuation @)', + }, + { + lang: 'Slovene', + input: 'TesYČj 123 ? = !@', + output: 'TRIGLAV evropa soča IPSILON ČATEŽ jadran (PRESLEDKA) (digit 1) (digit 2) (digit 3) (PRESLEDKA) (punctuation ?) (PRESLEDKA) (punctuation =) (PRESLEDKA) (punctuation !) (punctuation @)', + }, + { + lang: 'Russian', + input: 'Зинаида !.?', + output: 'ЗИНАИДА иван николай анна иван дмитрий анна ( ) (punctuation !) (punctuation .) (punctuation ?)', + }, + { + lang: 'Korean', + input: '안녕하세요 여러분', + output: '잉어 아버지 나폴리 나폴리 연못 잉어 한강 아버지 서울 엑스레이 잉어 요지경 ( ) 잉어 연못 로마 어머니 바가지 우편 나폴리', + }, + { + lang: 'Greek', + input: 'τίγρης !?', + output: 'τίγρης (ί) γαλή ρήγας ηρώ σοφός ( ) (punctuation !) (punctuation ?)', + }, + { + lang: 'Japanese', + input: '数字のひと おしまいのン ?:', + output: '(数) (字) 野原のノ 飛行機のヒ 東京のト ( ) 大阪のオ 新聞のシ マッチのマ いろはのイ 野原のノ おしまいのン ( ) (punctuation ?) (punctuation :)', + }, +]; + +describe('text-to-nato', () => { + it('Convert text to NATO', async () => { + for (const nato of natoTests) { + const { lang, input, output } = nato; + expect(textToNatoAlphabet({ text: input, langOrCountry: lang })).to.equal(output); + } + }); + + it('Convert text to NATO (includes punctuations and digits names)', async () => { + expect(textToNatoAlphabet({ text: 'a 1 2 3 ! % ? ;', langOrCountry: '(France)', useDigitsNames: true, usePunctuationsNames: true })).to.equal( + 'anatole (ESPACE) {digit 1 => un} (ESPACE) {digit 2 => deux} (ESPACE) {digit 3 => trois} (ESPACE) {punctuation ! => point d\'exclamation} (ESPACE) {punctuation % => pour cent} (ESPACE) {punctuation ? => point d\'interrogation} (ESPACE) {punctuation ; => point-virgule}'); + expect(textToNatoAlphabet({ text: 'и 1 2 3 ! % ? ;', langOrCountry: 'Russian', useDigitsNames: true, usePunctuationsNames: true })).to.equal( + 'иван ( ) {digit 1 => один (odin)} ( ) {digit 2 => два (dva)} ( ) {digit 3 => три (tri)} ( ) {punctuation ! => восклицательный знак (vosklitsatel\'nyy znak)} ( ) {punctuation % => процент (protsent)} ( ) {punctuation ? => вопросительный знак (voprositel\'nyy znak)} ( ) {punctuation ; => точка с запятой (tochka s zapyatoy)}'); + expect(textToNatoAlphabet({ text: 'TesYj 1 2 3 ! % ? ;', langOrCountry: 'Swedish', useDigitsNames: true, usePunctuationsNames: true })).to.equal( + 'TORE erik sigurd YNGVE johan (UTRYMME) {digit 1 => ett} (UTRYMME) {digit 2 => två} (UTRYMME) {digit 3 => tre} (UTRYMME) {punctuation ! => utropstecken} (UTRYMME) {punctuation % => procent} (UTRYMME) {punctuation ? => frågetecken} (UTRYMME) {punctuation ; => semikolon}'); + }); +}); diff --git a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.ts b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.ts index 80290e83..a07bee66 100644 --- a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.ts +++ b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.service.ts @@ -1,19 +1,80 @@ -import { natoAlphabet } from './text-to-nato-alphabet.constants'; +import hangul from 'korean-unpacker'; +import allAlphabets from './nato.alphabets.json'; + +type AllAlphabetsKeys = keyof typeof allAlphabets[0]; export { textToNatoAlphabet }; -function getLetterPositionInAlphabet({ letter }: { letter: string }) { - return letter.toLowerCase().charCodeAt(0) - 'a'.charCodeAt(0); +function isPunctuation(char: string) { + const punctuations = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'; + return punctuations.includes(char); +} +function isDigit(char: string) { + const digits = '0123456789'; + return digits.includes(char); } -function textToNatoAlphabet({ text }: { text: string }) { - return text - .split('') - .map((character) => { - const alphabetIndex = getLetterPositionInAlphabet({ letter: character }); - const natoWord = natoAlphabet[alphabetIndex]; - - return natoWord ?? character; - }) - .join(' '); +function escapeRegExp(string: string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +function textToNatoAlphabet({ + text, langOrCountry = '(International)', + useDigitsNames = false, usePunctuationsNames = false, +}: { + text: string + langOrCountry: string + useDigitsNames?: boolean + usePunctuationsNames?: boolean +}) { + const getNatoWord = (searchChar: string) => { + const alphabetLetter = allAlphabets.find(letter => letter.Letter === searchChar); + if (alphabetLetter && alphabetLetter[langOrCountry as AllAlphabetsKeys]) { + return alphabetLetter[langOrCountry as AllAlphabetsKeys] || ''; + } + return null; + }; + + const charRegex = new RegExp( + `(${ + allAlphabets + .sort((a, b) => b.Letter.length - a.Letter.length) + .filter(a => a[langOrCountry as AllAlphabetsKeys]) + .map(a => escapeRegExp(a.Letter)) + .join('|') + }|.)`, + 'gi'); + return hangul.unpack(text) + .replace(/\s+/g, ' ') + .replace( + charRegex, + (character) => { + const searchChar = character.toUpperCase(); + const isUpper = character[0].toUpperCase() === character[0]; + const natoWord = getNatoWord(searchChar); + + if (isDigit(searchChar)) { + if (useDigitsNames) { + return ` {digit ${searchChar} => ${natoWord}}`; + } + else { + return ` (digit ${character})`; + } + } + if (isPunctuation(searchChar)) { + if (usePunctuationsNames) { + return ` {punctuation ${searchChar} => ${natoWord}}`; + } + else { + return ` (punctuation ${character})`; + } + } + + if (natoWord) { + return ` ${isUpper ? natoWord.toUpperCase() : natoWord.toLowerCase()}`; + } + + return ` (${character})`; + }) + .trim(); } diff --git a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue index 76abbc49..5e8a0435 100644 --- a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue +++ b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue @@ -1,14 +1,33 @@ + + + + + + + + + + + - Your text in NATO phonetic alphabet + Your text in NATO phonetic alphabet ({{ lang }}) {{ natoText }}