Character group database support added

This commit is contained in:
Simon Rozman 2016-05-04 15:49:51 +02:00
parent f2f0b007c4
commit 6e4cd60152
13 changed files with 994 additions and 7 deletions

View File

@ -27,6 +27,12 @@ ZRCola::DBSource::DBSource()
ZRCola::DBSource::~DBSource() ZRCola::DBSource::~DBSource()
{ {
if (m_pCharacterGroup1)
m_pCharacterGroup1.Release();
if (m_comCharacterGroup)
m_comCharacterGroup.Release();
if (m_db) if (m_db)
m_db->Close(); m_db->Close();
@ -53,6 +59,23 @@ bool ZRCola::DBSource::Open(LPCTSTR filename)
// Database open and ready. // Database open and ready.
m_filename = filename; m_filename = filename;
m_locale = _create_locale(LC_ALL, "Slovenian_Slovenia.1250"); m_locale = _create_locale(LC_ALL, "Slovenian_Slovenia.1250");
wxASSERT_MSG(!m_comCharacterGroup, wxT("ADO command already created"));
// Create ADO command(s).
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comCharacterGroup)));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_ActiveConnection(ATL::CComVariant(m_db))));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandType(adCmdText)));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandText(ATL::CComBSTR(L"SELECT [Znak] FROM [VRS_SkupineZnakov] WHERE [Skupina]=? ORDER BY [Rang] ASC, [Znak] ASC"))));
{
// Create and add command parameters.
ATL::CComPtr<ADOParameters> params;
wxVERIFY(SUCCEEDED(m_comCharacterGroup->get_Parameters(&params)));
wxASSERT_MSG(!m_pCharacterGroup1, wxT("ADO command parameter already created"));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->CreateParameter(ATL::CComBSTR(L"@Skupina"), adVarWChar, adParamInput, 50, ATL::CComVariant(DISP_E_PARAMNOTFOUND, VT_ERROR), &m_pCharacterGroup1)));
wxVERIFY(SUCCEEDED(params->Append(m_pCharacterGroup1)));
}
return true; return true;
} else { } else {
_ftprintf(stderr, wxT("%s: error ZCC0011: Could not open database (0x%x).\n"), (LPCTSTR)filename, hr); _ftprintf(stderr, wxT("%s: error ZCC0011: Could not open database (0x%x).\n"), (LPCTSTR)filename, hr);
@ -504,3 +527,92 @@ bool ZRCola::DBSource::GetLanguageCharacter(const ATL::CComPtr<ADORecordset>& rs
return true; return true;
} }
bool ZRCola::DBSource::SelectCharacterGroups(ATL::CComPtr<ADORecordset>& rs) const
{
// Create a new recordset.
if (rs) rs.Release();
wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false);
// Open it.
if (FAILED(rs->Open(ATL::CComVariant(
L"SELECT DISTINCT [id], [Skupina], [opis_en], [Rang], [prikazano] "
L"FROM [VRS_SkupinaZnakov] "
L"ORDER BY [Rang], [opis_en]"), ATL::CComVariant(m_db), adOpenStatic, adLockReadOnly, adCmdText)))
{
_ftprintf(stderr, wxT("%s: error ZCC0090: Error loading character groups from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
return true;
}
bool ZRCola::DBSource::GetCharacterGroup(const ATL::CComPtr<ADORecordset>& rs, chrgrp& cg) const
{
wxASSERT_MSG(rs, wxT("recordset is empty"));
ATL::CComPtr<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
std::wstring id;
{
ATL::CComPtr<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"id"), &f)));
wxCHECK(GetValue(f, cg.id), false);
}
{
ATL::CComPtr<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"Skupina"), &f)));
wxCHECK(GetValue(f, id), false);
}
{
ATL::CComPtr<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"Rang"), &f)));
wxCHECK(GetValue(f, cg.rank), false);
}
{
ATL::CComPtr<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"prikazano"), &f)));
wxCHECK(GetValue(f, cg.show), false);
}
{
ATL::CComPtr<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"opis_en"), &f)));
wxCHECK(GetValue(f, cg.name), false);
}
// Read character list from database.
wxVERIFY(SUCCEEDED(m_pCharacterGroup1->put_Value(ATL::CComVariant(id.c_str()))));
ATL::CComPtr<ADORecordset> rs_chars;
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs_chars)));
wxVERIFY(SUCCEEDED(rs_chars->put_CursorLocation(adUseClient)));
wxVERIFY(SUCCEEDED(rs_chars->put_CursorType(adOpenForwardOnly)));
wxVERIFY(SUCCEEDED(rs_chars->put_LockType(adLockReadOnly)));
if (FAILED(rs_chars->Open(ATL::CComVariant(m_comCharacterGroup), ATL::CComVariant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) {
_ftprintf(stderr, wxT("%s: error ZCC0100: Error loading character group characters from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
{
cg.chars.clear();
ATL::CComPtr<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs_chars->get_Fields(&flds)));
ATL::CComPtr<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"Znak"), &f)));
for (VARIANT_BOOL eof = VARIANT_TRUE; SUCCEEDED(rs_chars->get_EOF(&eof)) && !eof; rs_chars->MoveNext()) {
wchar_t c;
wxCHECK(GetUnicodeCharacter(f, c), false);
cg.chars += c;
}
}
return true;
}

View File

@ -39,9 +39,9 @@ namespace ZRCola {
/// ///
class translation { class translation {
public: public:
wchar_t chr; ///< Composed character wchar_t chr; ///< Composed character
std::wstring str; ///< Decomposed string std::wstring str; ///< Decomposed string
int rank; ///< Decomposition rank int rank; ///< Decomposition rank
}; };
@ -85,6 +85,20 @@ namespace ZRCola {
ZRCola::langid_t lang; ///< Language ID ZRCola::langid_t lang; ///< Language ID
}; };
///
/// Character group
///
class chrgrp {
public:
int id; ///< Character group ID
int rank; ///< Character group rank
bool show; ///< Show initially
std::wstring name; ///< Character group name
std::wstring chars; ///< Character group characters
};
public: public:
DBSource(); DBSource();
virtual ~DBSource(); virtual ~DBSource();
@ -328,9 +342,37 @@ namespace ZRCola {
/// ///
bool GetLanguageCharacter(const ATL::CComPtr<ADORecordset>& rs, langchar& lc) const; bool GetLanguageCharacter(const ATL::CComPtr<ADORecordset>& rs, langchar& lc) const;
///
/// Returns character groups
///
/// \param[out] rs Recordset with results
///
/// \returns
/// - true when query succeeds
/// - false otherwise
///
bool SelectCharacterGroups(ATL::CComPtr<ADORecordset>& rs) const;
///
/// Returns character group data
///
/// \param[in] rs Recordset with results
/// \param[out] cg Character group
///
/// \returns
/// - true when succeeded
/// - false otherwise
///
bool GetCharacterGroup(const ATL::CComPtr<ADORecordset>& rs, chrgrp& cg) const;
protected: protected:
std::basic_string<TCHAR> m_filename; ///< Database filename std::basic_string<TCHAR> m_filename; ///< Database filename
ATL::CComPtr<ADOConnection> m_db; ///< Database ATL::CComPtr<ADOConnection> m_db; ///< Database
_locale_t m_locale; ///< Database locale _locale_t m_locale; ///< Database locale
ATL::CComPtr<ADOCommand> m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery
ATL::CComPtr<ADOParameter> m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter
}; };
}; };

View File

@ -243,6 +243,56 @@ inline std::ostream& operator <<(std::ostream& stream, const ZRCola::langchar_db
} }
///
/// Writes character group database to a stream
///
/// \param[in] stream Output stream
/// \param[in] db Character group database
///
/// \returns The stream \p stream
///
inline std::ostream& operator <<(std::ostream& stream, const ZRCola::chrgrp_db &db)
{
unsigned __int32 count;
// Write index count.
ZRCola::keyseq_db::indexChr::size_type ks_count = db.idxRnk.size();
#if defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__)
// 4G check
if (ks_count > 0xffffffff) {
stream.setstate(std::ios_base::failbit);
return stream;
}
#endif
if (stream.fail()) return stream;
count = (unsigned __int32)ks_count;
stream.write((const char*)&count, sizeof(count));
// Write rank index.
if (stream.fail()) return stream;
stream.write((const char*)db.idxRnk.data(), sizeof(unsigned __int32)*count);
// Write data count.
std::vector<unsigned __int16>::size_type data_count = db.data.size();
#if defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__)
// 4G check
if (data_count > 0xffffffff) {
stream.setstate(std::ios_base::failbit);
return stream;
}
#endif
if (stream.fail()) return stream;
count = (unsigned __int32)data_count;
stream.write((const char*)&count, sizeof(count));
// Write data.
if (stream.fail()) return stream;
stream.write((const char*)db.data.data(), sizeof(unsigned __int16)*count);
return stream;
}
/// ///
/// Main function /// Main function
/// ///
@ -549,6 +599,64 @@ int _tmain(int argc, _TCHAR *argv[])
} }
} }
{
// Get character groups.
ATL::CComPtr<ADORecordset> rs;
if (src.SelectCharacterGroups(rs)) {
size_t count = src.GetRecordsetCount(rs);
if (count < 0xffffffff) { // 4G check (-1 is reserved for error condition)
ZRCola::DBSource::chrgrp cg;
ZRCola::chrgrp_db db;
// Preallocate memory.
db.idxRnk.reserve(count);
db.data .reserve(count*4);
// Parse character groups and build index and data.
while (!ZRCola::DBSource::IsEOF(rs)) {
// Read character group from the database.
if (src.GetCharacterGroup(rs, cg)) {
// Add character group to index and data.
unsigned __int32 idx = db.data.size();
wxASSERT_MSG((int)0xffff8000 <= cg.id && cg.id <= (int)0x00007fff, wxT("character group ID out of bounds"));
db.data.push_back((unsigned __int16)cg.id);
wxASSERT_MSG((int)0xffff8000 <= cg.rank && cg.rank <= (int)0x00007fff, wxT("character group rank out of bounds"));
db.data.push_back((unsigned __int16)cg.rank);
db.data.push_back(cg.show ? ZRCola::chrgrp_db::chrgrp::SHOW : 0);
std::wstring::size_type n_name = cg.name.length();
wxASSERT_MSG(n_name <= 0xffff, wxT("character group name too long"));
db.data.push_back((unsigned __int16)n_name);
std::wstring::size_type n_char = cg.chars.length();
wxASSERT_MSG(n_char <= 0xffff, wxT("too many character group characters"));
db.data.push_back((unsigned __int16)n_char);
for (std::wstring::size_type i = 0; i < n_name; i++)
db.data.push_back(cg.name[i]);
for (std::wstring::size_type i = 0; i < n_char; i++)
db.data.push_back(cg.chars[i]);
db.idxRnk.push_back(idx);
if (build_pot)
pot.insert(cg.name);
} else
has_errors = true;
wxVERIFY(SUCCEEDED(rs->MoveNext()));
}
// Sort indices.
db.idxRnk.sort();
// Write character groups to file.
dst << ZRCola::chrgrp_rec(db);
} else {
_ftprintf(stderr, wxT("%s: error ZCC0015: Error getting character group count from database or too many character groups.\n"), (LPCTSTR)filenameIn.c_str());
has_errors = true;
}
} else {
_ftprintf(stderr, wxT("%s: error ZCC0014: Error getting character groups from database. Please make sure the file is ZRCola.zrc compatible.\n"), (LPCTSTR)filenameIn.c_str());
has_errors = true;
}
}
stdex::idrec::close<ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>(dst, dst_start); stdex::idrec::close<ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>(dst, dst_start);
if (dst.fail()) { if (dst.fail()) {

View File

@ -26,6 +26,7 @@
#include <zrcola/language.h> #include <zrcola/language.h>
#include <zrcola/translate.h> #include <zrcola/translate.h>
#include <zrcolaui/chargroup.h>
#include <zrcolaui/keyboard.h> #include <zrcolaui/keyboard.h>
#include <wx/app.h> #include <wx/app.h>
@ -41,6 +42,7 @@
#include <initguid.h> // GUID helper to prevent LNK2001 errors (unresolved external symbol IID_IADO...) #include <initguid.h> // GUID helper to prevent LNK2001 errors (unresolved external symbol IID_IADO...)
#include <adoint.h> #include <adoint.h>
#include <adoid.h> #include <adoid.h>
#include <atlcomcli.h>
#include <tchar.h> #include <tchar.h>

View File

@ -28,6 +28,7 @@
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\include\zrcolaui\chargroup.h" />
<ClInclude Include="..\include\zrcolaui\common.h" /> <ClInclude Include="..\include\zrcolaui\common.h" />
<ClInclude Include="..\include\zrcolaui\keyboard.h" /> <ClInclude Include="..\include\zrcolaui\keyboard.h" />
<ClInclude Include="..\src\stdafx.h" /> <ClInclude Include="..\src\stdafx.h" />

View File

@ -32,6 +32,9 @@
<ClInclude Include="..\include\zrcolaui\keyboard.h"> <ClInclude Include="..\include\zrcolaui\keyboard.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\zrcolaui\chargroup.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\res\libZRColaUI.rc"> <ResourceCompile Include="..\res\libZRColaUI.rc">

View File

@ -0,0 +1,166 @@
/*
Copyright 2015-2016 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "common.h"
#include <zrcola/common.h>
#include <stdex/idrec.h>
#include <istream>
#include <vector>
#pragma warning(push)
#pragma warning(disable: 4200)
#pragma warning(disable: 4251)
#pragma warning(disable: 4512)
namespace ZRCola {
///
/// Character group database
///
class ZRCOLAUI_API chrgrp_db {
public:
#pragma pack(push)
#pragma pack(2)
///
/// Character group data
///
struct chrgrp {
enum flags_t {
SHOW = 1<<0, ///< Show initially
};
unsigned __int16 id; ///< Character group id
unsigned __int16 rank; ///< Character group rank
unsigned __int16 flags; ///< Character group flags (bitwise combination of \c flags_t flags)
unsigned __int16 name_len; ///< Character group name length in \c data
unsigned __int16 char_len; ///< Character list length in \c data
wchar_t data[]; ///< Character group name and character list
};
#pragma pack(pop)
///
/// Rank index
///
class indexRnk : public index<unsigned __int16, unsigned __int32, chrgrp>
{
public:
///
/// Constructs the index
///
/// \param[in] h Reference to vector holding the data
///
indexRnk(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, chrgrp>(h) {}
///
/// Compares two character groups by rank (for searching)
///
/// \param[in] a Pointer to character group
/// \param[in] b Pointer to second character group
///
/// \returns
/// - <0 when a < b
/// - =0 when a == b
/// - >0 when a > b
///
virtual int compare(_In_ const chrgrp &a, _In_ const chrgrp &b) const
{
if (a.rank < b.rank) return -1;
else if (a.rank > b.rank) return +1;
return 0;
}
///
/// Compares two character groups by rank (for sorting)
///
/// \param[in] a Pointer to character group
/// \param[in] b Pointer to second character group
///
/// \returns
/// - <0 when a < b
/// - =0 when a == b
/// - >0 when a > b
///
virtual int compare_sort(_In_ const chrgrp &a, _In_ const chrgrp &b) const
{
if (a.rank < b.rank) return -1;
else if (a.rank > b.rank) return +1;
int r = _wcsncoll(a.data, b.data, std::min<unsigned __int16>(a.name_len, b.name_len));
if (r != 0) return r;
if (a.name_len < b.name_len) return -1;
else if (a.name_len > b.name_len) return +1;
return 0;
}
} idxRnk; ///< Rank index
std::vector<unsigned __int16> data; ///< Character groups data
public:
///
/// Constructs the database
///
inline chrgrp_db() : idxRnk(data) {}
};
typedef ZRCOLAUI_API stdex::idrec::record<chrgrp_db, recordid_t, recordsize_t, ZRCOLA_RECORD_ALIGN> chrgrp_rec;
};
const ZRCola::recordid_t stdex::idrec::record<ZRCola::chrgrp_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"CGR";
///
/// Reads character group database from a stream
///
/// \param[in] stream Input stream
/// \param[out] db Character group database
///
/// \returns The stream \p stream
///
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::chrgrp_db &db)
{
unsigned __int32 count;
// Read index count.
stream.read((char*)&count, sizeof(count));
if (!stream.good()) return stream;
// Read rank index.
db.idxRnk.resize(count);
stream.read((char*)db.idxRnk.data(), sizeof(unsigned __int32)*count);
if (!stream.good()) return stream;
// Read data count.
stream.read((char*)&count, sizeof(count));
if (!stream.good()) return stream;
// Read data.
db.data.resize(count);
stream.read((char*)db.data.data(), sizeof(unsigned __int16)*count);
return stream;
}
#pragma warning(pop)

View File

@ -45,9 +45,9 @@ namespace ZRCola {
/// ///
struct keyseq { struct keyseq {
enum modifiers_t { enum modifiers_t {
SHIFT = 1<<0, ///< SHIFT key was pressed SHIFT = 1<<0, ///< SHIFT key was pressed
CTRL = 1<<1, ///< CTRL key was pressed CTRL = 1<<1, ///< CTRL key was pressed
ALT = 1<<2, ///< ALT key was pressed ALT = 1<<2, ///< ALT key was pressed
}; };
wchar_t chr; ///< Character wchar_t chr; ///< Character

View File

@ -20,6 +20,7 @@
#pragma once #pragma once
#include "../../../include/zrcola.h" #include "../../../include/zrcola.h"
#include "../include/zrcolaui/chargroup.h"
#include "../include/zrcolaui/keyboard.h" #include "../include/zrcolaui/keyboard.h"
#include <assert.h> #include <assert.h>

Binary file not shown.

View File

@ -5,11 +5,14 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: ZRColaCompile 2.0-alpha5\n" "X-Generator: ZRColaCompile 2.0-alpha6\n"
msgid "Albanian" msgid "Albanian"
msgstr "" msgstr ""
msgid "Arrows"
msgstr ""
msgid "Belarusian" msgid "Belarusian"
msgstr "" msgstr ""
@ -19,9 +22,24 @@ msgstr ""
msgid "Bosnian Latinic" msgid "Bosnian Latinic"
msgstr "" msgstr ""
msgid "Combine"
msgstr ""
msgid "Combine Above"
msgstr ""
msgid "Combine Below"
msgstr ""
msgid "Combine Over"
msgstr ""
msgid "Croatian" msgid "Croatian"
msgstr "" msgstr ""
msgid "Currencies"
msgstr ""
msgid "Czech" msgid "Czech"
msgstr "" msgstr ""
@ -34,6 +52,9 @@ msgstr ""
msgid "Estonian" msgid "Estonian"
msgstr "" msgstr ""
msgid "Eva"
msgstr ""
msgid "French" msgid "French"
msgstr "" msgstr ""
@ -49,6 +70,9 @@ msgstr ""
msgid "Irish Gaelic" msgid "Irish Gaelic"
msgstr "" msgstr ""
msgid "Joined"
msgstr ""
msgid "Kashubian" msgid "Kashubian"
msgstr "" msgstr ""
@ -58,6 +82,165 @@ msgstr ""
msgid "Latvian" msgid "Latvian"
msgstr "" msgstr ""
msgid "Letter A"
msgstr ""
msgid "Letter B"
msgstr ""
msgid "Letter C"
msgstr ""
msgid "Letter D"
msgstr ""
msgid "Letter E"
msgstr ""
msgid "Letter F"
msgstr ""
msgid "Letter G"
msgstr ""
msgid "Letter H"
msgstr ""
msgid "Letter I"
msgstr ""
msgid "Letter J"
msgstr ""
msgid "Letter K"
msgstr ""
msgid "Letter L"
msgstr ""
msgid "Letter M"
msgstr ""
msgid "Letter N"
msgstr ""
msgid "Letter O"
msgstr ""
msgid "Letter P"
msgstr ""
msgid "Letter Q"
msgstr ""
msgid "Letter R"
msgstr ""
msgid "Letter S"
msgstr ""
msgid "Letter T"
msgstr ""
msgid "Letter U"
msgstr ""
msgid "Letter V"
msgstr ""
msgid "Letter W"
msgstr ""
msgid "Letter X"
msgstr ""
msgid "Letter Y"
msgstr ""
msgid "Letter Z"
msgstr ""
msgid "Letter a"
msgstr ""
msgid "Letter b"
msgstr ""
msgid "Letter c"
msgstr ""
msgid "Letter d"
msgstr ""
msgid "Letter e"
msgstr ""
msgid "Letter f"
msgstr ""
msgid "Letter g"
msgstr ""
msgid "Letter h"
msgstr ""
msgid "Letter i"
msgstr ""
msgid "Letter j"
msgstr ""
msgid "Letter k"
msgstr ""
msgid "Letter l"
msgstr ""
msgid "Letter m"
msgstr ""
msgid "Letter n"
msgstr ""
msgid "Letter o"
msgstr ""
msgid "Letter p"
msgstr ""
msgid "Letter q"
msgstr ""
msgid "Letter r"
msgstr ""
msgid "Letter s"
msgstr ""
msgid "Letter t"
msgstr ""
msgid "Letter u"
msgstr ""
msgid "Letter v"
msgstr ""
msgid "Letter w"
msgstr ""
msgid "Letter x"
msgstr ""
msgid "Letter y"
msgstr ""
msgid "Letter z"
msgstr ""
msgid "Ligatures"
msgstr ""
msgid "Lithuanian" msgid "Lithuanian"
msgstr "" msgstr ""
@ -67,6 +250,12 @@ msgstr ""
msgid "Maltese" msgid "Maltese"
msgstr "" msgstr ""
msgid "Metric"
msgstr ""
msgid "Modified"
msgstr ""
msgid "Moldavian Cyrillic" msgid "Moldavian Cyrillic"
msgstr "" msgstr ""
@ -76,12 +265,54 @@ msgstr ""
msgid "Norwegian" msgid "Norwegian"
msgstr "" msgstr ""
msgid "Number 0"
msgstr ""
msgid "Number 1"
msgstr ""
msgid "Number 2"
msgstr ""
msgid "Number 3"
msgstr ""
msgid "Number 4"
msgstr ""
msgid "Number 5"
msgstr ""
msgid "Number 6"
msgstr ""
msgid "Number 7"
msgstr ""
msgid "Number 8"
msgstr ""
msgid "Number 9"
msgstr ""
msgid "Numbers"
msgstr ""
msgid "Numbers - Circled"
msgstr ""
msgid "Parentheses"
msgstr ""
msgid "Polish" msgid "Polish"
msgstr "" msgstr ""
msgid "Portuguese" msgid "Portuguese"
msgstr "" msgstr ""
msgid "Quotes"
msgstr ""
msgid "Romanian" msgid "Romanian"
msgstr "" msgstr ""
@ -106,9 +337,54 @@ msgstr ""
msgid "Spanish" msgid "Spanish"
msgstr "" msgstr ""
msgid "Special Characters"
msgstr ""
msgid "Strokes"
msgstr ""
msgid "Surrounded"
msgstr ""
msgid "Swedish" msgid "Swedish"
msgstr "" msgstr ""
msgid "Symbol !"
msgstr ""
msgid "Symbol ("
msgstr ""
msgid "Symbol )"
msgstr ""
msgid "Symbol +"
msgstr ""
msgid "Symbol ,"
msgstr ""
msgid "Symbol -"
msgstr ""
msgid "Symbol :"
msgstr ""
msgid "Symbol ;"
msgstr ""
msgid "Symbol <"
msgstr ""
msgid "Symbol ="
msgstr ""
msgid "Symbol >"
msgstr ""
msgid "Symbol ?"
msgstr ""
msgid "Turkish" msgid "Turkish"
msgstr "" msgstr ""

Binary file not shown.

View File

@ -17,6 +17,9 @@ msgstr ""
msgid "Albanian" msgid "Albanian"
msgstr "albanščina" msgstr "albanščina"
msgid "Arrows"
msgstr "Puščice"
msgid "Belarusian" msgid "Belarusian"
msgstr "beloruščina" msgstr "beloruščina"
@ -26,9 +29,24 @@ msgstr "bosanščina cirilica"
msgid "Bosnian Latinic" msgid "Bosnian Latinic"
msgstr "bosanščina latinica" msgstr "bosanščina latinica"
msgid "Combine"
msgstr "Kombinirano"
msgid "Combine Above"
msgstr "Kombinirano zgoraj"
msgid "Combine Below"
msgstr "Kombinirano spodaj"
msgid "Combine Over"
msgstr "Kombinirano prečrtano"
msgid "Croatian" msgid "Croatian"
msgstr "hrvaščina" msgstr "hrvaščina"
msgid "Currencies"
msgstr "Valute"
msgid "Czech" msgid "Czech"
msgstr "češčina" msgstr "češčina"
@ -41,6 +59,9 @@ msgstr "angleščina"
msgid "Estonian" msgid "Estonian"
msgstr "estonščina" msgstr "estonščina"
msgid "Eva"
msgstr "Eva"
msgid "French" msgid "French"
msgstr "francoščina" msgstr "francoščina"
@ -56,6 +77,9 @@ msgstr "madžarščina"
msgid "Irish Gaelic" msgid "Irish Gaelic"
msgstr "irščina" msgstr "irščina"
msgid "Joined"
msgstr "Povezano"
msgid "Kashubian" msgid "Kashubian"
msgstr "kašubščina" msgstr "kašubščina"
@ -65,6 +89,165 @@ msgstr "latinščina"
msgid "Latvian" msgid "Latvian"
msgstr "letonščina" msgstr "letonščina"
msgid "Letter A"
msgstr "Črka A"
msgid "Letter B"
msgstr "Črka B"
msgid "Letter C"
msgstr "Črka C"
msgid "Letter D"
msgstr "Črka D"
msgid "Letter E"
msgstr "Črka E"
msgid "Letter F"
msgstr "Črka f"
msgid "Letter G"
msgstr "Črka G"
msgid "Letter H"
msgstr "Črka H"
msgid "Letter I"
msgstr "Črka I"
msgid "Letter J"
msgstr "Črka J"
msgid "Letter K"
msgstr "Črka K"
msgid "Letter L"
msgstr "Črka L"
msgid "Letter M"
msgstr "Črka M"
msgid "Letter N"
msgstr "Črka N"
msgid "Letter O"
msgstr "Črka O"
msgid "Letter P"
msgstr "Črka P"
msgid "Letter Q"
msgstr "Črka Q"
msgid "Letter R"
msgstr "Črka R"
msgid "Letter S"
msgstr "Črka S"
msgid "Letter T"
msgstr "Črka T"
msgid "Letter U"
msgstr "Črka U"
msgid "Letter V"
msgstr "Črka V"
msgid "Letter W"
msgstr "Črka W"
msgid "Letter X"
msgstr "Črka X"
msgid "Letter Y"
msgstr "Črka Y"
msgid "Letter Z"
msgstr "Črka Z"
msgid "Letter a"
msgstr "Črka a"
msgid "Letter b"
msgstr "Črka b"
msgid "Letter c"
msgstr "Črka c"
msgid "Letter d"
msgstr "Črka d"
msgid "Letter e"
msgstr "Črka e"
msgid "Letter f"
msgstr "Črka f"
msgid "Letter g"
msgstr "Črka g"
msgid "Letter h"
msgstr "Črka h"
msgid "Letter i"
msgstr "Črka i"
msgid "Letter j"
msgstr "Črka j"
msgid "Letter k"
msgstr "Črka k"
msgid "Letter l"
msgstr "Črka l"
msgid "Letter m"
msgstr "Črka m"
msgid "Letter n"
msgstr "Črka n"
msgid "Letter o"
msgstr "Črka o"
msgid "Letter p"
msgstr "Črka p"
msgid "Letter q"
msgstr "Črka q"
msgid "Letter r"
msgstr "Črka r"
msgid "Letter s"
msgstr "Črka s"
msgid "Letter t"
msgstr "Črka t"
msgid "Letter u"
msgstr "Črka u"
msgid "Letter v"
msgstr "Črka v"
msgid "Letter w"
msgstr "Črka w"
msgid "Letter x"
msgstr "Črka x"
msgid "Letter y"
msgstr "Črka y"
msgid "Letter z"
msgstr "Črka z"
msgid "Ligatures"
msgstr "Ligature"
msgid "Lithuanian" msgid "Lithuanian"
msgstr "litovščina" msgstr "litovščina"
@ -74,6 +257,12 @@ msgstr "makedonščina"
msgid "Maltese" msgid "Maltese"
msgstr "malteščina" msgstr "malteščina"
msgid "Metric"
msgstr "Metrično"
msgid "Modified"
msgstr "Spremenjeno"
msgid "Moldavian Cyrillic" msgid "Moldavian Cyrillic"
msgstr "moldavščina cirilica" msgstr "moldavščina cirilica"
@ -83,12 +272,54 @@ msgstr "moldavščina latinica"
msgid "Norwegian" msgid "Norwegian"
msgstr "norveščina" msgstr "norveščina"
msgid "Number 0"
msgstr "Številka 0"
msgid "Number 1"
msgstr "Številka 1"
msgid "Number 2"
msgstr "Številka 2"
msgid "Number 3"
msgstr "Številka 3"
msgid "Number 4"
msgstr "Številka 4"
msgid "Number 5"
msgstr "Številka 5"
msgid "Number 6"
msgstr "Številka 6"
msgid "Number 7"
msgstr "Številka 7"
msgid "Number 8"
msgstr "Številka 8"
msgid "Number 9"
msgstr "Številka 9"
msgid "Numbers"
msgstr "Številke"
msgid "Numbers - Circled"
msgstr "Številke - obkroženo"
msgid "Parentheses"
msgstr "Oklepaji"
msgid "Polish" msgid "Polish"
msgstr "poljščina" msgstr "poljščina"
msgid "Portuguese" msgid "Portuguese"
msgstr "portugalščina" msgstr "portugalščina"
msgid "Quotes"
msgstr "Narekovaji"
msgid "Romanian" msgid "Romanian"
msgstr "romunščina" msgstr "romunščina"
@ -113,9 +344,54 @@ msgstr "lužiščini"
msgid "Spanish" msgid "Spanish"
msgstr "španščina" msgstr "španščina"
msgid "Special Characters"
msgstr "Posebni znaki"
msgid "Strokes"
msgstr "Poševnica"
msgid "Surrounded"
msgstr "Obkroženi"
msgid "Swedish" msgid "Swedish"
msgstr "švedščina" msgstr "švedščina"
msgid "Symbol !"
msgstr "Simbol !"
msgid "Symbol ("
msgstr "Simbol ("
msgid "Symbol )"
msgstr "Simbol )"
msgid "Symbol +"
msgstr "Simbol +"
msgid "Symbol ,"
msgstr "Simbol ,"
msgid "Symbol -"
msgstr "Simbol -"
msgid "Symbol :"
msgstr "Simbol :"
msgid "Symbol ;"
msgstr "Simbol ;"
msgid "Symbol <"
msgstr "Simbol <"
msgid "Symbol ="
msgstr "Simbol ="
msgid "Symbol >"
msgstr "Simbol >"
msgid "Symbol ?"
msgstr "Simbol ?"
msgid "Turkish" msgid "Turkish"
msgstr "turščina" msgstr "turščina"