summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWalker Thompson <walker.thompson@urz.uni-heidelberg.de>2026-06-03 21:29:42 +0200
committerWalker Thompson <walker.thompson@urz.uni-heidelberg.de>2026-06-03 21:29:42 +0200
commit25b73b9e3afe877b08816a6eaab5c1e95b5cadfd (patch)
tree82c1cf1263057e198abed6329ac76d863021e033
Initial commit
-rw-r--r--Makefile23
-rw-r--r--Makefile.MGW3224
-rw-r--r--translit.cpp219
-rw-r--r--translit.h510
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"š"}
+};