From 6dff6eed4f4c178661f2ccada458d5bc0d3cd23d Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 30 Mar 2017 12:59:29 +0200 Subject: [PATCH] Translation set database and other translation sets added --- ZRCola/zrcolaapp.cpp | 6 + ZRCola/zrcolaapp.h | 1 + ZRColaCompile/dbsource.cpp | 101 ++++++++++++++- ZRColaCompile/dbsource.h | 54 +++++++- ZRColaCompile/main.cpp | 155 +++++++++++++++++++---- lib/libZRCola/include/zrcola/translate.h | 43 ++++--- output/data/ZRCola.zrcdb | Bin 3598202 -> 3642466 bytes output/locale/ZRCola-zrcdb.pot | 60 +++++++++ output/locale/de_DE/ZRCola-zrcdb.po | 74 ++++++++++- output/locale/ru_RU/ZRCola-zrcdb.po | 82 +++++++++++- output/locale/sl_SI/ZRCola-zrcdb.po | 65 +++++++++- 11 files changed, 591 insertions(+), 50 deletions(-) diff --git a/ZRCola/zrcolaapp.cpp b/ZRCola/zrcolaapp.cpp index cf78c92..f31cc59 100644 --- a/ZRCola/zrcolaapp.cpp +++ b/ZRCola/zrcolaapp.cpp @@ -102,6 +102,12 @@ bool ZRColaApp::OnInit() wxFAIL_MSG(wxT("Error reading translation data from ZRCola.zrcdb.")); m_t_db.clear(); } + } else if (id == ZRCola::transet_rec::id) { + dat >> ZRCola::transet_rec(m_ts_db); + if (!dat.good()) { + wxFAIL_MSG(wxT("Error reading translation set data from ZRCola.zrcdb.")); + m_ts_db.clear(); + } } else if (id == ZRCola::langchar_rec::id) { dat >> ZRCola::langchar_rec(m_lc_db); if (!dat.good()) { diff --git a/ZRCola/zrcolaapp.h b/ZRCola/zrcolaapp.h index f617abc..fd771cd 100644 --- a/ZRCola/zrcolaapp.h +++ b/ZRCola/zrcolaapp.h @@ -73,6 +73,7 @@ public: public: ZRCola::translation_db m_t_db; ///< Translation database + ZRCola::transet_db m_ts_db; ///< Translation set database ZRCola::langchar_db m_lc_db; ///< Language character database ZRCola::language_db m_lang_db; ///< Language database ZRCola::keyseq_db m_ks_db; ///< Key sequence database diff --git a/ZRColaCompile/dbsource.cpp b/ZRColaCompile/dbsource.cpp index dbb22f0..4583077 100644 --- a/ZRColaCompile/dbsource.cpp +++ b/ZRColaCompile/dbsource.cpp @@ -249,6 +249,8 @@ ZRCola::DBSource::DBSource() ZRCola::DBSource::~DBSource() { // Manually release all COM objects related to the database before we close the database. + m_pTranslation1.free(); + m_comTranslation.free(); m_pCharacterGroup1.free(); m_comCharacterGroup.free(); @@ -279,13 +281,16 @@ bool ZRCola::DBSource::Open(LPCTSTR filename) m_filename = filename; m_locale = _create_locale(LC_ALL, "Slovenian_Slovenia.1250"); - wxASSERT_MSG(!m_comCharacterGroup, wxT("ADO command already created")); - // Create ADO command(s). + wxASSERT_MSG(!m_comCharacterGroup, wxT("ADO command already created")); wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comCharacterGroup))); wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_ActiveConnection(variant(m_db)))); wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandType(adCmdText))); - wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandText(bstr(L"SELECT [VRS_SkupineZnakov].[Znak], [VRS_SkupineZnakov].[pogost] FROM [VRS_SkupineZnakov] LEFT JOIN [VRS_CharList] ON [VRS_SkupineZnakov].[Znak]=[VRS_CharList].[znak] WHERE [VRS_CharList].[aktiven]=1 AND [VRS_SkupineZnakov].[Skupina]=? ORDER BY [VRS_SkupineZnakov].[Rang] ASC, [VRS_SkupineZnakov].[Znak] ASC")))); + wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandText(bstr(L"SELECT [VRS_SkupineZnakov].[Znak], [VRS_SkupineZnakov].[pogost] " + L"FROM [VRS_SkupineZnakov] " + L"LEFT JOIN [VRS_CharList] ON [VRS_SkupineZnakov].[Znak]=[VRS_CharList].[znak] " + L"WHERE [VRS_CharList].[aktiven]=1 AND [VRS_SkupineZnakov].[Skupina]=? " + L"ORDER BY [VRS_SkupineZnakov].[Rang] ASC, [VRS_SkupineZnakov].[Znak] ASC")))); { // Create and add command parameters. com_obj params; @@ -295,6 +300,23 @@ bool ZRCola::DBSource::Open(LPCTSTR filename) wxVERIFY(SUCCEEDED(params->Append(m_pCharacterGroup1))); } + wxASSERT_MSG(!m_comTranslation, wxT("ADO command already created")); + wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comTranslation))); + wxVERIFY(SUCCEEDED(m_comTranslation->put_ActiveConnection(variant(m_db)))); + wxVERIFY(SUCCEEDED(m_comTranslation->put_CommandType(adCmdText))); + wxVERIFY(SUCCEEDED(m_comTranslation->put_CommandText(bstr(L"SELECT [Komb1] AS [komb], [rang_komb1] AS [rang_komb], [Komb2] AS [znak], [rang_komb2] AS [rang_znak] " + L"FROM [VRS_ScriptRepl] " + L"WHERE [Script]=? " + L"ORDER BY [Komb2], [rang_komb2], [rang_komb1], [Komb1]")))); + { + // Create and add command parameters. + com_obj params; + wxVERIFY(SUCCEEDED(m_comTranslation->get_Parameters(¶ms))); + wxASSERT_MSG(!m_pTranslation1, wxT("ADO command parameter already created")); + wxVERIFY(SUCCEEDED(m_comTranslation->CreateParameter(bstr(L"@Script"), adInteger, adParamInput, 0, variant(DISP_E_PARAMNOTFOUND, VT_ERROR), &m_pTranslation1))); + wxVERIFY(SUCCEEDED(params->Append(m_pTranslation1))); + } + return true; } else { _ftprintf(stderr, wxT("%s: error ZCC0011: Could not open database (0x%x).\n"), (LPCTSTR)filename, hr); @@ -591,7 +613,28 @@ bool ZRCola::DBSource::SelectTranslations(com_obj &rs) const L"WHERE [rang_komb]=1 " L"ORDER BY [znak], [rang_znak], [rang_komb], [komb]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) { - _ftprintf(stderr, wxT("%s: error ZCC0040: Error loading compositions from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); + _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(int set, winstd::com_obj& rs) const +{ + // Create a new recordset. + rs.free(); + wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs))); + wxVERIFY(SUCCEEDED(rs->put_CursorLocation(adUseClient))); + wxVERIFY(SUCCEEDED(rs->put_CursorType(adOpenForwardOnly))); + wxVERIFY(SUCCEEDED(rs->put_LockType(adLockReadOnly))); + + // Open it. + wxVERIFY(SUCCEEDED(m_pTranslation1->put_Value(variant(set)))); + if (FAILED(rs->Open(variant(m_comTranslation), variant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) { + _ftprintf(stderr, wxT("%s: error ZCC0100: Error loading translations from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); LogErrors(); return false; } @@ -635,6 +678,56 @@ bool ZRCola::DBSource::GetTranslation(const com_obj& rs, ZRCola::D } +bool ZRCola::DBSource::SelectTranlationSets(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 DISTINCT [entCode], [Src_En], [Dst_En] " + L"FROM [VRS_Script] " + L"ORDER BY [entCode], [Src_En], [Dst_En]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) + { + _ftprintf(stderr, wxT("%s: error ZCC0060: Error loading translation sets from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); + LogErrors(); + return false; + } + + return true; +} + + +bool ZRCola::DBSource::GetTranslationSet(const com_obj& rs, ZRCola::DBSource::transet& ts) const +{ + wxASSERT_MSG(rs, wxT("recordset is empty")); + + com_obj flds; + wxVERIFY(SUCCEEDED(rs->get_Fields(&flds))); + + { + com_obj f; + wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"entCode"), &f))); + wxCHECK(GetValue(f, ts.id), false); + } + + { + com_obj f; + wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Src_En"), &f))); + wxCHECK(GetValue(f, ts.src), false); + } + + { + com_obj f; + wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Dst_En"), &f))); + wxCHECK(GetValue(f, ts.dst), false); + } + + return true; +} + + bool ZRCola::DBSource::SelectKeySequences(com_obj &rs) const { // Create a new recordset. diff --git a/ZRColaCompile/dbsource.h b/ZRColaCompile/dbsource.h index f60d811..ed62364 100644 --- a/ZRColaCompile/dbsource.h +++ b/ZRColaCompile/dbsource.h @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -71,6 +72,17 @@ namespace ZRCola { }; + /// + /// Translation set + /// + class transet { + public: + int id; ///< ID + std::wstring src; ///< Source name + std::wstring dst; ///< Destination name + }; + + /// /// Key sequence /// @@ -472,6 +484,18 @@ namespace ZRCola { /// bool SelectTranslations(winstd::com_obj& rs) const; + /// + /// Returns character translations by set + /// + /// \param[in ] set Translation set ID + /// \param[out] rs Recordset with results + /// + /// \returns + /// - true when query succeeds + /// - false otherwise + /// + bool SelectTranslations(int set, winstd::com_obj& rs) const; + /// /// Returns translation data /// @@ -484,6 +508,29 @@ namespace ZRCola { /// bool GetTranslation(const winstd::com_obj& rs, translation& t) const; + /// + /// Returns translation sets + /// + /// \param[out] rs Recordset with results + /// + /// \returns + /// - true when query succeeds + /// - false otherwise + /// + bool SelectTranlationSets(winstd::com_obj& rs) const; + + /// + /// Returns translation set data + /// + /// \param[in] rs Recordset with results + /// \param[out] lang Language + /// + /// \returns + /// - true when succeeded + /// - false otherwise + /// + bool GetTranslationSet(const winstd::com_obj& rs, transet& ts) const; + /// /// Returns key sequences /// @@ -673,8 +720,11 @@ namespace ZRCola { winstd::com_obj m_db; ///< Database _locale_t m_locale; ///< Database locale - winstd::com_obj m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery - winstd::com_obj m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter + winstd::com_obj m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery + winstd::com_obj m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter + + winstd::com_obj m_comTranslation; ///< ADO Command for SelectTranslations subquery + winstd::com_obj m_pTranslation1; ///< \c m_comTranslations parameter std::set m_terms_ignore; ///< Terms to ignore when comparing characters }; diff --git a/ZRColaCompile/main.cpp b/ZRColaCompile/main.cpp index 3a90229..10a9e9f 100644 --- a/ZRColaCompile/main.cpp +++ b/ZRColaCompile/main.cpp @@ -174,6 +174,8 @@ int _tmain(int argc, _TCHAR *argv[]) // Open file ID. streamoff dst_start = idrec::open(dst, ZRCOLA_DB_ID); + ZRCola::translation_db db_trans; + { // Get translations. com_obj rs; @@ -222,42 +224,33 @@ int _tmain(int argc, _TCHAR *argv[]) } } - ZRCola::translation_db db; - // Preallocate memory. - db.idxSrc.reserve(count); - db.idxDst.reserve(count); - db.data .reserve(count*5); + db_trans.idxSrc.reserve(count); + db_trans.idxDst.reserve(count); + db_trans.data .reserve(count*5); // Parse translations and build index and data. for (auto t = db_temp2.cbegin(), t_end = db_temp2.cend(); t != t_end; ++t) { // Add translation to index and data. for (auto d = t->second.cbegin(), d_end = t->second.cend(); d != d_end; ++d) { - unsigned __int32 idx = db.data.size(); - db.data.push_back((unsigned __int16)0); + unsigned __int32 idx = db_trans.data.size(); + db_trans.data.push_back((unsigned __int16)0); wxASSERT_MSG((int)0xffff8000 <= d->first && d->first <= (int)0x00007fff, wxT("destination character rank out of bounds")); - db.data.push_back((unsigned __int16)d->first); + db_trans.data.push_back((unsigned __int16)d->first); wxASSERT_MSG((int)0xffff8000 <= d->second.rank && d->second.rank <= (int)0x00007fff, wxT("source character rank out of bounds")); - db.data.push_back((unsigned __int16)d->second.rank); + db_trans.data.push_back((unsigned __int16)d->second.rank); wstring::size_type n = t->first.length(); wxASSERT_MSG(n <= 0xffff, wxT("destination overflow")); - db.data.push_back((unsigned __int16)n); + db_trans.data.push_back((unsigned __int16)n); n += d->second.str.length(); wxASSERT_MSG(n <= 0xffff, wxT("source overflow")); - db.data.push_back((unsigned __int16)n); - db.data.insert(db.data.end(), t->first .cbegin(), t->first .cend()); - db.data.insert(db.data.end(), d->second.str.cbegin(), d->second.str.cend()); - db.idxSrc.push_back(idx); - db.idxDst.push_back(idx); + db_trans.data.push_back((unsigned __int16)n); + db_trans.data.insert(db_trans.data.end(), t->first .cbegin(), t->first .cend()); + db_trans.data.insert(db_trans.data.end(), d->second.str.cbegin(), d->second.str.cend()); + db_trans.idxSrc.push_back(idx); + db_trans.idxDst.push_back(idx); } } - - // Sort indices. - db.idxSrc.sort(); - db.idxDst.sort(); - - // Write translations to file. - dst << ZRCola::translation_rec(db); } else { _ftprintf(stderr, wxT("%s: error ZCC0004: Error getting translation count from database or too many translations.\n"), (LPCTSTR)filenameIn.c_str()); has_errors = true; @@ -268,6 +261,124 @@ int _tmain(int argc, _TCHAR *argv[]) } } + { + // 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::DBSource::transet ts; + ZRCola::transet_db db; + + // Preallocate memory. + db.idxTranSet.reserve(count); + db.data .reserve(count*4); + + // Add (de)composing translation set to index and data. + ts.id = 0; + ts.src = L"ZRCola Decomposed"; + ts.dst = L"ZRCola Composed"; + unsigned __int32 idx = db.data.size(); + wxASSERT_MSG((int)0xffff8000 <= ts.id && ts.id <= (int)0x00007fff, wxT("translation set index out of bounds")); + db.data.push_back((unsigned __int16)ts.id); + wstring::size_type n = ts.src.length(); + wxASSERT_MSG(n <= 0xffff, wxT("translation set source name overflow")); + db.data.push_back((unsigned __int16)n); + n += ts.dst.length(); + wxASSERT_MSG(n <= 0xffff, wxT("translation set destination name overflow")); + db.data.push_back((unsigned __int16)n); + db.data.insert(db.data.end(), ts.src.cbegin(), ts.src.cend()); + db.data.insert(db.data.end(), ts.dst.cbegin(), ts.dst.cend()); + db.idxTranSet.push_back(idx); + + // Parse translation sets and build index and data. + for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) { + // Read translation set from the database. + if (src.GetTranslationSet(rs, ts)) { + if (build_pot) { + pot.insert(ts.src); + pot.insert(ts.dst); + } + + // Add translation set to index and data. + unsigned __int32 idx = db.data.size(); + wxASSERT_MSG((int)0xffff8000 <= ts.id && ts.id <= (int)0x00007fff, wxT("translation set index out of bounds")); + db.data.push_back((unsigned __int16)ts.id); + wstring::size_type n = ts.src.length(); + wxASSERT_MSG(n <= 0xffff, wxT("translation set source name overflow")); + db.data.push_back((unsigned __int16)n); + n += ts.dst.length(); + wxASSERT_MSG(n <= 0xffff, wxT("translation set destination name overflow")); + db.data.push_back((unsigned __int16)n); + db.data.insert(db.data.end(), ts.src.cbegin(), ts.src.cend()); + db.data.insert(db.data.end(), ts.dst.cbegin(), ts.dst.cend()); + db.idxTranSet.push_back(idx); + + // Get translations. + com_obj rs_tran; + if (src.SelectTranslations(ts.id, rs_tran)) { + size_t count = src.GetRecordsetCount(rs_tran); + if (count < 0xffffffff) { // 4G check (-1 is reserved for error condition) + // Parse translations and build temporary database. + for (; !ZRCola::DBSource::IsEOF(rs_tran); rs_tran->MoveNext()) { + // Read translation from the database. + ZRCola::DBSource::translation trans; + if (src.GetTranslation(rs_tran, trans)) { + // Add translation to index and data. + unsigned __int32 idx = db_trans.data.size(); + wxASSERT_MSG((int)0xffff8000 <= ts.id && ts.id <= (int)0x00007fff, wxT("translation set index out of bounds")); + db_trans.data.push_back((unsigned __int16)ts.id); + wxASSERT_MSG((int)0xffff8000 <= trans.dst.rank && trans.dst.rank <= (int)0x00007fff, wxT("destination character rank out of bounds")); + db_trans.data.push_back((unsigned __int16)trans.dst.rank); + wxASSERT_MSG((int)0xffff8000 <= trans.src.rank && trans.src.rank <= (int)0x00007fff, wxT("source character rank out of bounds")); + db_trans.data.push_back((unsigned __int16)trans.src.rank); + wstring::size_type n = trans.dst.str.length(); + wxASSERT_MSG(n <= 0xffff, wxT("destination overflow")); + db_trans.data.push_back((unsigned __int16)n); + n += trans.src.str.length(); + wxASSERT_MSG(n <= 0xffff, wxT("source overflow")); + db_trans.data.push_back((unsigned __int16)n); + db_trans.data.insert(db_trans.data.end(), trans.dst.str.cbegin(), trans.dst.str.cend()); + db_trans.data.insert(db_trans.data.end(), trans.src.str.cbegin(), trans.src.str.cend()); + db_trans.idxSrc.push_back(idx); + db_trans.idxDst.push_back(idx); + } else + has_errors = true; + } + } else { + _ftprintf(stderr, wxT("%s: error ZCC0004: Error getting translation count from database or too many translations.\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; + } + } 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; + } + } else { + _ftprintf(stderr, wxT("%s: error ZCC0008: Error getting translation sets from database. Please make sure the file is ZRCola.zrc compatible.\n"), (LPCTSTR)filenameIn.c_str()); + has_errors = true; + } + } + + // Sort indices. + db_trans.idxSrc.sort(); + db_trans.idxDst.sort(); + + // Write translations to file. + dst << ZRCola::translation_rec(db_trans); + { // Get key sequences. com_obj rs; diff --git a/lib/libZRCola/include/zrcola/translate.h b/lib/libZRCola/include/zrcola/translate.h index a4a4ae6..087d411 100644 --- a/lib/libZRCola/include/zrcola/translate.h +++ b/lib/libZRCola/include/zrcola/translate.h @@ -326,8 +326,9 @@ namespace ZRCola { transetid_t set; ///< Translation set ID protected: - unsigned __int16 name_to; ///< Translation set name end in \c data - wchar_t data[]; ///< Translation set name + unsigned __int16 src_to; ///< Source name end in \c data + unsigned __int16 dst_to; ///< Sestination name end in \c data + wchar_t data[]; ///< Source and destination names private: inline transet(_In_ const transet &other); @@ -337,25 +338,37 @@ namespace ZRCola { /// /// Constructs the translation set /// - /// \param[in] set Translation set ID - /// \param[in] name Translation set name - /// \param[in] name_len Number of UTF-16 characters in \p name + /// \param[in] set Translation set ID + /// \param[in] src Translation set source + /// \param[in] src_len Number of UTF-16 characters in \p src + /// \param[in] dst Translation set destination + /// \param[in] dst_len Number of UTF-16 characters in \p dst /// inline transet( - _In_opt_ transetid_t set = 0, - _In_opt_z_count_(name_len) const wchar_t *name = NULL, - _In_opt_ size_t name_len = 0) + _In_opt_ transetid_t set = 0, + _In_opt_z_count_(src_len) const wchar_t *src = NULL, + _In_opt_ size_t src_len = 0, + _In_opt_z_count_(dst_len) const wchar_t *dst = NULL, + _In_opt_ size_t dst_len = 0) { this->set = set; - this->name_to = static_cast(name_len); - if (name_len) memcpy(this->data, name, sizeof(wchar_t)*name_len); + this->src_to = static_cast(src_len); + if (src_len) memcpy(this->data, src, sizeof(wchar_t)*src_len); + this->dst_to = static_cast(this->src_to + dst_len); + if (dst_len) memcpy(this->data + this->src_to, dst, sizeof(wchar_t)*dst_len); } - inline const wchar_t* name () const { return data; }; - inline wchar_t* name () { return data; }; - inline const wchar_t* name_end() const { return data + name_to; }; - inline wchar_t* name_end() { return data + name_to; }; - inline unsigned __int16 name_len() const { return name_to; }; + inline const wchar_t* src () const { return data; }; + inline wchar_t* src () { return data; }; + inline const wchar_t* src_end() const { return data + src_to; }; + inline wchar_t* src_end() { return data + src_to; }; + inline unsigned __int16 src_len() const { return src_to; }; + + inline const wchar_t* dst () const { return data + src_to; }; + inline wchar_t* dst () { return data + src_to; }; + inline const wchar_t* dst_end() const { return data + dst_to; }; + inline wchar_t* dst_end() { return data + dst_to; }; + inline unsigned __int16 dst_len() const { return dst_to - src_to; }; }; #pragma pack(pop) diff --git a/output/data/ZRCola.zrcdb b/output/data/ZRCola.zrcdb index 47e4c959cc6b58755964191aa3305bf0f2d044a9..2d00039ec4ebeb4546dbbd44f1346fa7f79043c9 100644 GIT binary patch delta 45240 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�Q&;6posKtkI*Dl$ca19HlikkH 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 diff --git a/output/locale/ZRCola-zrcdb.pot b/output/locale/ZRCola-zrcdb.pot index 05a7733..e370ba4 100644 --- a/output/locale/ZRCola-zrcdb.pot +++ b/output/locale/ZRCola-zrcdb.pot @@ -10,6 +10,12 @@ msgstr "" msgid "Albanian" msgstr "" +msgid "Apostrophes 1" +msgstr "" + +msgid "Apostrophes 2" +msgstr "" + msgid "Arabic" msgstr "" @@ -25,6 +31,9 @@ msgstr "" msgid "Bosnian – Latinic" msgstr "" +msgid "CAPITAL Case" +msgstr "" + msgid "Combine" msgstr "" @@ -49,6 +58,27 @@ msgstr "" msgid "Cyrillic" msgstr "" +msgid "Cyrillic (Belarusian)" +msgstr "" + +msgid "Cyrillic (Bulgarian)" +msgstr "" + +msgid "Cyrillic (Macedonian)" +msgstr "" + +msgid "Cyrillic (Russian)" +msgstr "" + +msgid "Cyrillic (Serbian)" +msgstr "" + +msgid "Cyrillic (Ukrainian)" +msgstr "" + +msgid "Cyrillic BdC" +msgstr "" + msgid "Czech" msgstr "" @@ -88,6 +118,12 @@ msgstr "" msgid "Greek" msgstr "" +msgid "Greek (Modern)" +msgstr "" + +msgid "Greek (Old)" +msgstr "" + msgid "Hebrew" msgstr "" @@ -199,6 +235,12 @@ msgstr "" msgid "Latin" msgstr "" +msgid "Latin ALE" +msgstr "" + +msgid "Latin BdC" +msgstr "" + msgid "Latvian" msgstr "" @@ -463,6 +505,12 @@ msgstr "" msgid "Serbian – Latinic" msgstr "" +msgid "Sigma Final" +msgstr "" + +msgid "Sigma Nav" +msgstr "" + msgid "Slovak" msgstr "" @@ -550,6 +598,9 @@ msgstr "" msgid "Technical Characters" msgstr "" +msgid "Title Case" +msgstr "" + msgid "Transliterated" msgstr "" @@ -564,3 +615,12 @@ msgstr "" msgid "Units" msgstr "" + +msgid "l+j l|j" +msgstr "" + +msgid "no + |" +msgstr "" + +msgid "small Case" +msgstr "" diff --git a/output/locale/de_DE/ZRCola-zrcdb.po b/output/locale/de_DE/ZRCola-zrcdb.po index 9296ce5..453beb0 100644 --- a/output/locale/de_DE/ZRCola-zrcdb.po +++ b/output/locale/de_DE/ZRCola-zrcdb.po @@ -9,13 +9,19 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.8\n" +"X-Generator: Poedit 1.8.11\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" msgid "Albanian" msgstr "" +msgid "Apostrophes 1" +msgstr "" + +msgid "Apostrophes 2" +msgstr "" + #, fuzzy msgid "Arabic" msgstr "Arabisch" @@ -32,6 +38,9 @@ msgstr "" msgid "Bosnian – Latinic" msgstr "" +msgid "CAPITAL Case" +msgstr "" + msgid "Combine" msgstr "" @@ -57,6 +66,30 @@ msgstr "" msgid "Cyrillic" msgstr "Windows Kyrillisch (CP 1251)" +msgid "Cyrillic (Belarusian)" +msgstr "" + +msgid "Cyrillic (Bulgarian)" +msgstr "" + +msgid "Cyrillic (Macedonian)" +msgstr "" + +#, fuzzy +msgid "Cyrillic (Russian)" +msgstr "Windows Kyrillisch (CP 1251)" + +#, fuzzy +msgid "Cyrillic (Serbian)" +msgstr "Windows Kyrillisch (CP 1251)" + +msgid "Cyrillic (Ukrainian)" +msgstr "" + +#, fuzzy +msgid "Cyrillic BdC" +msgstr "Windows Kyrillisch (CP 1251)" + msgid "Czech" msgstr "" @@ -97,6 +130,13 @@ msgstr "" msgid "Greek" msgstr "Windows Griechisch (CP 1253)" +msgid "Greek (Modern)" +msgstr "" + +#, fuzzy +msgid "Greek (Old)" +msgstr "Windows Griechisch (CP 1253)" + #, fuzzy msgid "Hebrew" msgstr "Windows Hebräisch (CP 1255)" @@ -209,6 +249,12 @@ msgstr "" msgid "Latin" msgstr "" +msgid "Latin ALE" +msgstr "" + +msgid "Latin BdC" +msgstr "" + msgid "Latvian" msgstr "" @@ -477,6 +523,12 @@ msgstr "" msgid "Serbian – Latinic" msgstr "" +msgid "Sigma Final" +msgstr "" + +msgid "Sigma Nav" +msgstr "" + msgid "Slovak" msgstr "" @@ -576,6 +628,9 @@ msgstr "" msgid "Technical Characters" msgstr "" +msgid "Title Case" +msgstr "" + msgid "Transliterated" msgstr "" @@ -591,3 +646,20 @@ msgstr "" msgid "Units" msgstr "" + +msgid "l+j l|j" +msgstr "" + +msgid "no + |" +msgstr "" + +msgid "small Case" +msgstr "" + +#, fuzzy +#~ msgid "Modified Greek" +#~ msgstr "Geändert" + +#, fuzzy +#~ msgid "Old Greek" +#~ msgstr "Windows Griechisch (CP 1253)" diff --git a/output/locale/ru_RU/ZRCola-zrcdb.po b/output/locale/ru_RU/ZRCola-zrcdb.po index 0d21c7c..d5418e1 100644 --- a/output/locale/ru_RU/ZRCola-zrcdb.po +++ b/output/locale/ru_RU/ZRCola-zrcdb.po @@ -9,14 +9,19 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.9\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" msgid "Albanian" msgstr "албанский" +msgid "Apostrophes 1" +msgstr "" + +msgid "Apostrophes 2" +msgstr "" + msgid "Arabic" msgstr "Арабские знаки" @@ -32,6 +37,9 @@ msgstr "боснийский – кириллица" msgid "Bosnian – Latinic" msgstr "боснийский – латиница" +msgid "CAPITAL Case" +msgstr "" + msgid "Combine" msgstr "Средние замещающие знаки" @@ -56,6 +64,33 @@ msgstr "Валюты" msgid "Cyrillic" msgstr "Кириллические знаки" +#, fuzzy +msgid "Cyrillic (Belarusian)" +msgstr "белорусский" + +msgid "Cyrillic (Bulgarian)" +msgstr "" + +#, fuzzy +msgid "Cyrillic (Macedonian)" +msgstr "македонский" + +#, fuzzy +msgid "Cyrillic (Russian)" +msgstr "Кириллические знаки" + +#, fuzzy +msgid "Cyrillic (Serbian)" +msgstr "Кириллические знаки" + +#, fuzzy +msgid "Cyrillic (Ukrainian)" +msgstr "украинский" + +#, fuzzy +msgid "Cyrillic BdC" +msgstr "Кириллические знаки" + msgid "Czech" msgstr "чешский" @@ -95,6 +130,13 @@ msgstr "Глаголические знаки" msgid "Greek" msgstr "Греческие знаки" +msgid "Greek (Modern)" +msgstr "" + +#, fuzzy +msgid "Greek (Old)" +msgstr "Греческие знаки" + msgid "Hebrew" msgstr "Еврейские знаки" @@ -206,6 +248,14 @@ msgstr "кашубский" msgid "Latin" msgstr "латинский" +#, fuzzy +msgid "Latin ALE" +msgstr "латинский" + +#, fuzzy +msgid "Latin BdC" +msgstr "латинский" + msgid "Latvian" msgstr "латышский" @@ -470,6 +520,12 @@ msgstr "сербский – кириллица" msgid "Serbian – Latinic" msgstr "сербский – латиница" +msgid "Sigma Final" +msgstr "" + +msgid "Sigma Nav" +msgstr "" + msgid "Slovak" msgstr "словацкий" @@ -558,6 +614,9 @@ msgstr "Симбол, остальное" msgid "Technical Characters" msgstr "Технические символы" +msgid "Title Case" +msgstr "" + msgid "Transliterated" msgstr "Транслитерированные знаки" @@ -572,3 +631,20 @@ msgstr "украинский" msgid "Units" msgstr "Единицы" + +msgid "l+j l|j" +msgstr "" + +msgid "no + |" +msgstr "" + +msgid "small Case" +msgstr "" + +#, fuzzy +#~ msgid "Modified Greek" +#~ msgstr "Изменяющие знаки" + +#, fuzzy +#~ msgid "Old Greek" +#~ msgstr "Греческие знаки" diff --git a/output/locale/sl_SI/ZRCola-zrcdb.po b/output/locale/sl_SI/ZRCola-zrcdb.po index e6efb44..2e65a68 100644 --- a/output/locale/sl_SI/ZRCola-zrcdb.po +++ b/output/locale/sl_SI/ZRCola-zrcdb.po @@ -9,14 +9,19 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.8\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: Poedit 1.8.11\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" "X-Poedit-SourceCharset: UTF-8\n" msgid "Albanian" msgstr "albanščina" +msgid "Apostrophes 1" +msgstr "apostrofi 1" + +msgid "Apostrophes 2" +msgstr "apostrofi 2" + msgid "Arabic" msgstr "Arabski znaki" @@ -32,6 +37,9 @@ msgstr "bosanščina – cirilica" msgid "Bosnian – Latinic" msgstr "bosanščina – latinica" +msgid "CAPITAL Case" +msgstr "VELIKE črke" + msgid "Combine" msgstr "Srednji nadomestni znaki" @@ -56,6 +64,27 @@ msgstr "Valute" msgid "Cyrillic" msgstr "Cirilski znaki" +msgid "Cyrillic (Belarusian)" +msgstr "cirilica (beloruščina)" + +msgid "Cyrillic (Bulgarian)" +msgstr "cirilica (bolgarščina)" + +msgid "Cyrillic (Macedonian)" +msgstr "cirilica (makedonščina)" + +msgid "Cyrillic (Russian)" +msgstr "cirilica (ruščina)" + +msgid "Cyrillic (Serbian)" +msgstr "cirilica (srbščina)" + +msgid "Cyrillic (Ukrainian)" +msgstr "cirilica (ukrajinščina)" + +msgid "Cyrillic BdC" +msgstr "cirilica BdC" + msgid "Czech" msgstr "češčina" @@ -95,6 +124,12 @@ msgstr "Glagolski znaki" msgid "Greek" msgstr "Grški znaki" +msgid "Greek (Modern)" +msgstr "grščina (sodobna)" + +msgid "Greek (Old)" +msgstr "grščina (stara)" + msgid "Hebrew" msgstr "Hebrejski znaki" @@ -206,6 +241,12 @@ msgstr "kašubščina" msgid "Latin" msgstr "latinščina" +msgid "Latin ALE" +msgstr "latinščina ALE" + +msgid "Latin BdC" +msgstr "latinščina BdC" + msgid "Latvian" msgstr "letonščina" @@ -470,6 +511,12 @@ msgstr "srbščina – cirilica" msgid "Serbian – Latinic" msgstr "srbščina – latinica" +msgid "Sigma Final" +msgstr "Sigma končni" + +msgid "Sigma Nav" +msgstr "Sigma nav" + msgid "Slovak" msgstr "slovaščina" @@ -557,6 +604,9 @@ msgstr "Simbol, drugo" msgid "Technical Characters" msgstr "Tehnični znaki" +msgid "Title Case" +msgstr "Velike začetnice" + msgid "Transliterated" msgstr "Prečrkovano" @@ -572,6 +622,15 @@ msgstr "ukrajinščina" msgid "Units" msgstr "Enote" +msgid "l+j l|j" +msgstr "l+j l|j" + +msgid "no + |" +msgstr "brez + |" + +msgid "small Case" +msgstr "male črke" + #~ msgid "Letter b" #~ msgstr "Črka b"