diff options
| author | Walker Thompson <walker.thompson@urz.uni-heidelberg.de> | 2026-06-03 21:29:42 +0200 |
|---|---|---|
| committer | Walker Thompson <walker.thompson@urz.uni-heidelberg.de> | 2026-06-03 21:29:42 +0200 |
| commit | 25b73b9e3afe877b08816a6eaab5c1e95b5cadfd (patch) | |
| tree | 82c1cf1263057e198abed6329ac76d863021e033 | |
Initial commit
| -rw-r--r-- | Makefile | 23 | ||||
| -rw-r--r-- | Makefile.MGW32 | 24 | ||||
| -rw-r--r-- | translit.cpp | 219 | ||||
| -rw-r--r-- | translit.h | 510 |
4 files changed, 776 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..de44e79 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +UNAME = $(shell uname) + +CXX = g++ + +ifneq ($(UNAME), FreeBSD) + WXFLAGS = `wx-config --cxxflags --libs` +endif +ifeq ($(UNAME),FreeBSD) + WXFLAGS:= `wxgtk3u-3.2-config --cxxflags --libs` + CXX:= clang++ +endif +ifeq ($(UNAME), OpenBSD) + CXX:= clang++ +endif + +CXXFLAGS = -std=c++11 -Wall -Wextra + +all: translit + +translit: translit.cpp + $(CXX) $(CXXFLAGS) -o translit translit.cpp $(WXFLAGS) +clean: + rm translit diff --git a/Makefile.MGW32 b/Makefile.MGW32 new file mode 100644 index 0000000..5052028 --- /dev/null +++ b/Makefile.MGW32 @@ -0,0 +1,24 @@ +CXX = x86_64-w64-mingw32-c++ +AR = x86_64-w64-mingw32-ar +CXX_LDD = x86_64-w64-mingw32-ld +LDD = x86_64-w64-mingw32-ld + +WIN32_DLL_DIR = win32_dlls + +MGWLIBS = $(wildcard $(WIN32_DLL_DIR)/libgcc*.dll) $(wildcard $(WIN32_DLL_DIR)/libstd*.dll) + +WXLIBS = $(wildcard $(WIN32_DLL_DIR)/wx*.dll) +WXLDFLAGS = -L. -Wl,-Bdynamic $(addprefix -l, $(basename $(WXLIBS))) + +WXINCLUDES = -Iwxmsw/include/x86_64-w64-mingw32-msw-unicode-3.2 -Iwxmsw/include +WXFLAGS = -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXMSW__ -pthread $(WXINCLUDES) +CXXFLAGS = -static -std=c++11 -lwinpthread -I/usr/lib/gcc/x86_64-w64-mingw32/12-win32/include $(WXFLAGS) + +all: translit +translit: translit.cpp + $(CXX) $(CXXFLAGS) -o translit.exe translit.cpp $(WXLDFLAGS) + mkdir -p release && cp -r translit.exe $(MGWLIBS) $(WXLIBS) release + +.PHONY: clean +clean: + rm -f *.o *.a */*.o */*.a translit.exe release/* diff --git a/translit.cpp b/translit.cpp new file mode 100644 index 0000000..7a54cf3 --- /dev/null +++ b/translit.cpp @@ -0,0 +1,219 @@ +#include "translit.h" + +IMPLEMENT_APP(TranslitGUI) + +bool TranslitGUI::OnInit() +{ + TranslitFrame *translitFrame = new TranslitFrame(); + translitFrame->Show(true); + + return true; +} + +TranslitFrame::TranslitFrame(): + wxFrame(nullptr, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxSize(640,540), + wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER, wxEmptyString) +{ + main_panel = new wxPanel(this, wxID_ANY); + main_sizer = new wxBoxSizer(wxVERTICAL); + + textfield_in = new wxTextCtrl(main_panel, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxSize(640,240), + wxTE_MULTILINE, wxDefaultValidator); + textfield_out = new wxTextCtrl(main_panel, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxSize(640,240), + wxTE_MULTILINE, wxDefaultValidator); + + select_scheme = new wxComboBox(main_panel, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, NULL, + wxCB_READONLY, wxDefaultValidator); + select_scheme->Insert(wxT("ALA-LC (Library of Congress)"), SCHEME_LC); + select_scheme->Insert(wxT("DIN 1460 (German academic)"), SCHEME_DIN); + select_scheme->Insert(wxT("BGN/PCGN (British official)"), SCHEME_PCGN); + select_scheme->Insert(wxT("ISO/R9 (Hybrid 1954/1968, OUP)"), SCHEME_OUP); + select_scheme->Insert(wxT("ISO/R9 (invertible, international)"), SCHEME_ISO); + select_scheme->Insert(wxT("Serbian national/official"), SCHEME_SRB); +#ifdef TRANSLIT_OUP + select_scheme->SetSelection(SCHEME_OUP); +#else + select_scheme->SetSelection(SCHEME_LC); +#endif + select_scheme->Bind(wxEVT_COMBOBOX, &TranslitFrame::set_lang_options, this); + + select_lang = new wxComboBox(main_panel, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, NULL, + wxCB_READONLY, wxDefaultValidator); + select_lang->Insert(wxT("Russian"), LANG_RUS); + select_lang->Insert(wxT("Ukrainian"), LANG_UKR); + select_lang->Insert(wxT("Belarusian"), LANG_BEL); + select_lang->Insert(wxT("Bulgarian"), LANG_BG); + select_lang->Insert(wxT("Historical"), LANG_CS); + select_lang->SetSelection(LANG_RUS); + + select_sizer = new wxBoxSizer(wxHORIZONTAL); + select_sizer->Add(select_scheme, 2, wxEXPAND | wxALL); + select_sizer->Add(select_lang, 2, wxEXPAND | wxALL); + + translit_button = new wxButton(main_panel, wxID_OK, wxT("Run")); + translit_button->Bind(wxEVT_BUTTON, &TranslitFrame::do_translit, this); + + clear_button = new wxButton(main_panel, wxID_CLEAR, wxT("Clear")); + clear_button->Bind(wxEVT_BUTTON, &TranslitFrame::clear_text, this); + + copy_button = new wxButton(main_panel, wxID_COPY, wxT("Copy")); + copy_button->Bind(wxEVT_BUTTON, &TranslitFrame::copy_text, this); + + quit_button = new wxButton(main_panel, wxID_EXIT, wxT("Exit")); + quit_button->Bind(wxEVT_BUTTON, &TranslitFrame::OnExit, this); + + button_sizer = new wxBoxSizer(wxHORIZONTAL); + button_sizer->Add(translit_button, 2, wxEXPAND | wxALL); + button_sizer->Add(quit_button, 2, wxEXPAND | wxALL); + button_sizer->Add(copy_button, 2, wxEXPAND | wxALL); + button_sizer->Add(clear_button, 2, wxEXPAND | wxALL); + + main_sizer->Add(select_sizer, 0, wxEXPAND | wxALL, 5); + main_sizer->Add(textfield_in, 2, wxEXPAND | wxALL, 5); + main_sizer->Add(textfield_out, 2, wxEXPAND | wxALL, 5); + main_sizer->Add(button_sizer, 0, wxEXPAND | wxALL, 2); + + main_panel->SetSizer(main_sizer); +} + +void TranslitFrame::OnExit(wxCommandEvent& WXUNUSED(event)) +{ + Close(true); +} + +void TranslitFrame::set_lang_options(wxCommandEvent& WXUNUSED(event)) +{ + if (select_scheme->GetSelection() == SCHEME_SRB || + select_scheme->GetSelection() == SCHEME_ISO) + select_lang->Enable(false); + else + select_lang->Enable(true); +} + +void TranslitFrame::do_translit(wxCommandEvent& WXUNUSED(event)) +{ + map<wxString, wxString> char_map; + + wxString text_lat; + wxString text_cyr = textfield_in->GetValue(); + + int scheme_selected = select_scheme->GetSelection(); + int lang_selected = select_lang->GetSelection(); + + switch (scheme_selected) { + case SCHEME_LC: + char_map = ala_lc[0]; + char_map.insert(ala_lc[lang_selected + 1].begin(), + ala_lc[lang_selected + 1].end()); + break; + case SCHEME_DIN: + char_map = din_1460[0]; + char_map.insert(din_1460[lang_selected + 1].begin(), + din_1460[lang_selected + 1].end()); + break; + case SCHEME_PCGN: + char_map = bgp_pcgn[0]; + char_map.insert(bgp_pcgn[lang_selected + 1].begin(), + bgp_pcgn[lang_selected + 1].end()); + break; + case SCHEME_OUP: + char_map = iso9_old[0]; + char_map.insert(iso9_old[lang_selected + 1].begin(), + iso9_old[lang_selected + 1].end()); + break; + case SCHEME_ISO: + char_map = iso9_new; + break; + case SCHEME_SRB: + char_map = srb_nat; + break; + } + + text_lat = replace_chars(text_cyr, char_map, + scheme_selected, + lang_selected); + + textfield_out->ChangeValue(text_lat); +} + +void TranslitFrame::clear_text(wxCommandEvent& WXUNUSED(event)) +{ + textfield_out->Clear(); + textfield_in->Clear(); +} + +void TranslitFrame::copy_text(wxCommandEvent& WXUNUSED(event)) +{ + wxString text_to_copy = textfield_out->GetValue(); + if (wxTheClipboard->Open()) + { + wxTheClipboard->SetData(new wxTextDataObject(text_to_copy)); + wxTheClipboard->Close(); + } +} + +wxString TranslitFrame::replace_chars(wxString& text_in, + map<wxString, wxString> char_map, int scheme_type, int lang) +{ + wxString text_out, subst; + wxChar char_curr, char_prev, char_next; + size_t char_no, char_max; + + const static wxRegEx match_vowels(wxT("[АЕЁИЙІОУЮЯЭЬЪѢѴаеёийіоуюяьъѣѵ]+")); + const static wxRegEx match_upper(wxT("[А-ЯЪЬЀ-ЏҐѰѲѴѢѤѦѨѪѬѠ]+")); + + text_out.Clear(); + + char_max = text_in.length(); + for (char_no = 0; char_no < char_max; char_no++) + { + char_curr = text_in[char_no]; + if (char_no > 0) + char_prev = text_in[char_no - 1]; + if (char_no < char_max - 1) + char_next = text_in[char_no + 1]; + + if (scheme_type == SCHEME_PCGN && lang == LANG_RUS) { + if ((char_prev && match_vowels.Matches(char_prev)) || + (char_no == 0 || + char_prev == ' ' || + char_prev == '\n')) { + if (char_curr == L'е' || char_curr == L'ё') { + text_out += L'y' + char_curr; + continue; + } else if (char_curr == L'Е' ) { + if (char_next && match_upper.Matches(char_next)) + text_out += L"YE"; + else text_out += L"Ye"; + continue; + } else if (char_curr == L'Ë') { + if (char_next && match_upper.Matches(char_next)) + text_out += L"YË"; + else text_out += L"Yë"; + continue; + } + } + } + + if (char_map.count(char_curr) > 0) { + subst = char_map.find(char_curr)->second; + + // heuristic for smart detection of capitalization + // TO DO: this doesn't work yet for diacritics + if (char_next && match_upper.Matches(char_next) + && match_upper.Matches(char_curr)) + subst = subst.Upper(); + + text_out += subst; + } else { + text_out += char_curr; + } + } + + return text_out; +} diff --git a/translit.h b/translit.h new file mode 100644 index 0000000..7fd61c0 --- /dev/null +++ b/translit.h @@ -0,0 +1,510 @@ +#include <iostream> +#include <map> +#include <wx/wx.h> +#include <wx/clipbrd.h> +#include <wx/regex.h> + +#define SCHEME_LC 0 +#define SCHEME_DIN 1 +#define SCHEME_PCGN 2 +#define SCHEME_OUP 3 +#define SCHEME_ISO 4 +#define SCHEME_SRB 5 + +#define LANG_RUS 0 +#define LANG_UKR 1 +#define LANG_BEL 2 +#define LANG_BG 3 +#define LANG_CS 4 +#define LANG_SRB 5 + +using namespace std; + +class TranslitGUI: public wxApp { + public: + virtual bool OnInit(); +}; + +class TranslitFrame: public wxFrame { + public: + TranslitFrame(); + + private: + wxPanel *main_panel; + wxBoxSizer *main_sizer; + wxBoxSizer *select_sizer; + wxBoxSizer *button_sizer; + + wxComboBox *select_scheme; + wxComboBox *select_lang; + wxTextCtrl *textfield_in; + wxTextCtrl *textfield_out; + + void set_lang_options(wxCommandEvent& event); + wxButton *translit_button; + void do_translit(wxCommandEvent& event); + wxButton *quit_button; + wxButton *copy_button; + void copy_text(wxCommandEvent& event); + wxButton *clear_button; + void clear_text(wxCommandEvent& event); + void OnExit(wxCommandEvent& event); + + wxString replace_chars(wxString& text, + map<wxString, wxString> char_map, + int schema, int lang); +}; + +vector <map<wxString, wxString>> ala_lc = { + // common + { + // uppercase + {L"А", L"A"}, {L"Б", L"B"}, {L"В", L"V"}, + {L"Д", L"D"}, {L"Е", L"E"}, {L"Ж", L"Zh"}, + {L"З", L"Z"}, {L"І", L"I"}, {L"Й", L"I"}, + {L"К", L"K"}, {L"Л", L"L"}, {L"М", L"M"}, + {L"Н", L"N"}, {L"О", L"O"}, {L"П", L"P"}, + {L"Р", L"R"}, {L"С", L"S"}, {L"Т", L"T"}, + {L"У", L"U"}, {L"Ф", L"F"}, {L"Х", L"Kh"}, + {L"Ц", L"Ts"}, {L"Ч", L"Ch"}, {L"Ш", L"Sh"}, + {L"Ю", L"Iu"}, {L"Я", L"Ia"}, + // lowercase + {L"а", L"a"}, {L"б", L"b"}, {L"в", L"v"}, + {L"д", L"d"}, {L"е", L"e"}, {L"ж", L"zh"}, + {L"з", L"z"}, {L"і", L"i"}, {L"й", L"i"}, + {L"к", L"k"}, {L"л", L"l"}, {L"м", L"m"}, + {L"н", L"n"}, {L"о", L"o"}, {L"п", L"p"}, + {L"р", L"r"}, {L"с", L"s"}, {L"т", L"t"}, + {L"у", L"u"}, {L"ф", L"f"}, {L"х", L"kh"}, + {L"ц", L"ts"}, {L"ч", L"ch"}, {L"ш", L"sh"}, + {L"ю", L"iu"}, {L"я", L"ia"} + }, + // Russian + { + // uppercase + {L"Г", L"G"}, {L"Ё", L"E"}, {L"И", L"I"}, + {L"Ы", L"Y"}, {L"Щ", L"Shch"}, {L"Э", L"E"}, + {L"Ѵ", L"I"}, {L"Ѳ", L"F"}, {L"Ѣ", L"E"}, + // lowercase + {L"г", L"g"}, {L"ё", L"e"}, {L"и", L"i"}, + {L"ы", L"y"}, {L"щ", L"shch"}, {L"э", L"e"}, + {L"ѵ", L"i"}, {L"ѳ", L"f"}, {L"ѣ", L"e"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Ukrainian + { + // uppercase + {L"Г", L"H"}, {L"Ґ", L"G"}, {L"И", L"Y"}, + {L"Щ", L"Shch"}, {L"Є", L"Ie"}, {L"Ї", L"I"}, + // lowercase + {L"г", L"h"}, {L"ґ", L"g"}, {L"и", L"y"}, + {L"щ", L"shch"}, {L"Є", L"ie"}, {L"Ї", L"i"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Belarusian + { + // uppercase + {L"Г", L"H"}, {L"Ё", L"E"}, {L"Ы", L"Y"}, + {L"Щ", L"Shch"}, {L"Ў", L"Ŭ"}, {L"Э", L"E"}, + // lowercase + {L"г", L"h"}, {L"ё", L"e"}, {L"ы", L"y"}, + {L"щ", L"shch"}, {L"ў", L"ŭ"}, {L"э", L"e"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Bulgarian + { + // uppercase + {L"Г", L"G"}, {L"Щ", L"Sht"}, + {L"Ѫ", L"Â"}, {L"Ъ", L"Â"}, + // lowercase + {L"г", L"g"}, {L"щ", L"sht"}, + {L"ѫ", L"â"}, {L"ъ", L"â"} + }, + // (Old) Church Slavonic + { + // uppercase + {L"Щ", L"Shch"}, {L"Ѵ", L"I"}, {L"Ѳ", L"Th"}, + {L"Ѣ", L"E"}, {L"Ѧ", L"Ę"}, {L"Ѫ", L"Ǫ"}, + {L"Ѩ", L"Ię"}, {L"Ѭ", L"Iǫ"}, {L"Ѿ", L"Ot"}, + {L"Ѡ", L"O"}, {L"Ї", L"Ï"}, {L"Є", L"Ie"}, + {L"Ѕ", L"Dz"}, {L"Ѥ", L"Ie"}, {L"Ѱ", L"Ps"}, + {L"Ѯ", L"Ks"}, {L"Ґ", L"G"}, {L"Ꙋ", L"Ou"}, + {L"Ѹ", L"Ou"}, {L"Ѷ", L"I"}, + // lowercase + {L"щ", L"shch"}, {L"ѵ", L"i"}, {L"ѳ", L"th"}, + {L"ѣ", L"e"}, {L"ѧ", L"ę"}, {L"ѫ", L"ǫ"}, + {L"ѩ", L"ię"}, {L"ѭ", L"iǫ"}, {L"ѿ", L"ot"}, + {L"ѡ", L"o"}, {L"ї", L"ï"}, {L"є", L"ie"}, + {L"ѕ", L"dz"}, {L"ѥ", L"ie"}, {L"ѱ", L"ps"}, + {L"ѯ", L"ks"}, {L"ґ", L"g"}, {L"ꙋ", L"ou"}, + {L"ѹ", L"ou"}, {L"ѷ", L"i"} + // yers are not transliterated + } +}; + +vector <map<wxString, wxString>> din_1460 = { + // common + { + // uppercase + {L"А", L"A"}, {L"Б", L"B"}, {L"В", L"V"}, + {L"Д", L"D"}, {L"Е", L"E"}, {L"Ж", L"Ž"}, + {L"З", L"Z"}, {L"І", L"I"}, {L"Й", L"J"}, + {L"К", L"K"}, {L"Л", L"L"}, {L"М", L"M"}, + {L"Н", L"N"}, {L"О", L"O"}, {L"П", L"P"}, + {L"Р", L"R"}, {L"С", L"S"}, {L"Т", L"T"}, + {L"У", L"U"}, {L"Ф", L"F"}, {L"Х", L"Ch"}, + {L"Ц", L"C"}, {L"Ч", L"Č"}, {L"Ш", L"Š"}, + {L"Ю", L"Ju"}, {L"Я", L"Ja"}, {L"Ћ", L"Ǵ"}, + // lowercase + {L"а", L"a"}, {L"б", L"b"}, {L"в", L"v"}, + {L"д", L"d"}, {L"е", L"e"}, {L"ж", L"ž"}, + {L"з", L"z"}, {L"і", L"i"}, {L"й", L"j"}, + {L"к", L"k"}, {L"л", L"l"}, {L"м", L"m"}, + {L"н", L"n"}, {L"о", L"o"}, {L"п", L"p"}, + {L"р", L"r"}, {L"с", L"s"}, {L"т", L"t"}, + {L"у", L"u"}, {L"ф", L"f"}, {L"х", L"ch"}, + {L"ц", L"c"}, {L"ч", L"č"}, {L"ш", L"š"}, + {L"ю", L"ju"}, {L"я", L"ja"}, {L"ћ", L"ǵ"} + }, + // Russian + { + // uppercase + {L"Г", L"G"}, {L"Ё", L"Ë"}, {L"И", L"I"}, + {L"Ы", L"Y"}, {L"Щ", L"Šč"}, {L"Э", L"Ė"}, + {L"Ѵ", L"Ẏ"}, {L"Ѳ", L"Ḟ"}, {L"Ѣ", L"Ě"}, + // lowercase + {L"г", L"g"}, {L"ё", L"ë"}, {L"и", L"i"}, + {L"ы", L"y"}, {L"щ", L"šč"}, {L"э", L"ė"}, + {L"ѵ", L"ẏ"}, {L"ѳ", L"ḟ"}, {L"ѣ", L"ě"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Ukrainian + { + // uppercase + {L"Г", L"H"}, {L"Ґ", L"G"}, {L"И", L"Y"}, + {L"Щ", L"Šč"}, {L"Є", L"Je"}, {L"Ї", L"Ï"}, + // lowercase + {L"г", L"h"}, {L"ґ", L"g"}, {L"и", L"y"}, + {L"щ", L"šč"}, {L"Є", L"je"}, {L"Ї", L"ï"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Belarusian + { + // uppercase + {L"Г", L"H"}, {L"Ё", L"E"}, {L"Ы", L"Y"}, + {L"Щ", L"Šč"}, {L"Ў", L"Ŭ"}, {L"Э", L"Ė"}, + // lowercase + {L"г", L"h"}, {L"ё", L"e"}, {L"ы", L"y"}, + {L"щ", L"šč"}, {L"ў", L"ŭ"}, {L"э", L"ė"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Bulgarian + { + // uppercase + {L"Г", L"G"}, {L"Щ", L"Št"}, + {L"Ѫ", L"Ȧ"}, {L"Ъ", L"Ȧ"}, + // lowercase + {L"г", L"g"}, {L"щ", L"št"}, + {L"ѫ", L"ȧ"}, {L"ъ", L"ȧ"} + }, + // (Old) Church Slavonic + { + // uppercase + {L"Щ", L"Šč"}, {L"Ѵ", L"I"}, {L"Ѳ", L"Ḟ"}, + {L"Ѣ", L"Ě"}, {L"Ѧ", L"Ę"}, {L"Ѫ", L"Ǫ"}, + {L"Ѩ", L"ję"}, {L"Ѭ", L"jǫ"}, {L"Ѿ", L"Ot"}, + {L"Ѡ", L"Ô"}, {L"Ї", L"Ï"}, {L"Є", L"Ie"}, + {L"Ѕ", L"Dz"}, {L"Ѥ", L"Je"}, {L"Ѱ", L"Ps"}, + {L"Ѯ", L"Ks"}, {L"Ґ", L"G"}, {L"Ꙋ", L"Ou"}, + {L"Ѹ", L"Ou"}, {L"Ѷ", L"I"}, + // lowercase + {L"щ", L"šč"}, {L"ѵ", L"i"}, {L"ѳ", L"ḟ"}, + {L"ѣ", L"e"}, {L"ѧ", L"ę"}, {L"ѫ", L"ǫ"}, + {L"ѩ", L"ię"}, {L"ѭ", L"jǫ"}, {L"ѿ", L"ot"}, + {L"ѡ", L"ô"}, {L"ї", L"ï"}, {L"є", L"ie"}, + {L"ѕ", L"dz"}, {L"ѥ", L"je"}, {L"ѱ", L"ps"}, + {L"ѯ", L"ks"}, {L"ґ", L"g"}, {L"ꙋ", L"ou"}, + {L"ѹ", L"ou"}, {L"ѷ", L"ẏ"} + // yers are not transliterated + } +}; + + +vector <map<wxString, wxString>> bgp_pcgn = { + // common + { + // uppercase + {L"А", L"A"}, {L"Б", L"B"}, {L"В", L"V"}, + {L"Д", L"D"}, {L"Е", L"E"}, {L"Ж", L"Zh"}, + {L"З", L"Z"}, {L"І", L"I"}, {L"Й", L"Y"}, + {L"К", L"K"}, {L"Л", L"L"}, {L"М", L"M"}, + {L"Н", L"N"}, {L"О", L"O"}, {L"П", L"P"}, + {L"Р", L"R"}, {L"С", L"S"}, {L"Т", L"T"}, + {L"У", L"U"}, {L"Ф", L"F"}, {L"Х", L"Kh"}, + {L"Ц", L"Ts"}, {L"Ч", L"Ch"}, {L"Ш", L"Sh"}, + {L"Ю", L"Yu"}, {L"Я", L"Ya"}, + // lowercase + {L"а", L"a"}, {L"б", L"b"}, {L"в", L"v"}, + {L"д", L"d"}, {L"е", L"e"}, {L"ж", L"zh"}, + {L"з", L"z"}, {L"і", L"i"}, {L"й", L"y"}, + {L"к", L"k"}, {L"л", L"l"}, {L"м", L"m"}, + {L"н", L"n"}, {L"о", L"o"}, {L"п", L"p"}, + {L"р", L"r"}, {L"с", L"s"}, {L"т", L"t"}, + {L"у", L"u"}, {L"ф", L"f"}, {L"х", L"kh"}, + {L"ц", L"ts"}, {L"ч", L"ch"}, {L"ш", L"sh"}, + {L"ю", L"yu"}, {L"я", L"ya"} + }, + // Russian + { + // uppercase + {L"Г", L"G"}, {L"Ё", L"E"}, {L"И", L"I"}, + {L"Ы", L"Y"}, {L"Щ", L"Shch"}, {L"Э", L"E"}, + {L"Ѵ", L"I"}, {L"Ѳ", L"F"}, {L"Ѣ", L"E"}, + // lowercase + {L"г", L"g"}, {L"ё", L"e"}, {L"и", L"i"}, + {L"ы", L"y"}, {L"щ", L"shch"}, {L"э", L"e"}, + {L"ѵ", L"i"}, {L"ѳ", L"f"}, {L"ѣ", L"e"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Ukrainian + { + // uppercase + {L"Г", L"H"}, {L"Ґ", L"G"}, {L"И", L"Y"}, + {L"Щ", L"Shch"}, {L"Є", L"Ye"}, {L"Ї", L"Yi"}, + // lowercase + {L"г", L"h"}, {L"ґ", L"g"}, {L"и", L"y"}, + {L"щ", L"shch"}, {L"Є", L"ye"}, {L"Ї", L"yi"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Belarusian + { + // uppercase + {L"Г", L"H"}, {L"Ё", L"E"}, {L"Ы", L"Y"}, + {L"Щ", L"Shch"}, {L"Ў", L"Ŭ"}, {L"Э", L"E"}, + // lowercase + {L"г", L"h"}, {L"ё", L"e"}, {L"ы", L"y"}, + {L"щ", L"shch"}, {L"ў", L"ŭ"}, {L"э", L"e"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Bulgarian + { + // uppercase + {L"Г", L"G"}, {L"Щ", L"Sht"}, + {L"Ѫ", L"Â"}, {L"Ъ", L"Â"}, + // lowercase + {L"г", L"g"}, {L"щ", L"sht"}, + {L"ѫ", L"â"}, {L"ъ", L"â"} + }, + // (Old) Church Slavonic + { + // uppercase + {L"Щ", L"Shch"}, {L"Ѵ", L"I"}, {L"Ѳ", L"Th"}, + {L"Ѣ", L"E"}, {L"Ѧ", L"Ę"}, {L"Ѫ", L"Ǫ"}, + {L"Ѩ", L"Yę"}, {L"Ѭ", L"Yǫ"}, {L"Ѿ", L"Ot"}, + {L"Ѡ", L"O"}, {L"Ї", L"Yi"}, {L"Є", L"Ye"}, + {L"Ѕ", L"Dz"}, {L"Ѥ", L"Ye"}, {L"Ѱ", L"Ps"}, + {L"Ѯ", L"Ks"}, {L"Ґ", L"G"}, {L"Ꙋ", L"Ou"}, + {L"Ѹ", L"Ou"}, {L"Ѷ", L"I"}, + // lowercase + {L"щ", L"shch"}, {L"ѵ", L"i"}, {L"ѳ", L"th"}, + {L"ѣ", L"e"}, {L"ѧ", L"ę"}, {L"ѫ", L"ǫ"}, + {L"ѩ", L"yę"}, {L"ѭ", L"yǫ"}, {L"ѿ", L"ot"}, + {L"ѡ", L"o"}, {L"ї", L"yi"}, {L"є", L"ye"}, + {L"ѕ", L"dz"}, {L"ѥ", L"ye"}, {L"ѱ", L"ps"}, + {L"ѯ", L"ks"}, {L"ґ", L"g"}, {L"ꙋ", L"ou"}, + {L"ѹ", L"ou"}, {L"ѷ", L"i"} + // yers are not transliterated + } +}; + +vector <map<wxString, wxString>> iso9_old = { + // common + { + // uppercase + {L"А", L"A"}, {L"Б", L"B"}, {L"В", L"V"}, + {L"Д", L"D"}, {L"Е", L"E"}, {L"Ж", L"Ž"}, + {L"З", L"Z"}, {L"І", L"I"}, {L"Й", L"J"}, + {L"К", L"K"}, {L"Л", L"L"}, {L"М", L"M"}, + {L"Н", L"N"}, {L"О", L"O"}, {L"П", L"P"}, + {L"Р", L"R"}, {L"С", L"S"}, {L"Т", L"T"}, + {L"У", L"U"}, {L"Ф", L"F"}, {L"Х", L"X"}, + {L"Ц", L"C"}, {L"Ч", L"Č"}, {L"Ш", L"Š"}, + {L"Ю", L"Ju"}, {L"Я", L"Ja"}, + // lowercase + {L"а", L"a"}, {L"б", L"b"}, {L"в", L"v"}, + {L"д", L"d"}, {L"е", L"e"}, {L"ж", L"ž"}, + {L"з", L"z"}, {L"і", L"i"}, {L"й", L"j"}, + {L"к", L"k"}, {L"л", L"l"}, {L"м", L"m"}, + {L"н", L"n"}, {L"о", L"o"}, {L"п", L"p"}, + {L"р", L"r"}, {L"с", L"s"}, {L"т", L"t"}, + {L"у", L"u"}, {L"ф", L"f"}, {L"х", L"x"}, + {L"ц", L"c"}, {L"ч", L"č"}, {L"ш", L"š"}, + {L"ю", L"ju"}, {L"я", L"ja"} + }, + // Russian + { + // uppercase + {L"Г", L"G"}, {L"Ё", L"Ë"}, {L"И", L"I"}, + {L"Ы", L"Y"}, {L"Щ", L"Šč"}, {L"Э", L"Ė"}, + {L"Ѵ", L"Ü"}, {L"Ѳ", L"Ḟ"}, {L"Ѣ", L"Ě"}, + // lowercase + {L"г", L"g"}, {L"ё", L"ë"}, {L"и", L"i"}, + {L"ы", L"y"}, {L"щ", L"šč"}, {L"э", L"ė"}, + {L"ѵ", L"ü"}, {L"ѳ", L"ḟ"}, {L"ѣ", L"ě"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Ukrainian + { + // uppercase + {L"Г", L"H"}, {L"Ґ", L"G"}, {L"И", L"Y"}, + {L"Щ", L"Šč"}, {L"Є", L"Je"}, {L"Ї", L"Ï"}, + // lowercase + {L"г", L"h"}, {L"ґ", L"g"}, {L"и", L"y"}, + {L"щ", L"šč"}, {L"Є", L"je"}, {L"Ї", L"ï"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Belarusian + { + // uppercase + {L"Г", L"H"}, {L"Ё", L"E"}, {L"Ы", L"Y"}, + {L"Щ", L"Šč"}, {L"Ў", L"Ŭ"}, {L"Э", L"Ė"}, + // lowercase + {L"г", L"h"}, {L"ё", L"e"}, {L"ы", L"y"}, + {L"щ", L"šč"}, {L"ў", L"ŭ"}, {L"э", L"ė"}, + // yers + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"} + }, + // Bulgarian + { + // uppercase + {L"Г", L"G"}, {L"Щ", L"Št"}, + {L"Ѫ", L"Ȧ"}, {L"Ъ", L"Ȧ"}, + // lowercase + {L"г", L"g"}, {L"щ", L"št"}, + {L"ѫ", L"ȧ"}, {L"ъ", L"ȧ"} + }, + // (Old) Church Slavonic + { + // uppercase + {L"Щ", L"Šč"}, {L"Ѵ", L"I"}, {L"Ѳ", L"Ḟ"}, + {L"Ѣ", L"Ě"}, {L"Ѧ", L"Ę"}, {L"Ѫ", L"Ǫ"}, + {L"Ѩ", L"ję"}, {L"Ѭ", L"jǫ"}, {L"Ѿ", L"Ot"}, + {L"Ѡ", L"Ô"}, {L"Ї", L"Ï"}, {L"Є", L"Ie"}, + {L"Ѕ", L"Dz"}, {L"Ѥ", L"Je"}, {L"Ѱ", L"Ps"}, + {L"Ѯ", L"Ks"}, {L"Ґ", L"G"}, {L"Ꙋ", L"Ou"}, + {L"Ѹ", L"Ou"}, {L"Ѷ", L"I"}, + // lowercase + {L"щ", L"šč"}, {L"ѵ", L"i"}, {L"ѳ", L"ḟ"}, + {L"ѣ", L"e"}, {L"ѧ", L"ę"}, {L"ѫ", L"ǫ"}, + {L"ѩ", L"ię"}, {L"ѭ", L"jǫ"}, {L"ѿ", L"ot"}, + {L"ѡ", L"ô"}, {L"ї", L"ï"}, {L"є", L"ie"}, + {L"ѕ", L"dz"}, {L"ѥ", L"je"}, {L"ѱ", L"ps"}, + {L"ѯ", L"ks"}, {L"ґ", L"g"}, {L"ꙋ", L"ou"}, + {L"ѹ", L"ou"}, {L"ѷ", L"ẏ"} + // yers are not transliterated + } +}; + +map<wxString, wxString> iso9_new = { + {L"А", L"A"}, {L"а", L"a"}, + {L"Б", L"B"}, {L"б", L"b"}, + {L"В", L"V"}, {L"в", L"v"}, + {L"Г", L"G"}, {L"г", L"g"}, + {L"Ґ", L"G̀"}, {L"ґ", L"g̀"}, + {L"Д", L"D"}, {L"д", L"d"}, + {L"Ѓ", L"Ǵ"}, {L"ѓ", L"ǵ"}, + {L"Ђ", L"Đ"}, {L"ђ", L"đ"}, + {L"Е", L"E"}, {L"е", L"e"}, + {L"Ё", L"Ë"}, {L"ё", L"ë"}, + {L"Є", L"Ê"}, {L"є", L"ê"}, + {L"Ж", L"Ž"}, {L"ж", L"ž"}, + {L"З", L"Z"}, {L"з", L"z"}, + {L"Ѕ", L"Ẑ"}, {L"ѕ", L"ẑ"}, + {L"И", L"I"}, {L"и", L"i"}, + {L"I", L"Ì"}, {L"і", L"ì"}, + {L"Ї", L"Ï"}, {L"ї", L"ï"}, + {L"Й", L"J"}, {L"й", L"j"}, + {L"Ј", L"J̌"}, {L"ј", L"ǰ"}, + {L"К", L"K"}, {L"к", L"k"}, + {L"Л", L"L"}, {L"л", L"l"}, + {L"Љ", L"L̂"}, {L"љ", L"l̂"}, + {L"М", L"M"}, {L"м", L"m"}, + {L"Н", L"N"}, {L"н", L"n"}, + {L"\u040a", L"N̂"}, {L"њ", L"n"}, + {L"О", L"O"}, {L"о", L"o"}, + {L"П", L"P"}, {L"п", L"p"}, + {L"Р", L"R"}, {L"р", L"r"}, + {L"С", L"S"}, {L"с", L"s"}, + {L"Т", L"T"}, {L"т", L"t"}, + {L"Ќ", L"Ḱ"}, {L"ќ", L"ḱ"}, + {L"Ћ", L"Ć"}, {L"ћ", L"ć"}, + {L"У", L"U"}, {L"у", L"u"}, + {L"Ў", L"Ŭ"}, {L"ў", L"ŭ"}, + {L"Ф", L"F"}, {L"ф", L"f"}, + {L"Х", L"H"}, {L"х", L"h"}, + {L"Ц", L"C"}, {L"ц", L"c"}, + {L"Ч", L"Č"}, {L"ч", L"č"}, + {L"Џ", L"D̂"}, {L"џ", L"d̂"}, + {L"Ш", L"Š"}, {L"ш", L"š"}, + {L"Щ", L"Ŝ"}, {L"щ", L"ŝ"}, + {L"Ъ", L"ʺ"}, {L"ъ", L"ʺ"}, + {L"Ы", L"Y"}, {L"ы", L"y"}, + {L"Ь", L"ʹ"}, {L"ь", L"ʹ"}, + {L"Ѣ", L"Ě"}, {L"ѣ", L"ě"}, + {L"Э", L"È"}, {L"э", L"è"}, + {L"Ю", L"Û"}, {L"ю", L"û"}, + {L"Я", L"Â"}, {L"я", L"â"}, + {L"Ѫ", L"Ǎ"}, {L"ѫ", L"ǎ"}, + {L"Ѳ", L"F̀"}, {L"ѳ", L"f̀"}, + {L"Ѵ", L"Ỳ"}, {L"ѵ", L"ỳ"} +}; + +map<wxString, wxString> srb_nat = { + // uppercase + {L"А", L"A"}, {L"Б", L"B"}, {L"В", L"V"}, + {L"Г", L"G"}, {L"Д", L"D"}, {L"Ђ", L"Đ"}, + {L"Е", L"E"}, {L"Ж", L"Ž"}, {L"З", L"Z"}, + {L"И", L"I"}, {L"Ј", L"J"}, {L"К", L"K"}, + {L"Л", L"L"}, {L"М", L"M"}, {L"Н", L"N"}, + {L"\u0409", L"Lj"}, {L"\u040a", L"Nj"}, + {L"О", L"O"}, {L"П", L"P"}, {L"Р", L"R"}, + {L"С", L"S"}, {L"Т", L"T"}, {L"Ћ", L"Ć"}, + {L"У", L"U"}, {L"Ф", L"F"}, {L"Х", L"H"}, + {L"Ц", L"C"}, {L"Ч", L"Č"}, + {L"Џ", L"Dž"}, {L"Ш", L"Š"}, + // lowercase + {L"а", L"a"}, {L"б", L"b"}, {L"в", L"v"}, + {L"г", L"g"}, {L"д", L"d"}, {L"ђ", L"đ"}, + {L"е", L"e"}, {L"ж", L"ž"}, {L"з", L"z"}, + {L"и", L"i"}, {L"ј", L"j"}, {L"к", L"k"}, + {L"л", L"l"}, {L"м", L"m"}, {L"н", L"n"}, + {L"\u0459", L"lj"}, {L"\u045a", L"nj"}, + {L"о", L"o"}, {L"п", L"p"}, {L"р", L"r"}, + {L"с", L"s"}, {L"т", L"t"}, {L"ћ", L"ć"}, + {L"у", L"u"}, {L"ф", L"f"}, {L"х", L"h"}, + {L"ц", L"c"}, {L"ч", L"č"}, + {L"џ", L"dž"}, {L"ш", L"š"} +}; |
