From e43a5a0ef0c55586e5cd7bbffe0230ca95622488 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Fri, 2 Apr 2021 11:37:55 +0200 Subject: [PATCH] Add support for ZRCola Composed to Unicode transliteration The initial support compares characters in ZRCola font Private-Use-Area to the characters obtained using Unicode combining characters. Those which match sufficiently are arranged into a new transliteration. As the ZRCola Composed to Unicode transliteration requires to be applied _after_ ZRCola composition but UI applies additional transliterations _before_ ZRCola composition, the ZRCola composition was reintroduced as one of the transliterations. This allows configuring a custom transliteration sequence. Signed-off-by: Simon Rozman --- ZRColaCompile/dbsource.cpp | 45 ++++ ZRColaCompile/dbsource.h | 30 ++- ZRColaCompile/main.cpp | 290 ++++++++++++++++++++++- ZRColaCompile/pch.h | 3 + lib/WinStd | 2 +- lib/libZRCola/include/zrcola/translate.h | 9 +- output/data/ZRCola.zrcdb | Bin 3746078 -> 3786970 bytes output/locale/ZRCola-zrcdb.pot | 9 + output/locale/de_DE/ZRCola-zrcdb.po | 18 +- output/locale/ru_RU/ZRCola-zrcdb.po | 22 +- output/locale/sl_SI/ZRCola-zrcdb.po | 19 +- 11 files changed, 416 insertions(+), 31 deletions(-) diff --git a/ZRColaCompile/dbsource.cpp b/ZRColaCompile/dbsource.cpp index 1fb3277..e0a5691 100644 --- a/ZRColaCompile/dbsource.cpp +++ b/ZRColaCompile/dbsource.cpp @@ -729,6 +729,27 @@ bool ZRCola::DBSource::GetNormPerm(const winstd::com_obj& rs, std: } +bool ZRCola::DBSource::SelectAllTranslations(com_obj &rs) const +{ + // Create a new recordset. + rs.free(); + wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false); + + // Open it. + if (FAILED(rs->Open(variant( + L"SELECT [komb], [rang_komb], [Kano], [Kanoniziraj], [znak], [rang_znak] " + L"FROM [VRS_ReplChar] " + L"ORDER BY [rang_komb], LEN([komb]) DESC"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) + { + _ftprintf(stderr, wxT("%s: error ZCC0040: Error loading translations from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); + LogErrors(); + return false; + } + + return true; +} + + bool ZRCola::DBSource::SelectTranslations(com_obj &rs) const { // Create a new recordset. @@ -1239,6 +1260,30 @@ bool ZRCola::DBSource::SelectCharacters(com_obj& rs) const } +bool ZRCola::DBSource::SelectPUACharacters(com_obj& rs) const +{ + // Create a new recordset. + rs.free(); + wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false); + + // Open it. + if (FAILED(rs->Open(variant( + L"SELECT [znak], [opis_en], [kat], [znak_v], [znak_m] " + L"FROM [VRS_CharList] " + L"WHERE " + L"[znak]>='E000' AND [znak]<='F8FF' AND " // Private-Use-Area + L"[aktiven]=1 " // Active characters only + L"ORDER BY [znak]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) + { + _ftprintf(stderr, wxT("%s: error ZCC0120: Error loading characters from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); + LogErrors(); + return false; + } + + return true; +} + + bool ZRCola::DBSource::GetCharacter(const com_obj& rs, character& chr) const { wxASSERT_MSG(rs, wxT("recordset is empty")); diff --git a/ZRColaCompile/dbsource.h b/ZRColaCompile/dbsource.h index a4c0845..c83b3ab 100644 --- a/ZRColaCompile/dbsource.h +++ b/ZRColaCompile/dbsource.h @@ -132,7 +132,7 @@ namespace ZRCola { std::string norm; ///< Normalization footprint charseq dst; ///< Destination sequence - inline translation() : set(0) {} + inline translation() : set((int)ZRCOLA_TRANSEQID_DEFAULT) {} }; @@ -145,7 +145,7 @@ namespace ZRCola { std::wstring src; ///< Source name std::wstring dst; ///< Destination name - inline transet() : set(0) {} + inline transet() : set((int)ZRCOLA_TRANSEQID_DEFAULT) {} }; @@ -621,6 +621,17 @@ namespace ZRCola { /// bool GetNormPerm(const winstd::com_obj& rs, std::string& norm, normperm& np) const; + /// + /// Returns all character translations + /// + /// \param[out] rs Recordset with results + /// + /// \returns + /// - true when query succeeds + /// - false otherwise + /// + bool SelectAllTranslations(winstd::com_obj& rs) const; + /// /// Returns character translations /// @@ -805,6 +816,17 @@ namespace ZRCola { /// bool SelectCharacters(winstd::com_obj& rs) const; + /// + /// Returns Private-Use-Area characters + /// + /// \param[out] rs Recordset with results + /// + /// \returns + /// - true when query succeeds + /// - false otherwise + /// + bool SelectPUACharacters(winstd::com_obj& rs) const; + /// /// Returns character data /// @@ -908,7 +930,7 @@ namespace ZRCola { inline ZRCola::translation_db& operator<<(_Inout_ ZRCola::translation_db &db, _In_ const ZRCola::DBSource::translation &rec) { unsigned __int32 idx = db.data.size(); - wxASSERT_MSG((int)0xffff8000 <= rec.set && rec.set <= (int)0x00007fff, wxT("translation set id out of bounds")); + wxASSERT_MSG((int)0xffff0000 <= rec.set && rec.set <= (int)0x0000ffff, wxT("translation set id out of bounds")); db.data.push_back((unsigned __int16)rec.set); wxASSERT_MSG((int)0xffff8000 <= rec.dst.rank && rec.dst.rank <= (int)0x00007fff, wxT("destination character rank out of bounds")); db.data.push_back((unsigned __int16)rec.dst.rank); @@ -932,7 +954,7 @@ inline ZRCola::translation_db& operator<<(_Inout_ ZRCola::translation_db &db, _I inline ZRCola::transet_db& operator<<(_Inout_ ZRCola::transet_db &db, _In_ const ZRCola::DBSource::transet &rec) { unsigned __int32 idx = db.data.size(); - wxASSERT_MSG((int)0xffff8000 <= rec.set && rec.set <= (int)0x00007fff, wxT("translation set id out of bounds")); + wxASSERT_MSG((int)0xffff0000 <= rec.set && rec.set <= (int)0x0000ffff, wxT("translation set id out of bounds")); db.data.push_back((unsigned __int16)rec.set); std::wstring::size_type n = rec.src.length(); wxASSERT_MSG(n <= 0xffff, wxT("translation set source name overflow")); diff --git a/ZRColaCompile/main.cpp b/ZRColaCompile/main.cpp index 603087b..c84b992 100644 --- a/ZRColaCompile/main.cpp +++ b/ZRColaCompile/main.cpp @@ -19,6 +19,10 @@ #include "pch.h" +#define FONT_MATCH_WIDTH 512 // must be a multiple of 8 +#define FONT_MATCH_HEIGHT 512 +#define FONT_MATCH_THRESHOLD 8e-2 + using namespace std; using namespace stdex; using namespace winstd; @@ -224,6 +228,47 @@ static inline set permutate_and_translate_inv(_In_ co } +static bool contains_pua(_In_ const wstring &str) +{ + for (auto p = str.c_str(), p_end = str.c_str() + str.size(); p < p_end; p++) + if (L'\ue000' <= *p && *p <= L'\uf8ff') + return true; + return false; +} + + +static void replace_all(_Inout_ wstring &str, _In_ const wstring &from, _In_ const wstring &to) +{ + size_t start_pos = 0; + while ((start_pos = str.find(from, start_pos)) != wstring::npos) { + str.replace(start_pos, from.length(), to); + start_pos += to.length(); + } +} + + +static double compare_bitmaps( + _In_count_c_(FONT_MATCH_WIDTH * FONT_MATCH_HEIGHT / 8) const unsigned char *bits_orig, + _In_count_c_(FONT_MATCH_WIDTH * FONT_MATCH_HEIGHT / 8) const unsigned char *bits) +{ +#define B2(n) n, n + 1, n + 1, n + 2 +#define B4(n) B2(n), B2(n + 1), B2(n + 1), B2(n + 2) +#define B6(n) B4(n), B4(n + 1), B4(n + 1), B4(n + 2) + static const unsigned char number_of_bits[256] = { B6(0), B6(1), B6(1), B6(2) }; +#undef B2 +#undef B4 +#undef B6 + // Set divisors to 1 to prevent divide-by-zero. + size_t b_orig = 1, b = 1, x = 0; + for (size_t i = 0; i < FONT_MATCH_WIDTH * FONT_MATCH_HEIGHT / 8; ++i) { + b_orig += number_of_bits[bits_orig[i]]; + b += number_of_bits[bits [i]]; + x += number_of_bits[bits_orig[i] ^ bits[i]]; + } + return (double)x/b_orig * (double)x/b; +} + + /// /// Main function /// @@ -303,6 +348,7 @@ int _tmain(int argc, _TCHAR *argv[]) streamoff dst_start = idrec::open(dst, ZRCOLA_DB_ID); ZRCola::translation_db db_trans; + ZRCola::transet_db db_transset; normperm_db db_np; { @@ -334,6 +380,19 @@ int _tmain(int argc, _TCHAR *argv[]) } { + // Build ZRCola Decomposed to ZRCola Composed translation set. + ZRCola::DBSource::transet ts; + ts.set = (int)ZRCOLA_TRANSEQID_DEFAULT; + ts.src = L"ZRCola Decomposed"; + ts.dst = L"ZRCola Composed"; + if (build_pot) { + pot.insert(ts.src); + pot.insert(ts.dst); + } + + // Add translation set to index and data. + db_transset << ts; + // Get translations. com_obj rs; if (src.SelectTranslations(rs)) { @@ -413,30 +472,239 @@ int _tmain(int argc, _TCHAR *argv[]) } } + { + // Build ZRCola to Unicode translation set. + ZRCola::DBSource::transet ts; + ts.set = (int)ZRCOLA_TRANSEQID_UNICODE; + ts.src = L"ZRCola Composed"; + ts.dst = L"Unicode"; + if (build_pot) { + pot.insert(ts.src); + pot.insert(ts.dst); + } + + // Add translation set to index and data. + db_transset << ts; + + // Get all translations. + com_obj rs; + if (src.SelectAllTranslations(rs)) { + // Parse translations and build temporary database. + vector db_all, db_combining; + for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) { + // Read translation from the database. + ZRCola::DBSource::translation trans; + if (src.GetTranslation(rs, trans)) { + // Add translation to temporary databases. + db_all.push_back(trans); + if (!trans.src.str.empty() && trans.src.str[0] == L'\u203f') { + trans.src.str.erase(0, 1); + db_combining.push_back(trans); + } + } else + has_errors = true; + } + + com_obj rs2; + if (src.SelectPUACharacters(rs2)) { + // Parse characters and build translations. + static const LOGFONT lf_zrcola = { + -FONT_MATCH_HEIGHT/2, 0, + 0, 0, + FW_NORMAL, + FALSE, FALSE, FALSE, + ANSI_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH | FF_DONTCARE, + TEXT("ZRCola") + }; + gdi_handle fnt_zrcola(::CreateFontIndirect(&lf_zrcola)); + gdi_handle brush_bg(::CreateSolidBrush(RGB(0x00, 0x00, 0x00))); + gdi_handle + bmp_orig(::CreateBitmap(FONT_MATCH_WIDTH, FONT_MATCH_HEIGHT, 1, 1, NULL)), + bmp_comb(::CreateBitmap(FONT_MATCH_WIDTH, FONT_MATCH_HEIGHT, 1, 1, NULL)), + bmp_pre (::CreateBitmap(FONT_MATCH_WIDTH, FONT_MATCH_HEIGHT, 1, 1, NULL)); + dc + dc_orig(::CreateCompatibleDC(NULL)), + dc_comb(::CreateCompatibleDC(NULL)), + dc_pre (::CreateCompatibleDC(NULL)); + SetBkColor(dc_orig, RGB(0x00, 0x00, 0x00)); + SetBkColor(dc_comb, RGB(0x00, 0x00, 0x00)); + SetBkColor(dc_pre , RGB(0x00, 0x00, 0x00)); + SetBkMode (dc_orig, TRANSPARENT); + SetBkMode (dc_comb, TRANSPARENT); + SetBkMode (dc_pre , TRANSPARENT); + SetTextColor(dc_orig, RGB(0xff, 0xff, 0xff)); + SetTextColor(dc_comb, RGB(0xff, 0xff, 0xff)); + SetTextColor(dc_pre , RGB(0xff, 0xff, 0xff)); + SetTextAlign(dc_orig, TA_BASELINE | TA_CENTER | TA_NOUPDATECP); + SetTextAlign(dc_comb, TA_BASELINE | TA_CENTER | TA_NOUPDATECP); + SetTextAlign(dc_pre , TA_BASELINE | TA_CENTER | TA_NOUPDATECP); + dc_selector + selector_font_orig(dc_orig, fnt_zrcola), + selector_font_comb(dc_comb, fnt_zrcola), + selector_font_pre (dc_pre , fnt_zrcola); + struct { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[2]; + } bmi = + { + { + sizeof(BITMAPINFOHEADER), + FONT_MATCH_WIDTH, + FONT_MATCH_HEIGHT, + 1, + 1, + BI_RGB, + 0, + 3780, 3780, + 2, 0 + }, + { + { 0x00, 0x00, 0x00 }, + { 0xff, 0xff, 0xff }, + } + }; + vector + bits_orig(FONT_MATCH_WIDTH * FONT_MATCH_HEIGHT / 8), + bits_comb(FONT_MATCH_WIDTH * FONT_MATCH_HEIGHT / 8), + bits_pre (FONT_MATCH_WIDTH * FONT_MATCH_HEIGHT / 8); + map>> trans; + for (; !ZRCola::DBSource::IsEOF(rs2); rs2->MoveNext()) { + // Read character from the database. + ZRCola::DBSource::character chr; + if (src.GetCharacter(rs2, chr)) { + for (auto t = db_all.cbegin(), t_end = db_all.cend(); t != t_end; ++t) { + if (t->dst.str != chr.first) + continue; + // Replace ZRCola decomposition with Unicode combining characters wherever possible. + const auto &comp_orig = chr.first; + const auto &decomp_orig = t->src.str; + wstring decomp = decomp_orig; + for (auto i = db_combining.cbegin(), i_end = db_combining.cend(); i != i_end; ++i) + replace_all(decomp, i->src.str, i->dst.str); + wstring comp = decomp; + for (auto i = db_all.cbegin(), i_end = db_all.cend(); i != i_end; ++i) + replace_all(comp, i->src.str, i->dst.str); + // Check if we got anything useful. + if (comp_orig == comp || + contains_pua(comp)) + continue; + // Do the Unicode C and D normalizations to get two variants: + // - Use precomposed characters as much as possible + // - Use combining characters only + wstring comp_comb, comp_pre; + NormalizeString(NormalizationC, comp , comp_pre ); + NormalizeString(NormalizationD, comp_pre, comp_comb); + { + // Paint original character and Unicode precomposed/combining one. + dc_selector + selector_bmp_orig(dc_orig, bmp_orig), + selector_bmp_comb(dc_comb, bmp_comb), + selector_bmp_pre (dc_pre , bmp_pre ); + static const RECT bounds = { 0, 0, FONT_MATCH_WIDTH, FONT_MATCH_HEIGHT }; + FillRect(dc_orig, &bounds, brush_bg); + FillRect(dc_comb, &bounds, brush_bg); + FillRect(dc_pre , &bounds, brush_bg); + TextOutW(dc_orig, FONT_MATCH_WIDTH/2, FONT_MATCH_HEIGHT*5/8, comp_orig.c_str(), comp_orig.length()); + TextOutW(dc_comb, FONT_MATCH_WIDTH/2, FONT_MATCH_HEIGHT*5/8, comp_comb.c_str(), comp_comb.length()); + TextOutW(dc_pre , FONT_MATCH_WIDTH/2, FONT_MATCH_HEIGHT*5/8, comp_pre .c_str(), comp_pre .length()); + } + // Compare bitmaps. + if (!GetDIBits(dc_orig, bmp_orig, 0, FONT_MATCH_HEIGHT, bits_orig.data(), (BITMAPINFO*)&bmi, DIB_PAL_COLORS) || + !GetDIBits(dc_comb, bmp_comb, 0, FONT_MATCH_HEIGHT, bits_comb.data(), (BITMAPINFO*)&bmi, DIB_PAL_COLORS) || + !GetDIBits(dc_pre , bmp_pre , 0, FONT_MATCH_HEIGHT, bits_pre .data(), (BITMAPINFO*)&bmi, DIB_PAL_COLORS)) + continue; + double + score_comb = compare_bitmaps(bits_orig.data(), bits_comb.data()), + score_pre = compare_bitmaps(bits_orig.data(), bits_pre .data()); + // Add results to a temporary database. + auto hit = trans.find(comp_orig); + if (hit != trans.end()) { + if (score_pre <= FONT_MATCH_THRESHOLD) { + if (hit->second.find(comp_pre) == hit->second.end()) + hit->second.insert(make_pair(comp_pre, make_pair(score_pre, 1))); + } if (score_comb <= FONT_MATCH_THRESHOLD && comp_pre != comp_comb) { + if (hit->second.find(comp_comb) == hit->second.end()) + hit->second.insert(make_pair(comp_comb, make_pair(score_comb, 100))); + } + } else { + map> v; + if (score_pre <= FONT_MATCH_THRESHOLD) + v.insert(make_pair(comp_pre, make_pair(score_pre, 1))); + if (score_comb <= FONT_MATCH_THRESHOLD && comp_pre != comp_comb) + v.insert(make_pair(comp_comb, make_pair(score_comb, 100))); + if (!v.empty()) + trans.insert(make_pair(comp_orig, std::move(v))); + } + } + } else + has_errors = true; + } + + // Preallocate memory. + size_t reserve = db_trans.idxSrc.size() + trans.size(); + db_trans.idxSrc.reserve(reserve); + db_trans.idxDst.reserve(reserve); + db_trans.data .reserve(reserve*5); + + ZRCola::DBSource::translation t; + t.set = (int)ZRCOLA_TRANSEQID_UNICODE; + t.dst.rank = 1; + vector>> results; + for (auto i = trans.cbegin(), i_end = trans.cend(); i != i_end; ++i) { + // Sort results by score. + results.clear(); + results.reserve(i->second.size()); + for (auto j = i->second.cbegin(), j_end = i->second.cend(); j != j_end; ++j) + results.push_back(make_pair(j->second.first, make_pair(j->first, j->second.second))); + sort(results.begin(), results.end(), [] (pair> const& a, pair> const& b) { return a.first < b.first; }); + int rank_comb = 0, rank_pre = 0; + for (auto j = results.cbegin(), j_end = results.cend(); j != j_end; ++j) { + t.src.str = i->first; + t.src.rank = j->second.second + (j->second.second >= 100 ? rank_comb++ : rank_pre++); + t.dst.str = j->second.first; + db_trans << t; + } + } + } else { + _ftprintf(stderr, wxT("%s: error ZCC0016: Error getting characters from database. Please make sure the file is ZRCola.zrc compatible.\n"), (LPCTSTR)filenameIn.c_str()); + has_errors = true; + } + } else { + _ftprintf(stderr, wxT("%s: error ZCC0003: Error getting translations from database. Please make sure the file is ZRCola.zrc compatible.\n"), (LPCTSTR)filenameIn.c_str()); + has_errors = true; + } + } + { // Get translation sets. com_obj rs; if (src.SelectTranlationSets(rs)) { size_t count = src.GetRecordsetCount(rs); if (count < 0xffffffff) { // 4G check (-1 is reserved for error condition) - ZRCola::transet_db db; - // Preallocate memory. - db.idxTranSet.reserve((count+1)); - db.data .reserve((count+1)*4); + db_transset.idxTranSet.reserve((count+2)); + db_transset.data .reserve((count+2)*4); // Parse translation sets and build index and data. for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) { // Read translation set from the database. ZRCola::DBSource::transet ts; if (src.GetTranslationSet(rs, ts)) { + if (ts.set <= (int)ZRCOLA_TRANSEQID_DEFAULT) { + _ftprintf(stderr, wxT("%s: error ZCC0008: Translation set is using reserved ID %i.\n"), (LPCTSTR)filenameIn.c_str(), ts.set); + has_errors = true; + continue; + } + if (build_pot) { pot.insert(ts.src); pot.insert(ts.dst); } // Add translation set to index and data. - db << ts; + db_transset << ts; // Get translations. com_obj rs_tran; @@ -464,12 +732,6 @@ int _tmain(int argc, _TCHAR *argv[]) } else has_errors = true; } - - // Sort indices. - db.idxTranSet.sort(); - - // Write translation sets to file. - dst << ZRCola::transet_rec(db); } else { _ftprintf(stderr, wxT("%s: error ZCC0009: Error getting translation set count from database or too many translation sets.\n"), (LPCTSTR)filenameIn.c_str()); has_errors = true; @@ -480,6 +742,12 @@ int _tmain(int argc, _TCHAR *argv[]) } } + // Sort indices. + db_transset.idxTranSet.sort(); + + // Write translation sets to file. + dst << ZRCola::transet_rec(db_transset); + // Sort indices. db_trans.idxSrc.sort(); db_trans.idxDst.sort(); diff --git a/ZRColaCompile/pch.h b/ZRColaCompile/pch.h index caa70f7..067ba32 100644 --- a/ZRColaCompile/pch.h +++ b/ZRColaCompile/pch.h @@ -37,6 +37,7 @@ #include #include +#include #include // GUID helper to prevent LNK2001 errors (unresolved external symbol IID_IADO...) #pragma warning(push) @@ -45,6 +46,7 @@ #include #pragma warning(pop) +#include #include #include @@ -56,4 +58,5 @@ #include #include #include +#include #include diff --git a/lib/WinStd b/lib/WinStd index 51b262b..b881647 160000 --- a/lib/WinStd +++ b/lib/WinStd @@ -1 +1 @@ -Subproject commit 51b262b38223fbce3b9b43812ad0ff5ef88bdeb4 +Subproject commit b8816476e5f6f4f8465add75ac7bba5c742a2db6 diff --git a/lib/libZRCola/include/zrcola/translate.h b/lib/libZRCola/include/zrcola/translate.h index 47d7c18..269492e 100644 --- a/lib/libZRCola/include/zrcola/translate.h +++ b/lib/libZRCola/include/zrcola/translate.h @@ -37,12 +37,17 @@ /// /// Translation disabled/ZRCola (De)Composition /// -#define ZRCOLA_TRANSEQID_DEFAULT ((ZRCola::transeqid_t)0) +#define ZRCOLA_TRANSEQID_DEFAULT ((ZRCola::transeqid_t)0x0000) /// /// Custom translation sequence ID /// -#define ZRCOLA_TRANSEQID_CUSTOM ((ZRCola::transeqid_t)-1) +#define ZRCOLA_TRANSEQID_CUSTOM ((ZRCola::transeqid_t)0xffff) + +/// +/// ZRCola to Unicode translation sequence ID +/// +#define ZRCOLA_TRANSEQID_UNICODE ((ZRCola::transeqid_t)0xfffe) namespace ZRCola { diff --git a/output/data/ZRCola.zrcdb b/output/data/ZRCola.zrcdb index 9db6aa31bbf2f3b732c8d4fbde0a42c98b504b23..ff014fccf12fdbc26e9d1f3099b8909f0ca4181b 100644 GIT binary patch delta 61912 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�GdUN9rh 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 B$guzb delta 20701 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 WlC9X9ZD>g=T0d~mN^MSk_J06Kb*JzE diff --git a/output/locale/ZRCola-zrcdb.pot b/output/locale/ZRCola-zrcdb.pot index 9bda179..36dd23a 100644 --- a/output/locale/ZRCola-zrcdb.pot +++ b/output/locale/ZRCola-zrcdb.pot @@ -694,9 +694,18 @@ msgstr "" msgid "Ukrainian" msgstr "" +msgid "Unicode" +msgstr "" + msgid "Units" msgstr "" +msgid "ZRCola Composed" +msgstr "" + +msgid "ZRCola Decomposed" +msgstr "" + msgid "l+j l|j" msgstr "" diff --git a/output/locale/de_DE/ZRCola-zrcdb.po b/output/locale/de_DE/ZRCola-zrcdb.po index 87c8c74..ff46198 100644 --- a/output/locale/de_DE/ZRCola-zrcdb.po +++ b/output/locale/de_DE/ZRCola-zrcdb.po @@ -1,14 +1,17 @@ -# +# msgid "" msgstr "" "Project-Id-Version: ZRCola.zrcdb\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Simon Rozman \n" "Language-Team: German (Germany) (https://www.transifex.com/amebis/teams/91592/de_DE/)\n" +"Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: ZRColaCompile\n" +"X-Generator: Poedit 2.4.2\n" msgid "Albanian" msgstr "" @@ -697,9 +700,18 @@ msgstr "" msgid "Ukrainian" msgstr "" +msgid "Unicode" +msgstr "Unicode" + msgid "Units" msgstr "" +msgid "ZRCola Composed" +msgstr "" + +msgid "ZRCola Decomposed" +msgstr "" + msgid "l+j l|j" msgstr "" diff --git a/output/locale/ru_RU/ZRCola-zrcdb.po b/output/locale/ru_RU/ZRCola-zrcdb.po index 8aaa4b9..82864e1 100644 --- a/output/locale/ru_RU/ZRCola-zrcdb.po +++ b/output/locale/ru_RU/ZRCola-zrcdb.po @@ -1,17 +1,19 @@ # Translators: # Simon Rozman , 2018 -# +# msgid "" msgstr "" "Project-Id-Version: ZRCola.zrcdb\n" -"Last-Translator: Simon Rozman , 2018\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Simon Rozman \n" "Language-Team: Russian (Russia) (https://www.transifex.com/amebis/teams/91592/ru_RU/)\n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru_RU\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -"X-Generator: ZRColaCompile\n" +"X-Generator: Poedit 2.4.2\n" msgid "Albanian" msgstr "албанский" @@ -170,8 +172,7 @@ msgid "Greek (Modern)" msgstr "греческий алфавит (новогреческий)" msgid "Greek (Modern) » Greek (Old)" -msgstr "" -"греческий алфавит (новогреческий) » греческий алфавит (древнегреческий)" +msgstr "греческий алфавит (новогреческий) » греческий алфавит (древнегреческий)" msgid "Greek (Old)" msgstr "греческий алфавит (древнегреческий)" @@ -701,9 +702,18 @@ msgstr "турецкий" msgid "Ukrainian" msgstr "украинский" +msgid "Unicode" +msgstr "Юникод" + msgid "Units" msgstr "Единицы" +msgid "ZRCola Composed" +msgstr "ZRCola составленное" + +msgid "ZRCola Decomposed" +msgstr "ZRCola разобранное" + msgid "l+j l|j" msgstr "l+j l|j" diff --git a/output/locale/sl_SI/ZRCola-zrcdb.po b/output/locale/sl_SI/ZRCola-zrcdb.po index 830f091..48ab92f 100644 --- a/output/locale/sl_SI/ZRCola-zrcdb.po +++ b/output/locale/sl_SI/ZRCola-zrcdb.po @@ -1,17 +1,19 @@ # Translators: # Simon Rozman , 2018 -# +# msgid "" msgstr "" "Project-Id-Version: ZRCola.zrcdb\n" -"Last-Translator: Simon Rozman , 2018\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Simon Rozman \n" "Language-Team: Slovenian (Slovenia) (https://www.transifex.com/amebis/teams/91592/sl_SI/)\n" +"Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sl_SI\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" -"X-Generator: ZRColaCompile\n" +"X-Generator: Poedit 2.4.2\n" msgid "Albanian" msgstr "albanščina" @@ -700,9 +702,18 @@ msgstr "turščina" msgid "Ukrainian" msgstr "ukrajinščina" +msgid "Unicode" +msgstr "Unicode" + msgid "Units" msgstr "Enote" +msgid "ZRCola Composed" +msgstr "ZRCola sestavljeno" + +msgid "ZRCola Decomposed" +msgstr "ZRCola razstavljeno" + msgid "l+j l|j" msgstr "l+j l|j"