Compare commits
33 Commits
release/2.
...
ver/2.1-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4aacc4abc5 | ||
|
|
2f6c789fdf | ||
|
|
57ceeadbe7 | ||
|
|
3b297c8427 | ||
|
|
92374e57a8 | ||
|
|
ace7551281 | ||
|
|
15e5f2d9e2 | ||
|
|
08397415c4 | ||
|
|
6dff6eed4f | ||
|
|
acbae76737 | ||
|
|
cc4a150501 | ||
|
|
186dbee443 | ||
|
|
716dde0a84 | ||
|
|
155642a3f9 | ||
|
|
7cb0317544 | ||
|
|
87a2828ce0 | ||
|
|
806aa550a5 | ||
|
|
ca306345c2 | ||
|
|
03ff056898 | ||
|
|
9f083bb521 | ||
|
|
a224454b3c | ||
|
|
bd0fdba435 | ||
|
|
87814981db | ||
|
|
acf86e2ce0 | ||
|
|
1016d5f738 | ||
|
|
4d53785af7 | ||
|
|
8e2a3860e3 | ||
|
|
0c2e666d0f | ||
|
|
d6075327ef | ||
|
|
14e665fdf2 | ||
|
|
55e2ee8c4d | ||
|
|
f444355d6d | ||
|
|
feb3c7c150 |
Submodule MSI/MSIBuild updated: 977949addd...576b84d74d
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featUpdCheck
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
|
||||
[splosno]
|
||||
jezik=0
|
||||
deli=featZRCola
|
||||
deli=featZRCola featUpdCheck
|
||||
|
||||
[parametri]
|
||||
|
||||
10
README.md
10
README.md
@@ -15,15 +15,15 @@ https://www.amebis.si/prenos/ZRCola/
|
||||
- Microsoft Visual Studio 2010 SP1
|
||||
- _sed.exe_ and _grep.exe_
|
||||
- Command line utilities from Microsoft Windows SDK Bin folder: distributed with Visual Studio, add Bin folder to path manually.
|
||||
- Additional command line utilities from project’s bin folder: add bin folder to path. The source code is provided on request.
|
||||
- Additional command line utilities from project's bin folder: add bin folder to path. The source code is provided on request.
|
||||
|
||||
### Digital Signing of Build Outputs
|
||||
In order to have the build process digitally sign output files, one should provide the following:
|
||||
|
||||
1. A signing certificate installed in the current user’s certificate store.
|
||||
1. A signing certificate installed in the current user's certificate store.
|
||||
2. The following variables in the environment:
|
||||
- `ManifestCertificateThumbprint` - set the value to certificate’s SHA1 thumbprint (hexadecimal, without spaces, i.e. `bc0d8da45f9eeefcbe4e334e1fc262804df88d7e`).
|
||||
- `ManifestTimestampUrl` - set the value to URL used to perform timestamp signature (i.e. `http://timestamp.verisign.com/scripts/timstamp.dll`). In order to perform timestamp signing successfully, the computer running the build should be online and able to access this URL.
|
||||
- `ManifestCertificateThumbprint` - set the value to certificate's SHA1 thumbprint (hexadecimal, without spaces, i.e. `bc0d8da45f9eeefcbe4e334e1fc262804df88d7e`).
|
||||
- `ManifestTimestampUrl` - set the value to URL used to perform timestamp signature (i.e. `http://timestamp.verisign.com/scripts/timstamp.dll`). In order to perform timestamp signing successfully, the computer running the build should be online and able to access this URL.
|
||||
|
||||
Please note that only Release builds are configured for timestamp signing. Debug configurations do not attempt to timestamp sign the resulting DLL and EXE files in order to speed up the building process and enable offline building.
|
||||
|
||||
@@ -36,7 +36,7 @@ Use Microsoft NMAKE to build the project. The resulting files can be found in ou
|
||||
- `nmake Register` Build a debug version of project, install fonts (reboot required), and Start Menu shortcuts. For development purposes only!
|
||||
- `nmake Unregister` Remove Start Menu shortcuts, and fonts. For development purposes only!
|
||||
|
||||
The `/ls` flag can be appended to the commands above to reduce NMAKE’s verbosity. You can combine multiple targets (i.e. nmake Unregister Clean). Please, see NMAKE reference for further reading.
|
||||
The `/ls` flag can be appended to the commands above to reduce NMAKE's verbosity. You can combine multiple targets (i.e. nmake Unregister Clean). Please, see NMAKE reference for further reading.
|
||||
|
||||
## Contact Information
|
||||
Please contact the following addressee for further information and help:
|
||||
|
||||
@@ -200,9 +200,9 @@ All :: "$(LANG).$(PLAT).$(CFG).InstallUISequence-1.idt"
|
||||
Action Condition Sequence
|
||||
s$(MSIBUILD_LENGTH_ID) S255 I2
|
||||
InstallUISequence Action
|
||||
dlgTutorial1 NOT Installed 1400
|
||||
dlgTutorial2 NOT Installed 1401
|
||||
dlgTutorial3 NOT Installed 1402
|
||||
dlgTutorial1 NOT Installed AND &featZRCola>=3 1400
|
||||
dlgTutorial2 NOT Installed AND &featZRCola>=3 1401
|
||||
dlgTutorial3 NOT Installed AND &featZRCola>=3 1402
|
||||
<<NOKEEP
|
||||
|
||||
|
||||
|
||||
1047
ZRCola/ZRCola.fbp
1047
ZRCola/ZRCola.fbp
File diff suppressed because it is too large
Load Diff
BIN
ZRCola/ZRCola.rc
BIN
ZRCola/ZRCola.rc
Binary file not shown.
@@ -128,6 +128,8 @@
|
||||
<ItemGroup>
|
||||
<None Include="locale\ZRCola.pot" />
|
||||
<None Include="res\char_select.ico" />
|
||||
<None Include="res\copy_composed_and_return.ico" />
|
||||
<None Include="res\copy_decomposed_and_return.ico" />
|
||||
<None Include="res\edit_copy.ico" />
|
||||
<None Include="res\edit_cut.ico" />
|
||||
<None Include="res\edit_paste.ico" />
|
||||
|
||||
@@ -137,6 +137,12 @@
|
||||
<None Include="res\navigate_forward.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
<None Include="res\copy_composed_and_return.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
<None Include="res\copy_decomposed_and_return.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="ZRCola.rc">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ZRCola\n"
|
||||
"POT-Creation-Date: 2016-10-18 10:07+0200\n"
|
||||
"POT-Creation-Date: 2017-04-03 12:01+0200\n"
|
||||
"PO-Revision-Date: 2016-05-13 15:52+0200\n"
|
||||
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
|
||||
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
|
||||
@@ -10,10 +10,9 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.10\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"X-Poedit-Basepath: ..\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
|
||||
"%100==4 ? 2 : 3);\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"
|
||||
"X-Poedit-KeywordsList: _\n"
|
||||
"X-Poedit-SearchPath-0: .\n"
|
||||
@@ -23,66 +22,69 @@ msgstr ""
|
||||
msgid "© 2004-%s ZRC SAZU"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolaapp.cpp:71 zrcolafrm.cpp:90 zrcolagui.cpp:874 zrcolagui.h:104
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: zrcolaapp.cpp:72 zrcolafrm.cpp:92 zrcolagui.cpp:980 zrcolagui.h:106
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "ZRCola"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1004
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1110
|
||||
msgid "Character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1025
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1131
|
||||
msgid "Context"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:363
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:379
|
||||
msgid "Request a New Character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:46 zrcolachrslct.cpp:226 zrcolachrslct.cpp:677
|
||||
#: zrcolachrslct.cpp:89
|
||||
msgid "Too many digits in Unicode."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:89 zrcolachrslct.cpp:107
|
||||
msgid "Validation conflict"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:107
|
||||
#, c-format
|
||||
msgid "Invalid character in Unicode found: %c"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:214 zrcolachrslct.cpp:390 zrcolachrslct.cpp:869
|
||||
msgid "▸ Search Options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:164
|
||||
#: zrcolachrslct.cpp:328
|
||||
msgid ", "
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:229 zrcolachrslct.cpp:674
|
||||
#: zrcolachrslct.cpp:393 zrcolachrslct.cpp:866
|
||||
msgid "▾ Search Options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:141
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid "ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:141 zrcolafrm.cpp:143
|
||||
#: zrcolafrm.cpp:143 zrcolafrm.cpp:145
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
#: zrcolafrm.cpp:145
|
||||
msgid "ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:351
|
||||
#: zrcolafrm.cpp:362
|
||||
msgid "http://zrcola.zrc-sazu.si/en/info/instructions/"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:375
|
||||
msgid ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
#: zrcolafrm.cpp:386
|
||||
msgid "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:36
|
||||
@@ -109,7 +111,7 @@ msgstr ""
|
||||
msgid "Find C&haracter..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:198
|
||||
msgid "Display character search to select character to insert into text"
|
||||
msgstr ""
|
||||
|
||||
@@ -117,421 +119,459 @@ msgstr ""
|
||||
msgid "&Send Composed"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:200
|
||||
msgid "Send composed text to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy Composed and &Return"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy composed text to clipboard and return focus to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
msgid "Send &Decomposed"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:98 zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:107 zrcolagui.cpp:202
|
||||
msgid "Send decomposed text to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy Decomposed and Re&turn"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy decomposed text to clipboard and return focus to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort (De)composition"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort composition and return focus to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "&Settings..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "Open program configuration dialog"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:121
|
||||
#: zrcolagui.cpp:139
|
||||
msgid "&Edit"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "&Edit Toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "Toggle edit toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "&Compose Toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "Toggle compose toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Character Catalo&g"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Toggle character catalog panel"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:138
|
||||
#: zrcolagui.cpp:156
|
||||
msgid "&View"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "&Instructions..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "Open a web site with product instructions"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Keyboard &Shortcuts..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Open a list of keyboard shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "&Request a new character..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "Submit a request to ZRC to add a new character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check for &Updates..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check online for product update"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:162
|
||||
#: zrcolagui.cpp:180
|
||||
msgid "&About..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:165
|
||||
#: zrcolagui.cpp:183
|
||||
msgid "&Help"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
msgid "Cut"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
msgid "Cut selection"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
msgid "Copy"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
msgid "Copy selection"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
msgid "Paste"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
msgid "Paste selection"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:177
|
||||
#: zrcolagui.cpp:195
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:198
|
||||
msgid "Find Character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:200
|
||||
msgid "Send Composed"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:202
|
||||
msgid "Send Decomposed"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:187
|
||||
#: zrcolagui.cpp:205
|
||||
msgid "Compose"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:191
|
||||
#: zrcolagui.cpp:209
|
||||
msgid "Character Catalog"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:195
|
||||
#: zrcolagui.cpp:213
|
||||
msgid "(De)Composer"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:234
|
||||
#: zrcolagui.cpp:252
|
||||
msgid "Decomposed Text"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:254
|
||||
#: zrcolagui.cpp:272
|
||||
msgid "Decomposed Unicode Dump"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:281
|
||||
#: zrcolagui.cpp:299
|
||||
msgid "Composed Text"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:301
|
||||
#: zrcolagui.cpp:319
|
||||
msgid "Composed Unicode Dump"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:355
|
||||
#: zrcolagui.cpp:373
|
||||
msgid "Select category to display"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:389
|
||||
#: zrcolagui.cpp:407
|
||||
msgid "Show &All"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:390
|
||||
#: zrcolagui.cpp:408
|
||||
msgid "Toggle display of less frequent characters"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:430
|
||||
#: zrcolagui.cpp:448
|
||||
msgid "&Browse"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:437
|
||||
msgid ""
|
||||
"Full or partial terms from Unicode character description (in English) to "
|
||||
"search for"
|
||||
#: zrcolagui.cpp:455
|
||||
msgid "Full or partial terms from Unicode character description (in English) to search for"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:441
|
||||
#: zrcolagui.cpp:459
|
||||
msgid "Search Options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:442
|
||||
#: zrcolagui.cpp:460
|
||||
msgid "Shows/hides additional search options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:454
|
||||
#: zrcolagui.cpp:472
|
||||
msgid "List of Unicode character categories to search in"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:461
|
||||
#: zrcolagui.cpp:479
|
||||
msgid "All"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:462
|
||||
#: zrcolagui.cpp:480
|
||||
msgid "Select all categories"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:466
|
||||
#: zrcolagui.cpp:484
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:467
|
||||
#: zrcolagui.cpp:485
|
||||
msgid "Clear category selection"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:471
|
||||
#: zrcolagui.cpp:489
|
||||
msgid "Invert"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:472
|
||||
#: zrcolagui.cpp:490
|
||||
msgid "Invert category selection"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:511
|
||||
#: zrcolagui.cpp:529
|
||||
msgid "Character search results"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:521
|
||||
#: zrcolagui.cpp:539
|
||||
msgid "Re¢ly Used"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:549
|
||||
#: zrcolagui.cpp:567
|
||||
msgid "List of recently inserted characters"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:563
|
||||
#: zrcolagui.cpp:581
|
||||
msgid "Preview"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:568
|
||||
#: zrcolagui.cpp:586
|
||||
msgid "U+"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:573
|
||||
#: zrcolagui.cpp:591
|
||||
msgid "Unicode hexadecimal code"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:578
|
||||
#: zrcolagui.cpp:596
|
||||
msgid "Keyboard shortcut in Composer window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:613
|
||||
#: zrcolagui.cpp:631
|
||||
msgid "Character preview"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:618
|
||||
#: zrcolagui.cpp:636
|
||||
msgid "Unicode character description"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:623
|
||||
#: zrcolagui.cpp:641
|
||||
msgid "Character tags"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:628
|
||||
#: zrcolagui.cpp:646
|
||||
msgid "Unicode character category"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:635
|
||||
#: zrcolagui.cpp:653
|
||||
msgid "« Back"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:637
|
||||
#: zrcolagui.cpp:655
|
||||
msgid "To previously viewed character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:641
|
||||
#: zrcolagui.cpp:659
|
||||
msgid "Forward »"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:643
|
||||
#: zrcolagui.cpp:661
|
||||
msgid "To following viewed character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:654
|
||||
#: zrcolagui.cpp:672
|
||||
msgid "Re&lated"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:681
|
||||
#: zrcolagui.cpp:699
|
||||
msgid "List of related characters"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:770
|
||||
#: zrcolagui.cpp:790
|
||||
msgid ""
|
||||
"Some character native to specific language you are working with should not "
|
||||
"decompose to primitives.\n"
|
||||
"Some character native to specific language you are working with should not decompose to primitives.\n"
|
||||
"For optimal decomposition you should set the language correctly."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:774
|
||||
#: zrcolagui.cpp:794
|
||||
msgid "Select language &automatically according to selected keyboard"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:777
|
||||
#: zrcolagui.cpp:797
|
||||
msgid "&Manually select the language from the list below:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:789
|
||||
#: zrcolagui.cpp:809
|
||||
msgid "Text Language"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:794
|
||||
#: zrcolagui.cpp:816
|
||||
msgid ""
|
||||
"ZRCola can be launched every time you log in to your computer.\n"
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 "
|
||||
"and Win+F6."
|
||||
"ZRCola offers multiple text transformations that can be arranged in a sequence.\n"
|
||||
"Please select desired transformations and the order they are applied."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:798
|
||||
msgid "Start ZRCola &automatically on logon"
|
||||
#: zrcolagui.cpp:831
|
||||
msgid "A&vailable:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:805
|
||||
msgid "Startup"
|
||||
#: zrcolagui.cpp:844
|
||||
msgid ">"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:847
|
||||
msgid "<"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:856
|
||||
msgid "&Active:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:872
|
||||
msgid "Up"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:875
|
||||
msgid "Down"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:885
|
||||
msgid "Transformation"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:892
|
||||
msgid ""
|
||||
"ZRCola can be launched every time you log in to your computer.\n"
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 and Win+F6."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:896
|
||||
msgid "Start ZRCola &automatically on logon"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:903
|
||||
msgid "Startup"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:991
|
||||
msgid ""
|
||||
"Program and Website Editor: Janoš Ježovnik\n"
|
||||
"Development: Amebis, d. o. o., Kamnik\n"
|
||||
"Translation into English: Janoš Ježovnik\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia "
|
||||
"Plotnikova\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia Plotnikova\n"
|
||||
"Development and maintenance of the original program (2004–2015): Peter Weiss"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:893
|
||||
#: zrcolagui.cpp:999
|
||||
msgid "zrcola.zrc-sazu.si"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:899
|
||||
msgid ""
|
||||
"Texts made using ZRCola have to include in a footnote or some other "
|
||||
"appropriate part of the publication the note below:"
|
||||
#: zrcolagui.cpp:1005
|
||||
msgid "Texts made using ZRCola have to include in a footnote or some other appropriate part of the publication the note below:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:903
|
||||
msgid ""
|
||||
"This text was written using the ZRCola input system (http://zrcola.zrc-sazu."
|
||||
"si), developed at the Science and Research Centre of SAZU in Ljubljana "
|
||||
"(http://www.zrc-sazu.si) by Peter Weiss."
|
||||
#: zrcolagui.cpp:1009
|
||||
msgid "This text was written using the ZRCola input system (http://zrcola.zrc-sazu.si), developed at the Science and Research Centre of SAZU in Ljubljana (http://www.zrc-sazu.si) by Peter Weiss."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:944
|
||||
#: zrcolagui.cpp:1050
|
||||
msgid "Log"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:960
|
||||
#: zrcolagui.cpp:1066
|
||||
msgid "Quit and &Update..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:962
|
||||
#: zrcolagui.cpp:1068
|
||||
msgid "Exit this program and launch product update"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:966
|
||||
#: zrcolagui.cpp:1072
|
||||
msgid "&Close"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:967
|
||||
#: zrcolagui.cpp:1073
|
||||
msgid "Close this window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1006
|
||||
#: zrcolagui.cpp:1112
|
||||
msgid "Enter the &character you would like to request:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1013
|
||||
#: zrcolagui.cpp:1119
|
||||
msgid "Decomposed character to request"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1017
|
||||
#: zrcolagui.cpp:1123
|
||||
msgid ""
|
||||
"Please, use the decomposed form.\n"
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste "
|
||||
"it from the Decomposed window."
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste it from the Decomposed window."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1027
|
||||
msgid ""
|
||||
"The &context, examples or description why and where the character is "
|
||||
"required:"
|
||||
#: zrcolagui.cpp:1133
|
||||
msgid "The &context, examples or description why and where the character is required:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1033
|
||||
#: zrcolagui.cpp:1139
|
||||
msgid "Additional notes for character request"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1040
|
||||
#: zrcolagui.cpp:1146
|
||||
msgid ""
|
||||
"After clicking OK button, your e-mail application should open allowing you "
|
||||
"to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but "
|
||||
"the Editor will be able to read them correctly anyway."
|
||||
"After clicking OK button, your e-mail application should open allowing you to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but the Editor will be able to read them correctly anyway."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolakeyhndlr.cpp:44
|
||||
msgid ""
|
||||
"INS key is pressed. Type the Unicode code of desired character now (up to "
|
||||
"four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgid "INS key is pressed. Type the Unicode code of desired character now (up to four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolasettings.cpp:93
|
||||
#: zrcolasettings.cpp:90
|
||||
#, c-format
|
||||
msgid "Unknown transformation (%u)"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolasettings.cpp:181
|
||||
msgid "Start ZRCola automatically on logon"
|
||||
msgstr ""
|
||||
|
||||
@@ -541,139 +581,92 @@ msgid ""
|
||||
"Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:334
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:350
|
||||
msgid "Product Update"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.h:246
|
||||
#: zrcolagui.h:248
|
||||
msgid "Character Search"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.h:283
|
||||
#: zrcolagui.h:299
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.h:309
|
||||
#: zrcolagui.h:325
|
||||
msgid "About ZRCola"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:15
|
||||
msgid "binUIHeader.bmp"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:5
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Starting"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:6
|
||||
msgid "bintutorial1.bmp"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:7
|
||||
msgid ""
|
||||
"When configured, ZRCola starts at system startup and runs in the background. "
|
||||
"If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgid "When configured, ZRCola starts at system startup and runs in the background. If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:8
|
||||
msgid ""
|
||||
"IMPORTANT: Upon pressing the combination Win+F5 the program memorises the "
|
||||
"location of the cursor in the text. If ZRCola is brought to the foreground "
|
||||
"without using the aforementioned combination of keys, the program won't know "
|
||||
"where to insert the special characters!"
|
||||
msgid "IMPORTANT: Upon pressing the combination Win+F5 the program memorises the location of the cursor in the text. If ZRCola is brought to the foreground without using the aforementioned combination of keys, the program won't know where to insert the special characters!"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:19
|
||||
msgid "&Continue"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:11
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Composition"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:12
|
||||
msgid "bintutorial2.bmp"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:13
|
||||
msgid ""
|
||||
"The string of basic and substitute characters is entered into the upper "
|
||||
"input window of the program. In the window below the resulted special "
|
||||
"characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgid "The string of basic and substitute characters is entered into the upper input window of the program. In the window below the resulted special characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:16
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Entering Characters"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:17
|
||||
msgid "bintutorial3.bmp"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:18
|
||||
msgid ""
|
||||
"Characters can be entered using keyboard shortcuts, the character catalogue "
|
||||
"(F4) or the character finding tool (F8)."
|
||||
msgid "Characters can be entered using keyboard shortcuts, the character catalogue (F4) or the character finding tool (F8)."
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "Input system for linguistic use"
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ZRCola\n"
|
||||
"POT-Creation-Date: 2016-10-18 10:10+0200\n"
|
||||
"PO-Revision-Date: 2016-10-18 10:10+0200\n"
|
||||
"POT-Creation-Date: 2017-04-03 12:04+0200\n"
|
||||
"PO-Revision-Date: 2017-04-03 12:05+0200\n"
|
||||
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
|
||||
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
|
||||
"Language: de_DE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.10\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
@@ -20,74 +20,75 @@ msgstr ""
|
||||
msgid "© 2004-%s ZRC SAZU"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolaapp.cpp:71 zrcolafrm.cpp:90 zrcolagui.cpp:874 zrcolagui.h:104
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: zrcolaapp.cpp:72 zrcolafrm.cpp:92 zrcolagui.cpp:980 zrcolagui.h:106
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "ZRCola"
|
||||
msgstr "ZRCola"
|
||||
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1004
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1110
|
||||
#, fuzzy
|
||||
msgid "Character"
|
||||
msgstr "Eingabe eines Zeichenstils"
|
||||
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1025
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1131
|
||||
#, fuzzy
|
||||
msgid "Context"
|
||||
msgstr "Konnte den Kontext auf dem überlagerten Fenster nicht initialisieren."
|
||||
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:363
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:379
|
||||
msgid "Request a New Character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:46 zrcolachrslct.cpp:226 zrcolachrslct.cpp:677
|
||||
#: zrcolachrslct.cpp:89
|
||||
msgid "Too many digits in Unicode."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:89 zrcolachrslct.cpp:107
|
||||
msgid "Validation conflict"
|
||||
msgstr "Fehler bei der Validierung"
|
||||
|
||||
#: zrcolachrslct.cpp:107
|
||||
#, c-format
|
||||
msgid "Invalid character in Unicode found: %c"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:214 zrcolachrslct.cpp:390 zrcolachrslct.cpp:869
|
||||
msgid "▸ Search Options"
|
||||
msgstr ""
|
||||
|
||||
# Recitation separator
|
||||
#: zrcolachrslct.cpp:164
|
||||
#: zrcolachrslct.cpp:328
|
||||
#, fuzzy
|
||||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: zrcolachrslct.cpp:229 zrcolachrslct.cpp:674
|
||||
#: zrcolachrslct.cpp:393 zrcolachrslct.cpp:866
|
||||
msgid "▾ Search Options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:141
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid "ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:141 zrcolafrm.cpp:143
|
||||
#: zrcolafrm.cpp:143 zrcolafrm.cpp:145
|
||||
#, fuzzy
|
||||
msgid "Warning"
|
||||
msgstr "Warnung: "
|
||||
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
#: zrcolafrm.cpp:145
|
||||
msgid "ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolafrm.cpp:351
|
||||
#: zrcolafrm.cpp:362
|
||||
msgid "http://zrcola.zrc-sazu.si/en/info/instructions/"
|
||||
msgstr "http://zrcola.zrc-sazu.si/de/info/instructions/"
|
||||
|
||||
#: zrcolafrm.cpp:375
|
||||
msgid ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
#: zrcolafrm.cpp:386
|
||||
msgid "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
|
||||
#: zrcolagui.cpp:36
|
||||
msgid "E&xit"
|
||||
@@ -117,7 +118,7 @@ msgstr ""
|
||||
msgid "Find C&haracter..."
|
||||
msgstr "Eingabe eines Zeichenstils"
|
||||
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:198
|
||||
msgid "Display character search to select character to insert into text"
|
||||
msgstr ""
|
||||
|
||||
@@ -126,451 +127,489 @@ msgstr ""
|
||||
msgid "&Send Composed"
|
||||
msgstr "Pošlji sestavljeno (F5)"
|
||||
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:200
|
||||
msgid "Send composed text to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy Composed and &Return"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy composed text to clipboard and return focus to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#, fuzzy
|
||||
msgid "Send &Decomposed"
|
||||
msgstr "Pošlji razstavljeno (F6)"
|
||||
|
||||
#: zrcolagui.cpp:98 zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:107 zrcolagui.cpp:202
|
||||
msgid "Send decomposed text to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy Decomposed and Re&turn"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy decomposed text to clipboard and return focus to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort (De)composition"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort composition and return focus to source window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "&Settings..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "Open program configuration dialog"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:121
|
||||
#: zrcolagui.cpp:139
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "&Bearbeiten"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "&Edit Toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "Toggle edit toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "&Compose Toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "Toggle compose toolbar"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Character Catalo&g"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Toggle character catalog panel"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:138
|
||||
#: zrcolagui.cpp:156
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "&Ansicht..."
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "&Instructions..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "Open a web site with product instructions"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Keyboard &Shortcuts..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Open a list of keyboard shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "&Request a new character..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "Submit a request to ZRC to add a new character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check for &Updates..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check online for product update"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:162
|
||||
#: zrcolagui.cpp:180
|
||||
msgid "&About..."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:165
|
||||
#: zrcolagui.cpp:183
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "&Hilfe"
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
#, fuzzy
|
||||
msgid "Cut"
|
||||
msgstr "Ausschneiden"
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
#, fuzzy
|
||||
msgid "Cut selection"
|
||||
msgstr "Auswahl ausschneiden"
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
#, fuzzy
|
||||
msgid "Copy"
|
||||
msgstr "Kopieren"
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
#, fuzzy
|
||||
msgid "Copy selection"
|
||||
msgstr "Auswahl kopieren"
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
#, fuzzy
|
||||
msgid "Paste"
|
||||
msgstr "Einfügen"
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
#, fuzzy
|
||||
msgid "Paste selection"
|
||||
msgstr "Auswahl einfügen"
|
||||
|
||||
#: zrcolagui.cpp:177
|
||||
#: zrcolagui.cpp:195
|
||||
#, fuzzy
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
#: zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:198
|
||||
#, fuzzy
|
||||
msgid "Find Character"
|
||||
msgstr "Eingabe eines Zeichenstils"
|
||||
|
||||
#: zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:200
|
||||
#, fuzzy
|
||||
msgid "Send Composed"
|
||||
msgstr "Pošlji sestavljeno (F5)"
|
||||
|
||||
#: zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:202
|
||||
#, fuzzy
|
||||
msgid "Send Decomposed"
|
||||
msgstr "Pošlji razstavljeno (F6)"
|
||||
|
||||
#: zrcolagui.cpp:187
|
||||
#: zrcolagui.cpp:205
|
||||
msgid "Compose"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:191
|
||||
#: zrcolagui.cpp:209
|
||||
msgid "Character Catalog"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:195
|
||||
#: zrcolagui.cpp:213
|
||||
msgid "(De)Composer"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:234
|
||||
#: zrcolagui.cpp:252
|
||||
msgid "Decomposed Text"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:254
|
||||
#: zrcolagui.cpp:272
|
||||
msgid "Decomposed Unicode Dump"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:281
|
||||
#: zrcolagui.cpp:299
|
||||
msgid "Composed Text"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:301
|
||||
#: zrcolagui.cpp:319
|
||||
msgid "Composed Unicode Dump"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:355
|
||||
#: zrcolagui.cpp:373
|
||||
msgid "Select category to display"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:389
|
||||
#: zrcolagui.cpp:407
|
||||
#, fuzzy
|
||||
msgid "Show &All"
|
||||
msgstr "Alles zeigen"
|
||||
|
||||
#: zrcolagui.cpp:390
|
||||
#: zrcolagui.cpp:408
|
||||
msgid "Toggle display of less frequent characters"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:430
|
||||
#: zrcolagui.cpp:448
|
||||
#, fuzzy
|
||||
msgid "&Browse"
|
||||
msgstr "Durchsuchen"
|
||||
|
||||
#: zrcolagui.cpp:437
|
||||
msgid ""
|
||||
"Full or partial terms from Unicode character description (in English) to "
|
||||
"search for"
|
||||
#: zrcolagui.cpp:455
|
||||
msgid "Full or partial terms from Unicode character description (in English) to search for"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:441
|
||||
#: zrcolagui.cpp:459
|
||||
msgid "Search Options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:442
|
||||
#: zrcolagui.cpp:460
|
||||
msgid "Shows/hides additional search options"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:454
|
||||
#: zrcolagui.cpp:472
|
||||
msgid "List of Unicode character categories to search in"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:461
|
||||
#: zrcolagui.cpp:479
|
||||
#, fuzzy
|
||||
msgid "All"
|
||||
msgstr "Alle"
|
||||
|
||||
#: zrcolagui.cpp:462
|
||||
#: zrcolagui.cpp:480
|
||||
msgid "Select all categories"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:466
|
||||
#: zrcolagui.cpp:484
|
||||
#, fuzzy
|
||||
msgid "None"
|
||||
msgstr "Kein"
|
||||
|
||||
#: zrcolagui.cpp:467
|
||||
#: zrcolagui.cpp:485
|
||||
#, fuzzy
|
||||
msgid "Clear category selection"
|
||||
msgstr "Auswahl kopieren"
|
||||
|
||||
#: zrcolagui.cpp:471
|
||||
#: zrcolagui.cpp:489
|
||||
msgid "Invert"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:472
|
||||
#: zrcolagui.cpp:490
|
||||
#, fuzzy
|
||||
msgid "Invert category selection"
|
||||
msgstr "Auswahl einfügen"
|
||||
|
||||
#: zrcolagui.cpp:511
|
||||
#: zrcolagui.cpp:529
|
||||
#, fuzzy
|
||||
msgid "Character search results"
|
||||
msgstr "Skupine &znakov"
|
||||
|
||||
#: zrcolagui.cpp:521
|
||||
#: zrcolagui.cpp:539
|
||||
msgid "Re¢ly Used"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:549
|
||||
#: zrcolagui.cpp:567
|
||||
msgid "List of recently inserted characters"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:563
|
||||
#: zrcolagui.cpp:581
|
||||
#, fuzzy
|
||||
msgid "Preview"
|
||||
msgstr " Vorschau"
|
||||
|
||||
#: zrcolagui.cpp:568
|
||||
#: zrcolagui.cpp:586
|
||||
msgid "U+"
|
||||
msgstr "U+"
|
||||
|
||||
#: zrcolagui.cpp:573
|
||||
#: zrcolagui.cpp:591
|
||||
msgid "Unicode hexadecimal code"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:578
|
||||
#: zrcolagui.cpp:596
|
||||
msgid "Keyboard shortcut in Composer window"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:613
|
||||
#: zrcolagui.cpp:631
|
||||
#, fuzzy
|
||||
msgid "Character preview"
|
||||
msgstr "Skupine &znakov"
|
||||
|
||||
#: zrcolagui.cpp:618
|
||||
#: zrcolagui.cpp:636
|
||||
msgid "Unicode character description"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:623
|
||||
#, fuzzy
|
||||
msgid "Character tags"
|
||||
msgstr "Eingabe eines Zeichenstils"
|
||||
|
||||
#: zrcolagui.cpp:628
|
||||
msgid "Unicode character category"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:635
|
||||
#, fuzzy
|
||||
msgid "« Back"
|
||||
msgstr "< &Zurück"
|
||||
|
||||
#: zrcolagui.cpp:637
|
||||
msgid "To previously viewed character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:641
|
||||
#, fuzzy
|
||||
msgid "Character tags"
|
||||
msgstr "Eingabe eines Zeichenstils"
|
||||
|
||||
#: zrcolagui.cpp:646
|
||||
msgid "Unicode character category"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:653
|
||||
#, fuzzy
|
||||
msgid "« Back"
|
||||
msgstr "< &Zurück"
|
||||
|
||||
#: zrcolagui.cpp:655
|
||||
msgid "To previously viewed character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:659
|
||||
#, fuzzy
|
||||
msgid "Forward »"
|
||||
msgstr "&Vorwärts"
|
||||
|
||||
#: zrcolagui.cpp:643
|
||||
#: zrcolagui.cpp:661
|
||||
msgid "To following viewed character"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:654
|
||||
#: zrcolagui.cpp:672
|
||||
msgid "Re&lated"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:681
|
||||
#: zrcolagui.cpp:699
|
||||
msgid "List of related characters"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:770
|
||||
#: zrcolagui.cpp:790
|
||||
msgid ""
|
||||
"Some character native to specific language you are working with should not "
|
||||
"decompose to primitives.\n"
|
||||
"Some character native to specific language you are working with should not decompose to primitives.\n"
|
||||
"For optimal decomposition you should set the language correctly."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:774
|
||||
#: zrcolagui.cpp:794
|
||||
msgid "Select language &automatically according to selected keyboard"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:777
|
||||
#: zrcolagui.cpp:797
|
||||
msgid "&Manually select the language from the list below:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:789
|
||||
#: zrcolagui.cpp:809
|
||||
msgid "Text Language"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:794
|
||||
#: zrcolagui.cpp:816
|
||||
msgid ""
|
||||
"ZRCola can be launched every time you log in to your computer.\n"
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 "
|
||||
"and Win+F6."
|
||||
"ZRCola offers multiple text transformations that can be arranged in a sequence.\n"
|
||||
"Please select desired transformations and the order they are applied."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:798
|
||||
msgid "Start ZRCola &automatically on logon"
|
||||
#: zrcolagui.cpp:831
|
||||
msgid "A&vailable:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:805
|
||||
msgid "Startup"
|
||||
#: zrcolagui.cpp:844
|
||||
msgid ">"
|
||||
msgstr ">"
|
||||
|
||||
#: zrcolagui.cpp:847
|
||||
msgid "<"
|
||||
msgstr "<"
|
||||
|
||||
#: zrcolagui.cpp:856
|
||||
msgid "&Active:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:872
|
||||
msgid "Up"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:875
|
||||
msgid "Down"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:885
|
||||
msgid "Transformation"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:892
|
||||
msgid ""
|
||||
"ZRCola can be launched every time you log in to your computer.\n"
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 and Win+F6."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:896
|
||||
msgid "Start ZRCola &automatically on logon"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:903
|
||||
msgid "Startup"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:991
|
||||
msgid ""
|
||||
"Program and Website Editor: Janoš Ježovnik\n"
|
||||
"Development: Amebis, d. o. o., Kamnik\n"
|
||||
"Translation into English: Janoš Ježovnik\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia "
|
||||
"Plotnikova\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia Plotnikova\n"
|
||||
"Development and maintenance of the original program (2004–2015): Peter Weiss"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:893
|
||||
#: zrcolagui.cpp:999
|
||||
msgid "zrcola.zrc-sazu.si"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:899
|
||||
msgid ""
|
||||
"Texts made using ZRCola have to include in a footnote or some other "
|
||||
"appropriate part of the publication the note below:"
|
||||
#: zrcolagui.cpp:1005
|
||||
msgid "Texts made using ZRCola have to include in a footnote or some other appropriate part of the publication the note below:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:903
|
||||
msgid ""
|
||||
"This text was written using the ZRCola input system (http://zrcola.zrc-sazu."
|
||||
"si), developed at the Science and Research Centre of SAZU in Ljubljana "
|
||||
"(http://www.zrc-sazu.si) by Peter Weiss."
|
||||
#: zrcolagui.cpp:1009
|
||||
msgid "This text was written using the ZRCola input system (http://zrcola.zrc-sazu.si), developed at the Science and Research Centre of SAZU in Ljubljana (http://www.zrc-sazu.si) by Peter Weiss."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:944
|
||||
#: zrcolagui.cpp:1050
|
||||
#, fuzzy
|
||||
msgid "Log"
|
||||
msgstr "&Log"
|
||||
|
||||
#: zrcolagui.cpp:960
|
||||
#: zrcolagui.cpp:1066
|
||||
#, fuzzy
|
||||
msgid "Quit and &Update..."
|
||||
msgstr "Kann Benutzer-Konfigurationsdatei nicht aktualisieren."
|
||||
|
||||
#: zrcolagui.cpp:962
|
||||
#: zrcolagui.cpp:1068
|
||||
msgid "Exit this program and launch product update"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:966
|
||||
#: zrcolagui.cpp:1072
|
||||
#, fuzzy
|
||||
msgid "&Close"
|
||||
msgstr "&Schließen"
|
||||
|
||||
#: zrcolagui.cpp:967
|
||||
#: zrcolagui.cpp:1073
|
||||
#, fuzzy
|
||||
msgid "Close this window"
|
||||
msgstr "Fenster schließen"
|
||||
|
||||
#: zrcolagui.cpp:1006
|
||||
#: zrcolagui.cpp:1112
|
||||
msgid "Enter the &character you would like to request:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1013
|
||||
#: zrcolagui.cpp:1119
|
||||
msgid "Decomposed character to request"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1017
|
||||
#: zrcolagui.cpp:1123
|
||||
msgid ""
|
||||
"Please, use the decomposed form.\n"
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste "
|
||||
"it from the Decomposed window."
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste it from the Decomposed window."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1027
|
||||
msgid ""
|
||||
"The &context, examples or description why and where the character is "
|
||||
"required:"
|
||||
#: zrcolagui.cpp:1133
|
||||
msgid "The &context, examples or description why and where the character is required:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1033
|
||||
#: zrcolagui.cpp:1139
|
||||
msgid "Additional notes for character request"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:1040
|
||||
#: zrcolagui.cpp:1146
|
||||
msgid ""
|
||||
"After clicking OK button, your e-mail application should open allowing you "
|
||||
"to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but "
|
||||
"the Editor will be able to read them correctly anyway."
|
||||
"After clicking OK button, your e-mail application should open allowing you to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but the Editor will be able to read them correctly anyway."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolakeyhndlr.cpp:44
|
||||
msgid ""
|
||||
"INS key is pressed. Type the Unicode code of desired character now (up to "
|
||||
"four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgid "INS key is pressed. Type the Unicode code of desired character now (up to four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolasettings.cpp:93
|
||||
#: zrcolasettings.cpp:90
|
||||
#, c-format
|
||||
msgid "Unknown transformation (%u)"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolasettings.cpp:181
|
||||
msgid "Start ZRCola automatically on logon"
|
||||
msgstr ""
|
||||
|
||||
@@ -580,81 +619,55 @@ msgid ""
|
||||
"Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:334
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:350
|
||||
msgid "Product Update"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.h:246
|
||||
#: zrcolagui.h:248
|
||||
#, fuzzy
|
||||
msgid "Character Search"
|
||||
msgstr "Skupine &znakov"
|
||||
|
||||
#: zrcolagui.h:283
|
||||
#: zrcolagui.h:299
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.h:309
|
||||
#: zrcolagui.h:325
|
||||
msgid "About ZRCola"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:15
|
||||
msgid "binUIHeader.bmp"
|
||||
msgstr "binUIHeader.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:5
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Starting"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:6
|
||||
msgid "bintutorial1.bmp"
|
||||
msgstr "bintutorial1.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:7
|
||||
msgid ""
|
||||
"When configured, ZRCola starts at system startup and runs in the background. "
|
||||
"If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgid "When configured, ZRCola starts at system startup and runs in the background. If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:8
|
||||
msgid ""
|
||||
"IMPORTANT: Upon pressing the combination Win+F5 the program memorises the "
|
||||
"location of the cursor in the text. If ZRCola is brought to the foreground "
|
||||
"without using the aforementioned combination of keys, the program won't know "
|
||||
"where to insert the special characters!"
|
||||
msgid "IMPORTANT: Upon pressing the combination Win+F5 the program memorises the location of the cursor in the text. If ZRCola is brought to the foreground without using the aforementioned combination of keys, the program won't know where to insert the special characters!"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:19
|
||||
@@ -662,59 +675,38 @@ msgstr ""
|
||||
msgid "&Continue"
|
||||
msgstr "Konnte den Kontext auf dem überlagerten Fenster nicht initialisieren."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:11
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Composition"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:12
|
||||
msgid "bintutorial2.bmp"
|
||||
msgstr "bintutorial2.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:13
|
||||
msgid ""
|
||||
"The string of basic and substitute characters is entered into the upper "
|
||||
"input window of the program. In the window below the resulted special "
|
||||
"characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgid "The string of basic and substitute characters is entered into the upper input window of the program. In the window below the resulted special characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:16
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Entering Characters"
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:17
|
||||
msgid "bintutorial3.bmp"
|
||||
msgstr "bintutorial3.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:18
|
||||
msgid ""
|
||||
"Characters can be entered using keyboard shortcuts, the character catalogue "
|
||||
"(F4) or the character finding tool (F8)."
|
||||
msgid "Characters can be entered using keyboard shortcuts, the character catalogue (F4) or the character finding tool (F8)."
|
||||
msgstr ""
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "Input system for linguistic use"
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ZRCola\n"
|
||||
"POT-Creation-Date: 2016-10-18 10:09+0200\n"
|
||||
"PO-Revision-Date: 2016-10-18 10:10+0200\n"
|
||||
"POT-Creation-Date: 2017-04-03 12:04+0200\n"
|
||||
"PO-Revision-Date: 2017-04-03 12:04+0200\n"
|
||||
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
|
||||
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
|
||||
"Language: ru_RU\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.10\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"X-Poedit-Basepath: .\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"
|
||||
"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"
|
||||
"X-Poedit-KeywordsList: _\n"
|
||||
|
||||
@@ -21,74 +20,71 @@ msgstr ""
|
||||
msgid "© 2004-%s ZRC SAZU"
|
||||
msgstr "© 2004–%s ZRC SAZU"
|
||||
|
||||
#: zrcolaapp.cpp:71 zrcolafrm.cpp:90 zrcolagui.cpp:874 zrcolagui.h:104
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: zrcolaapp.cpp:72 zrcolafrm.cpp:92 zrcolagui.cpp:980 zrcolagui.h:106
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "ZRCola"
|
||||
msgstr "ZRCola"
|
||||
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1004
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1110
|
||||
msgid "Character"
|
||||
msgstr "Знак"
|
||||
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1025
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1131
|
||||
msgid "Context"
|
||||
msgstr "Контекст"
|
||||
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:363
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:379
|
||||
msgid "Request a New Character"
|
||||
msgstr "Запрос нового знака"
|
||||
|
||||
#: zrcolachrslct.cpp:46 zrcolachrslct.cpp:226 zrcolachrslct.cpp:677
|
||||
#: zrcolachrslct.cpp:89
|
||||
msgid "Too many digits in Unicode."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:89 zrcolachrslct.cpp:107
|
||||
msgid "Validation conflict"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:107
|
||||
#, c-format
|
||||
msgid "Invalid character in Unicode found: %c"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolachrslct.cpp:214 zrcolachrslct.cpp:390 zrcolachrslct.cpp:869
|
||||
msgid "▸ Search Options"
|
||||
msgstr "▸ Опции поиска"
|
||||
|
||||
# Recitation separator
|
||||
#: zrcolachrslct.cpp:164
|
||||
#: zrcolachrslct.cpp:328
|
||||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: zrcolachrslct.cpp:229 zrcolachrslct.cpp:674
|
||||
#: zrcolachrslct.cpp:393 zrcolachrslct.cpp:866
|
||||
msgid "▾ Search Options"
|
||||
msgstr "▾ Опции поиска"
|
||||
|
||||
#: zrcolafrm.cpp:141
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
msgstr ""
|
||||
"Сочетание клавиш Win+F5 \n"
|
||||
"регистрировать. Некоторые функциональности не будут доступны."
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid "ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."
|
||||
msgstr "Сочетание клавиш Win+F5 регистрировать. Некоторые функциональности не будут доступны."
|
||||
|
||||
#: zrcolafrm.cpp:141 zrcolafrm.cpp:143
|
||||
#: zrcolafrm.cpp:143 zrcolafrm.cpp:145
|
||||
msgid "Warning"
|
||||
msgstr "Предупреждение"
|
||||
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
msgstr ""
|
||||
"Сочетание клавиш Win+F6 невозможно регистрировать. Некоторые "
|
||||
"функциональности не будут доступны."
|
||||
#: zrcolafrm.cpp:145
|
||||
msgid "ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."
|
||||
msgstr "Сочетание клавиш Win+F6 невозможно регистрировать. Некоторые функциональности не будут доступны."
|
||||
|
||||
#: zrcolafrm.cpp:351
|
||||
#: zrcolafrm.cpp:362
|
||||
msgid "http://zrcola.zrc-sazu.si/en/info/instructions/"
|
||||
msgstr "http://zrcola.zrc-sazu.si/ru/info/instructions/"
|
||||
|
||||
#: zrcolafrm.cpp:375
|
||||
msgid ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
#: zrcolafrm.cpp:386
|
||||
msgid "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
|
||||
#: zrcolagui.cpp:36
|
||||
msgid "E&xit"
|
||||
@@ -114,7 +110,7 @@ msgstr "Выделить весь текст"
|
||||
msgid "Find C&haracter..."
|
||||
msgstr "Поиск &знака ..."
|
||||
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:198
|
||||
msgid "Display character search to select character to insert into text"
|
||||
msgstr "Показать браузер знаков для вставления выбранного знака"
|
||||
|
||||
@@ -122,449 +118,472 @@ msgstr "Показать браузер знаков для вставления
|
||||
msgid "&Send Composed"
|
||||
msgstr "&Послать составленное"
|
||||
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:200
|
||||
msgid "Send composed text to source window"
|
||||
msgstr "Послать составленный текст в исходное окно"
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy Composed and &Return"
|
||||
msgstr "Копировать составленное и &возвратиться"
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy composed text to clipboard and return focus to source window"
|
||||
msgstr "Копировать составленный текст в буфер обмена и возвратить фокус в исходное окно"
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
msgid "Send &Decomposed"
|
||||
msgstr "Послать &разобранное"
|
||||
|
||||
#: zrcolagui.cpp:98 zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:107 zrcolagui.cpp:202
|
||||
msgid "Send decomposed text to source window"
|
||||
msgstr "Послать разобранный текст в исходное окно"
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy Decomposed and Re&turn"
|
||||
msgstr "Копировать разобранное и возв&ратиться"
|
||||
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy decomposed text to clipboard and return focus to source window"
|
||||
msgstr "Копировать разобранный текст в буфер обмена и возвратить фокус в исходное окно"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort (De)composition"
|
||||
msgstr "Прервать составление/разборку"
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort composition and return focus to source window"
|
||||
msgstr "Прервать составление и возвратить фокус в исходное окно"
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "&Settings..."
|
||||
msgstr "&Настройки ..."
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "Open program configuration dialog"
|
||||
msgstr "Открыть диалог конфигурации программы"
|
||||
|
||||
#: zrcolagui.cpp:121
|
||||
#: zrcolagui.cpp:139
|
||||
msgid "&Edit"
|
||||
msgstr "&Правка"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "&Edit Toolbar"
|
||||
msgstr "Панель инструментов для &правки"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "Toggle edit toolbar"
|
||||
msgstr "Переключить панель инструментов для правки"
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "&Compose Toolbar"
|
||||
msgstr "Панель инструментов для &составления"
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "Toggle compose toolbar"
|
||||
msgstr "Переключить панель инструментов для составления"
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Character Catalo&g"
|
||||
msgstr "Список &знаков"
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Toggle character catalog panel"
|
||||
msgstr "Переключить список знаков"
|
||||
|
||||
#: zrcolagui.cpp:138
|
||||
#: zrcolagui.cpp:156
|
||||
msgid "&View"
|
||||
msgstr "&Вид"
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "&Instructions..."
|
||||
msgstr "&Инструкции ..."
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "Open a web site with product instructions"
|
||||
msgstr "Открыть сайт с инструкциями по продукту"
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Keyboard &Shortcuts..."
|
||||
msgstr "Сочетания &клавиш ..."
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Open a list of keyboard shortcuts"
|
||||
msgstr "Открыть список сочетаний клавиш"
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "&Request a new character..."
|
||||
msgstr "&Запрос нового знака ..."
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "Submit a request to ZRC to add a new character"
|
||||
msgstr "Отправить запрос нового знака"
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check for &Updates..."
|
||||
msgstr "Проверить наличие &обновлений ..."
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check online for product update"
|
||||
msgstr "Проверить наличие обновлений онлайн"
|
||||
|
||||
#: zrcolagui.cpp:162
|
||||
#: zrcolagui.cpp:180
|
||||
msgid "&About..."
|
||||
msgstr "О прогр&амме ..."
|
||||
|
||||
#: zrcolagui.cpp:165
|
||||
#: zrcolagui.cpp:183
|
||||
msgid "&Help"
|
||||
msgstr "&Справка"
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
msgid "Cut"
|
||||
msgstr "Вырезать"
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
msgid "Cut selection"
|
||||
msgstr "Вырезать выбор"
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
msgid "Copy"
|
||||
msgstr "Копировать"
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
msgid "Copy selection"
|
||||
msgstr "Копировать выбор"
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
msgid "Paste"
|
||||
msgstr "Вставить"
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
msgid "Paste selection"
|
||||
msgstr "Вставить выбор"
|
||||
|
||||
#: zrcolagui.cpp:177
|
||||
#: zrcolagui.cpp:195
|
||||
msgid "Edit"
|
||||
msgstr "Правка"
|
||||
|
||||
#: zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:198
|
||||
msgid "Find Character"
|
||||
msgstr "Поиск знака"
|
||||
|
||||
#: zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:200
|
||||
msgid "Send Composed"
|
||||
msgstr "Послать составленное (F5)"
|
||||
|
||||
#: zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:202
|
||||
msgid "Send Decomposed"
|
||||
msgstr "Послать разобранное (F6)"
|
||||
|
||||
#: zrcolagui.cpp:187
|
||||
#: zrcolagui.cpp:205
|
||||
msgid "Compose"
|
||||
msgstr "Составить"
|
||||
|
||||
#: zrcolagui.cpp:191
|
||||
#: zrcolagui.cpp:209
|
||||
msgid "Character Catalog"
|
||||
msgstr "Список знаков"
|
||||
|
||||
#: zrcolagui.cpp:195
|
||||
#: zrcolagui.cpp:213
|
||||
msgid "(De)Composer"
|
||||
msgstr "(Де)Композитор"
|
||||
|
||||
#: zrcolagui.cpp:234
|
||||
#: zrcolagui.cpp:252
|
||||
msgid "Decomposed Text"
|
||||
msgstr "Разобранний текст"
|
||||
|
||||
#: zrcolagui.cpp:254
|
||||
#: zrcolagui.cpp:272
|
||||
msgid "Decomposed Unicode Dump"
|
||||
msgstr "Дамп разобранного Юнукода"
|
||||
|
||||
#: zrcolagui.cpp:281
|
||||
#: zrcolagui.cpp:299
|
||||
msgid "Composed Text"
|
||||
msgstr "Составленный текст"
|
||||
|
||||
#: zrcolagui.cpp:301
|
||||
#: zrcolagui.cpp:319
|
||||
msgid "Composed Unicode Dump"
|
||||
msgstr "Дамп составленного Юникода"
|
||||
|
||||
#: zrcolagui.cpp:355
|
||||
#: zrcolagui.cpp:373
|
||||
msgid "Select category to display"
|
||||
msgstr "Выделить категории для отображения"
|
||||
|
||||
#: zrcolagui.cpp:389
|
||||
#: zrcolagui.cpp:407
|
||||
msgid "Show &All"
|
||||
msgstr "Показать &все"
|
||||
|
||||
#: zrcolagui.cpp:390
|
||||
#: zrcolagui.cpp:408
|
||||
msgid "Toggle display of less frequent characters"
|
||||
msgstr "Переключить отображение редко использованных знаков"
|
||||
|
||||
#: zrcolagui.cpp:430
|
||||
#: zrcolagui.cpp:448
|
||||
msgid "&Browse"
|
||||
msgstr "&Обзор"
|
||||
|
||||
#: zrcolagui.cpp:437
|
||||
msgid ""
|
||||
"Full or partial terms from Unicode character description (in English) to "
|
||||
"search for"
|
||||
#: zrcolagui.cpp:455
|
||||
msgid "Full or partial terms from Unicode character description (in English) to search for"
|
||||
msgstr "Полное либо частичное описание знака Юникод (на английском) для поиска"
|
||||
|
||||
#: zrcolagui.cpp:441
|
||||
#: zrcolagui.cpp:459
|
||||
msgid "Search Options"
|
||||
msgstr "Опции поиска"
|
||||
|
||||
#: zrcolagui.cpp:442
|
||||
#: zrcolagui.cpp:460
|
||||
msgid "Shows/hides additional search options"
|
||||
msgstr "Показать/скрыть дополнительные опции поиска"
|
||||
|
||||
#: zrcolagui.cpp:454
|
||||
#: zrcolagui.cpp:472
|
||||
msgid "List of Unicode character categories to search in"
|
||||
msgstr "Список категории Юникод для проведения поиска"
|
||||
|
||||
#: zrcolagui.cpp:461
|
||||
#: zrcolagui.cpp:479
|
||||
msgid "All"
|
||||
msgstr "Все"
|
||||
|
||||
#: zrcolagui.cpp:462
|
||||
#: zrcolagui.cpp:480
|
||||
msgid "Select all categories"
|
||||
msgstr "Выбрать все категории"
|
||||
|
||||
#: zrcolagui.cpp:466
|
||||
#: zrcolagui.cpp:484
|
||||
msgid "None"
|
||||
msgstr "Ничего"
|
||||
|
||||
#: zrcolagui.cpp:467
|
||||
#: zrcolagui.cpp:485
|
||||
msgid "Clear category selection"
|
||||
msgstr "Очистить выбор категории"
|
||||
|
||||
#: zrcolagui.cpp:471
|
||||
#: zrcolagui.cpp:489
|
||||
msgid "Invert"
|
||||
msgstr "Обратить"
|
||||
|
||||
#: zrcolagui.cpp:472
|
||||
#: zrcolagui.cpp:490
|
||||
msgid "Invert category selection"
|
||||
msgstr "Обратить выбор категории"
|
||||
|
||||
#: zrcolagui.cpp:511
|
||||
#: zrcolagui.cpp:529
|
||||
msgid "Character search results"
|
||||
msgstr "Результаты поиска знаков"
|
||||
|
||||
#: zrcolagui.cpp:521
|
||||
#: zrcolagui.cpp:539
|
||||
msgid "Re¢ly Used"
|
||||
msgstr "&Недавно использованное"
|
||||
|
||||
#: zrcolagui.cpp:549
|
||||
#: zrcolagui.cpp:567
|
||||
msgid "List of recently inserted characters"
|
||||
msgstr "Список недавно вставленных знаков"
|
||||
|
||||
#: zrcolagui.cpp:563
|
||||
#: zrcolagui.cpp:581
|
||||
msgid "Preview"
|
||||
msgstr "Просмотр"
|
||||
|
||||
#: zrcolagui.cpp:568
|
||||
#: zrcolagui.cpp:586
|
||||
msgid "U+"
|
||||
msgstr "U+"
|
||||
|
||||
#: zrcolagui.cpp:573
|
||||
#: zrcolagui.cpp:591
|
||||
msgid "Unicode hexadecimal code"
|
||||
msgstr "Шестнадцатеричный код Юникод"
|
||||
|
||||
#: zrcolagui.cpp:578
|
||||
#: zrcolagui.cpp:596
|
||||
msgid "Keyboard shortcut in Composer window"
|
||||
msgstr "Сочетание клавиш в окне композитора"
|
||||
|
||||
#: zrcolagui.cpp:613
|
||||
#: zrcolagui.cpp:631
|
||||
msgid "Character preview"
|
||||
msgstr "Просмотр знака"
|
||||
|
||||
#: zrcolagui.cpp:618
|
||||
#: zrcolagui.cpp:636
|
||||
msgid "Unicode character description"
|
||||
msgstr "Описание знака Юникод"
|
||||
|
||||
#: zrcolagui.cpp:623
|
||||
#: zrcolagui.cpp:641
|
||||
msgid "Character tags"
|
||||
msgstr "Ключевые слова"
|
||||
|
||||
#: zrcolagui.cpp:628
|
||||
#: zrcolagui.cpp:646
|
||||
msgid "Unicode character category"
|
||||
msgstr "Категория знака Юникод"
|
||||
|
||||
#: zrcolagui.cpp:635
|
||||
#: zrcolagui.cpp:653
|
||||
msgid "« Back"
|
||||
msgstr "« Назад"
|
||||
|
||||
#: zrcolagui.cpp:637
|
||||
#: zrcolagui.cpp:655
|
||||
msgid "To previously viewed character"
|
||||
msgstr "К предыдущему знаку"
|
||||
|
||||
#: zrcolagui.cpp:641
|
||||
#: zrcolagui.cpp:659
|
||||
msgid "Forward »"
|
||||
msgstr "Далее »"
|
||||
|
||||
#: zrcolagui.cpp:643
|
||||
#: zrcolagui.cpp:661
|
||||
msgid "To following viewed character"
|
||||
msgstr "К следующему знаку"
|
||||
|
||||
#: zrcolagui.cpp:654
|
||||
#: zrcolagui.cpp:672
|
||||
msgid "Re&lated"
|
||||
msgstr "&Связанное"
|
||||
|
||||
#: zrcolagui.cpp:681
|
||||
#: zrcolagui.cpp:699
|
||||
msgid "List of related characters"
|
||||
msgstr "Список связанных знаков"
|
||||
|
||||
#: zrcolagui.cpp:770
|
||||
#: zrcolagui.cpp:790
|
||||
msgid ""
|
||||
"Some character native to specific language you are working with should not "
|
||||
"decompose to primitives.\n"
|
||||
"Some character native to specific language you are working with should not decompose to primitives.\n"
|
||||
"For optimal decomposition you should set the language correctly."
|
||||
msgstr ""
|
||||
"Некоторые знаки использованного языка нельзя разбирать.\n"
|
||||
"Для оптимальной разборки вы должны настроить правильный язык."
|
||||
|
||||
#: zrcolagui.cpp:774
|
||||
#: zrcolagui.cpp:794
|
||||
msgid "Select language &automatically according to selected keyboard"
|
||||
msgstr "&Автоматически установить язык на основе выбранной клавиатуры"
|
||||
|
||||
#: zrcolagui.cpp:777
|
||||
#: zrcolagui.cpp:797
|
||||
msgid "&Manually select the language from the list below:"
|
||||
msgstr "&Вручную выбрать язык со списка:"
|
||||
|
||||
#: zrcolagui.cpp:789
|
||||
#: zrcolagui.cpp:809
|
||||
msgid "Text Language"
|
||||
msgstr "Язык текста"
|
||||
|
||||
#: zrcolagui.cpp:794
|
||||
#: zrcolagui.cpp:816
|
||||
msgid ""
|
||||
"ZRCola offers multiple text transformations that can be arranged in a sequence.\n"
|
||||
"Please select desired transformations and the order they are applied."
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:831
|
||||
msgid "A&vailable:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:844
|
||||
msgid ">"
|
||||
msgstr ">"
|
||||
|
||||
#: zrcolagui.cpp:847
|
||||
msgid "<"
|
||||
msgstr "<"
|
||||
|
||||
#: zrcolagui.cpp:856
|
||||
msgid "&Active:"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:872
|
||||
msgid "Up"
|
||||
msgstr "Up"
|
||||
|
||||
#: zrcolagui.cpp:875
|
||||
msgid "Down"
|
||||
msgstr "Down"
|
||||
|
||||
#: zrcolagui.cpp:885
|
||||
msgid "Transformation"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolagui.cpp:892
|
||||
msgid ""
|
||||
"ZRCola can be launched every time you log in to your computer.\n"
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 "
|
||||
"and Win+F6."
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 and Win+F6."
|
||||
msgstr ""
|
||||
"Запуск системы ZRCola возможен при каждом запуске компьютера.\n"
|
||||
"После запуска система ZRCola доступна на панели задач либо через нажатие "
|
||||
"сочетания клавиш Win+F5 и Win+F6."
|
||||
"После запуска система ZRCola доступна на панели задач либо через нажатие сочетания клавиш Win+F5 и Win+F6."
|
||||
|
||||
#: zrcolagui.cpp:798
|
||||
#: zrcolagui.cpp:896
|
||||
msgid "Start ZRCola &automatically on logon"
|
||||
msgstr "&Автоматически запустить систему ZRCola при запуске компьютера"
|
||||
|
||||
#: zrcolagui.cpp:805
|
||||
#: zrcolagui.cpp:903
|
||||
msgid "Startup"
|
||||
msgstr "Запуск"
|
||||
|
||||
#: zrcolagui.cpp:885
|
||||
#: zrcolagui.cpp:991
|
||||
msgid ""
|
||||
"Program and Website Editor: Janoš Ježovnik\n"
|
||||
"Development: Amebis, d. o. o., Kamnik\n"
|
||||
"Translation into English: Janoš Ježovnik\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia "
|
||||
"Plotnikova\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia Plotnikova\n"
|
||||
"Development and maintenance of the original program (2004–2015): Peter Weiss"
|
||||
msgstr ""
|
||||
"Администратор программы и сайта: Янош Ежовник (Janoš Ježovnik)\n"
|
||||
"Разработка: Amebis, d. o. o., Kamnik\n"
|
||||
"Перевод на английский яазык: Янош Ежовник (Janoš Ježovnik)\n"
|
||||
"Перевод на русский язык: Домен Крвина (Domen Krvina), Силво Торкар (Silvo "
|
||||
"Torkar), Анастасия Плотникова\n"
|
||||
"Разработка in техническая поддержка первоначальной программы (2004–2015): "
|
||||
"Петер Вейсс (Peter Weiss)"
|
||||
"Перевод на русский язык: Домен Крвина (Domen Krvina), Силво Торкар (Silvo Torkar), Анастасия Плотникова\n"
|
||||
"Разработка in техническая поддержка первоначальной программы (2004–2015): Петер Вейсс (Peter Weiss)"
|
||||
|
||||
#: zrcolagui.cpp:893
|
||||
#: zrcolagui.cpp:999
|
||||
msgid "zrcola.zrc-sazu.si"
|
||||
msgstr "zrcola.zrc-sazu.si"
|
||||
|
||||
#: zrcolagui.cpp:899
|
||||
msgid ""
|
||||
"Texts made using ZRCola have to include in a footnote or some other "
|
||||
"appropriate part of the publication the note below:"
|
||||
msgstr ""
|
||||
"Текст, созданный с помощью системы ZRCola, должен в примечании или другом "
|
||||
"соответствующем месте в публикации сопровождаться следующей записью:"
|
||||
#: zrcolagui.cpp:1005
|
||||
msgid "Texts made using ZRCola have to include in a footnote or some other appropriate part of the publication the note below:"
|
||||
msgstr "Текст, созданный с помощью системы ZRCola, должен в примечании или другом соответствующем месте в публикации сопровождаться следующей записью:"
|
||||
|
||||
#: zrcolagui.cpp:903
|
||||
msgid ""
|
||||
"This text was written using the ZRCola input system (http://zrcola.zrc-sazu."
|
||||
"si), developed at the Science and Research Centre of SAZU in Ljubljana "
|
||||
"(http://www.zrc-sazu.si) by Peter Weiss."
|
||||
msgstr ""
|
||||
"Текст подготовлен с помощью системы ввода ZRCola (http://zrcola.zrc-sazu."
|
||||
"si), разработанной в Научно-исследовательском центре Словенской академии "
|
||||
"наук и искусств в Любляне (http://www.zrc-sazu.si) Петром Вейссoм."
|
||||
#: zrcolagui.cpp:1009
|
||||
msgid "This text was written using the ZRCola input system (http://zrcola.zrc-sazu.si), developed at the Science and Research Centre of SAZU in Ljubljana (http://www.zrc-sazu.si) by Peter Weiss."
|
||||
msgstr "Текст подготовлен с помощью системы ввода ZRCola (http://zrcola.zrc-sazu.si), разработанной в Научно-исследовательском центре Словенской академии наук и искусств в Любляне (http://www.zrc-sazu.si) Петром Вейссoм."
|
||||
|
||||
#: zrcolagui.cpp:944
|
||||
#: zrcolagui.cpp:1050
|
||||
msgid "Log"
|
||||
msgstr "Журнал"
|
||||
|
||||
#: zrcolagui.cpp:960
|
||||
#: zrcolagui.cpp:1066
|
||||
msgid "Quit and &Update..."
|
||||
msgstr "Выйти и &обновить ..."
|
||||
|
||||
#: zrcolagui.cpp:962
|
||||
#: zrcolagui.cpp:1068
|
||||
msgid "Exit this program and launch product update"
|
||||
msgstr "Выйти из программы и запустить обновление"
|
||||
|
||||
#: zrcolagui.cpp:966
|
||||
#: zrcolagui.cpp:1072
|
||||
msgid "&Close"
|
||||
msgstr "&Закрыть"
|
||||
|
||||
#: zrcolagui.cpp:967
|
||||
#: zrcolagui.cpp:1073
|
||||
msgid "Close this window"
|
||||
msgstr "Закрыть это окно"
|
||||
|
||||
#: zrcolagui.cpp:1006
|
||||
#: zrcolagui.cpp:1112
|
||||
msgid "Enter the &character you would like to request:"
|
||||
msgstr "Ввести запрашиваемый &знак:"
|
||||
|
||||
#: zrcolagui.cpp:1013
|
||||
#: zrcolagui.cpp:1119
|
||||
msgid "Decomposed character to request"
|
||||
msgstr "Запрашиваемый разобранный знак"
|
||||
|
||||
#: zrcolagui.cpp:1017
|
||||
#: zrcolagui.cpp:1123
|
||||
msgid ""
|
||||
"Please, use the decomposed form.\n"
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste "
|
||||
"it from the Decomposed window."
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste it from the Decomposed window."
|
||||
msgstr ""
|
||||
"Пожалуйста, используйте разобранный формат.\n"
|
||||
"Для ввода запрашиваемого знака можно использовать сочетания клавиш системы "
|
||||
"ZRCola либо копировать и вставить знаки из окна для разборки."
|
||||
"Для ввода запрашиваемого знака можно использовать сочетания клавиш системы ZRCola либо копировать и вставить знаки из окна для разборки."
|
||||
|
||||
#: zrcolagui.cpp:1027
|
||||
msgid ""
|
||||
"The &context, examples or description why and where the character is "
|
||||
"required:"
|
||||
msgstr ""
|
||||
"&Контекст, примеры либо описание запрашиваемого знака или объяснение, зачем "
|
||||
"он нужен:"
|
||||
#: zrcolagui.cpp:1133
|
||||
msgid "The &context, examples or description why and where the character is required:"
|
||||
msgstr "&Контекст, примеры либо описание запрашиваемого знака или объяснение, зачем он нужен:"
|
||||
|
||||
#: zrcolagui.cpp:1033
|
||||
#: zrcolagui.cpp:1139
|
||||
msgid "Additional notes for character request"
|
||||
msgstr "Дополнительные примечания"
|
||||
|
||||
#: zrcolagui.cpp:1040
|
||||
#: zrcolagui.cpp:1146
|
||||
msgid ""
|
||||
"After clicking OK button, your e-mail application should open allowing you "
|
||||
"to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but "
|
||||
"the Editor will be able to read them correctly anyway."
|
||||
"After clicking OK button, your e-mail application should open allowing you to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but the Editor will be able to read them correctly anyway."
|
||||
msgstr ""
|
||||
"После нажатия на кнопку «OK» ваша почтовая программа должна открытся для "
|
||||
"отправки запроса нового знака администратору системы ZRCola.\n"
|
||||
"Возможно, не все знаки будут отображены правильно, но все информации будут "
|
||||
"закодированны таким образом, что администратор сможет их правильно прочитать."
|
||||
"После нажатия на кнопку «OK» ваша почтовая программа должна открытся для отправки запроса нового знака администратору системы ZRCola.\n"
|
||||
"Возможно, не все знаки будут отображены правильно, но все информации будут закодированны таким образом, что администратор сможет их правильно прочитать."
|
||||
|
||||
#: zrcolakeyhndlr.cpp:44
|
||||
msgid ""
|
||||
"INS key is pressed. Type the Unicode code of desired character now (up to "
|
||||
"four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgstr ""
|
||||
"Нажата клавиша INS. Введите код Юникод желаемого знака (максимум четыре "
|
||||
"шестнадцатеричныe цифры: 0-9, A-F), затем отпустите клавишу INS."
|
||||
msgid "INS key is pressed. Type the Unicode code of desired character now (up to four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgstr "Нажата клавиша INS. Введите код Юникод желаемого знака (максимум четыре шестнадцатеричныe цифры: 0-9, A-F), затем отпустите клавишу INS."
|
||||
|
||||
#: zrcolasettings.cpp:93
|
||||
#: zrcolasettings.cpp:90
|
||||
#, c-format
|
||||
msgid "Unknown transformation (%u)"
|
||||
msgstr ""
|
||||
|
||||
#: zrcolasettings.cpp:181
|
||||
msgid "Start ZRCola automatically on logon"
|
||||
msgstr "Автоматически запустить систему ZRCola при запуске компьютера"
|
||||
|
||||
@@ -576,151 +595,92 @@ msgstr ""
|
||||
"Программа будет закрыта и обновлена.\n"
|
||||
"Вы уверены?"
|
||||
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:334
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:350
|
||||
msgid "Product Update"
|
||||
msgstr "Обновление продукта"
|
||||
|
||||
#: zrcolagui.h:246
|
||||
#: zrcolagui.h:248
|
||||
msgid "Character Search"
|
||||
msgstr "Поиск знака"
|
||||
|
||||
#: zrcolagui.h:283
|
||||
#: zrcolagui.h:299
|
||||
msgid "Settings"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: zrcolagui.h:309
|
||||
#: zrcolagui.h:325
|
||||
msgid "About ZRCola"
|
||||
msgstr "О системе ZRCola"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:15
|
||||
msgid "binUIHeader.bmp"
|
||||
msgstr "binUIHeader.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:5
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Starting"
|
||||
msgstr "[DlgTitleFont][SimpleProductName] Руководство по запуску системы"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:6
|
||||
msgid "bintutorial1.bmp"
|
||||
msgstr "bintutorial1.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:7
|
||||
msgid ""
|
||||
"When configured, ZRCola starts at system startup and runs in the background. "
|
||||
"If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgstr ""
|
||||
"Если так настроено, система ZRCola запускается при запуске компьютера и "
|
||||
"работает в фоновом режиме. Если потребуется, пользователь может вывести "
|
||||
"программу на экран, нажав на сочетание клавиш Win+F5."
|
||||
msgid "When configured, ZRCola starts at system startup and runs in the background. If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgstr "Если так настроено, система ZRCola запускается при запуске компьютера и работает в фоновом режиме. Если потребуется, пользователь может вывести программу на экран, нажав на сочетание клавиш Win+F5."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:8
|
||||
msgid ""
|
||||
"IMPORTANT: Upon pressing the combination Win+F5 the program memorises the "
|
||||
"location of the cursor in the text. If ZRCola is brought to the foreground "
|
||||
"without using the aforementioned combination of keys, the program won't know "
|
||||
"where to insert the special characters!"
|
||||
msgstr ""
|
||||
"Внимание: При нажатии сочетание клавиш Win+F5 программа запомнить "
|
||||
"местонахождение курсора в тексте. Если система ZRCola выведена на экран без "
|
||||
"использования упомянутого сочетания клавиш, программа не знает, куда ввести "
|
||||
"желаемые знаки!"
|
||||
msgid "IMPORTANT: Upon pressing the combination Win+F5 the program memorises the location of the cursor in the text. If ZRCola is brought to the foreground without using the aforementioned combination of keys, the program won't know where to insert the special characters!"
|
||||
msgstr "Внимание: При нажатии сочетание клавиш Win+F5 программа запомнить местонахождение курсора в тексте. Если система ZRCola выведена на экран без использования упомянутого сочетания клавиш, программа не знает, куда ввести желаемые знаки!"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:19
|
||||
msgid "&Continue"
|
||||
msgstr "&Продолжить"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:11
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Composition"
|
||||
msgstr "[DlgTitleFont][SimpleProductName] Руководство по составлению"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:12
|
||||
msgid "bintutorial2.bmp"
|
||||
msgstr "bintutorial2.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:13
|
||||
msgid ""
|
||||
"The string of basic and substitute characters is entered into the upper "
|
||||
"input window of the program. In the window below the resulted special "
|
||||
"characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgstr ""
|
||||
"Строка основных и замещающих знаков вводится в верхнее окно для ввода. После "
|
||||
"того, в нижнем окне появляются соответствующие специальные знаки. Для их "
|
||||
"ввода в текст нужно нажать клавишу F5."
|
||||
msgid "The string of basic and substitute characters is entered into the upper input window of the program. In the window below the resulted special characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgstr "Строка основных и замещающих знаков вводится в верхнее окно для ввода. После того, в нижнем окне появляются соответствующие специальные знаки. Для их ввода в текст нужно нажать клавишу F5."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:16
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Entering Characters"
|
||||
msgstr "[DlgTitleFont][SimpleProductName] Руководство по вводу знаков"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:17
|
||||
msgid "bintutorial3.bmp"
|
||||
msgstr "bintutorial3.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:18
|
||||
msgid ""
|
||||
"Characters can be entered using keyboard shortcuts, the character catalogue "
|
||||
"(F4) or the character finding tool (F8)."
|
||||
msgstr ""
|
||||
"Знак можно ввести, употребляя сочетания клавиш на клавиатуре, список знаков "
|
||||
"(F4) или функцию \"Поиск знака\" (F8)."
|
||||
msgid "Characters can be entered using keyboard shortcuts, the character catalogue (F4) or the character finding tool (F8)."
|
||||
msgstr "Знак можно ввести, употребляя сочетания клавиш на клавиатуре, список знаков (F4) или функцию \"Поиск знака\" (F8)."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "Input system for linguistic use"
|
||||
@@ -729,12 +689,8 @@ msgstr "Система ввода ZRCola для лингвистического
|
||||
#~ msgid "http://zrcola-2.amebis.si/en/info/instructions/"
|
||||
#~ msgstr "http://zrcola.zrc-sazu.si/ru/info/instructions/"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "http://zrcola-2.amebis.si/wp-content/uploads/2016/04/5_ZRCola-"
|
||||
#~ "Tipkovnica_2009-06-21.pdf"
|
||||
#~ msgstr ""
|
||||
#~ "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/08/"
|
||||
#~ "ZRCola_tipkovnica_20160801.pdf"
|
||||
#~ msgid "http://zrcola-2.amebis.si/wp-content/uploads/2016/04/5_ZRCola-Tipkovnica_2009-06-21.pdf"
|
||||
#~ msgstr "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/08/ZRCola_tipkovnica_20160801.pdf"
|
||||
|
||||
# Windows charset for this language (decimal)
|
||||
#~ msgid "1252"
|
||||
@@ -855,15 +811,9 @@ msgstr "Система ввода ZRCola для лингвистического
|
||||
#~ msgid "Left"
|
||||
#~ msgstr "Left"
|
||||
|
||||
#~ msgid "Up"
|
||||
#~ msgstr "Up"
|
||||
|
||||
#~ msgid "Right"
|
||||
#~ msgstr "Right"
|
||||
|
||||
#~ msgid "Down"
|
||||
#~ msgstr "Down"
|
||||
|
||||
#~ msgid "Num Lock"
|
||||
#~ msgstr "Num Lock"
|
||||
|
||||
@@ -932,12 +882,8 @@ msgstr "Система ввода ZRCola для лингвистического
|
||||
#~ msgid "Send Composed (F5)"
|
||||
#~ msgstr "Pošlji sestavljeno (F5)"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "ZRCola keyboard shortcut Win+Shift+Z could not be registered. Some "
|
||||
#~ "functionality will not be available."
|
||||
#~ msgstr ""
|
||||
#~ "ZRColine bližnjice na tipkovnici Win+Shift+Z ni mogoče registrirati. "
|
||||
#~ "Nekaj funkcionalnosti ne bo na voljo."
|
||||
#~ msgid "ZRCola keyboard shortcut Win+Shift+Z could not be registered. Some functionality will not be available."
|
||||
#~ msgstr "ZRColine bližnjice na tipkovnici Win+Shift+Z ni mogoče registrirati. Nekaj funkcionalnosti ne bo na voljo."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Authentication progress real time monitor"
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ZRCola\n"
|
||||
"POT-Creation-Date: 2016-10-18 10:08+0200\n"
|
||||
"PO-Revision-Date: 2016-10-18 10:09+0200\n"
|
||||
"POT-Creation-Date: 2017-04-03 12:01+0200\n"
|
||||
"PO-Revision-Date: 2017-04-03 12:03+0200\n"
|
||||
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
|
||||
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
|
||||
"Language: sl_SI\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.10\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
|
||||
"%100==4 ? 2 : 3);\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"
|
||||
"X-Poedit-KeywordsList: _\n"
|
||||
|
||||
@@ -21,74 +20,71 @@ msgstr ""
|
||||
msgid "© 2004-%s ZRC SAZU"
|
||||
msgstr "© 2004-%s ZRC SAZU"
|
||||
|
||||
#: zrcolaapp.cpp:71 zrcolafrm.cpp:90 zrcolagui.cpp:874 zrcolagui.h:104
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: zrcolaapp.cpp:72 zrcolafrm.cpp:92 zrcolagui.cpp:980 zrcolagui.h:106
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "ZRCola"
|
||||
msgstr "ZRCola"
|
||||
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1004
|
||||
#: zrcolachrreq.cpp:49 zrcolagui.cpp:1110
|
||||
msgid "Character"
|
||||
msgstr "Znak"
|
||||
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1025
|
||||
#: zrcolachrreq.cpp:58 zrcolagui.cpp:1131
|
||||
msgid "Context"
|
||||
msgstr "Kontekst"
|
||||
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:363
|
||||
#: zrcolachrreq.cpp:64 zrcolagui.h:379
|
||||
msgid "Request a New Character"
|
||||
msgstr "Zahtevaj nov znak"
|
||||
|
||||
#: zrcolachrslct.cpp:46 zrcolachrslct.cpp:226 zrcolachrslct.cpp:677
|
||||
#: zrcolachrslct.cpp:89
|
||||
msgid "Too many digits in Unicode."
|
||||
msgstr "Preveč števk v zapisu Unicode."
|
||||
|
||||
#: zrcolachrslct.cpp:89 zrcolachrslct.cpp:107
|
||||
msgid "Validation conflict"
|
||||
msgstr "Nesoglasje pri preverjanju"
|
||||
|
||||
#: zrcolachrslct.cpp:107
|
||||
#, c-format
|
||||
msgid "Invalid character in Unicode found: %c"
|
||||
msgstr "Napačen znak v zapisu Unicode: %c"
|
||||
|
||||
#: zrcolachrslct.cpp:214 zrcolachrslct.cpp:390 zrcolachrslct.cpp:869
|
||||
msgid "▸ Search Options"
|
||||
msgstr "▸ Možnosti iskanja"
|
||||
|
||||
# Recitation separator
|
||||
#: zrcolachrslct.cpp:164
|
||||
#: zrcolachrslct.cpp:328
|
||||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: zrcolachrslct.cpp:229 zrcolachrslct.cpp:674
|
||||
#: zrcolachrslct.cpp:393 zrcolachrslct.cpp:866
|
||||
msgid "▾ Search Options"
|
||||
msgstr "▾ Možnosti iskanja"
|
||||
|
||||
#: zrcolafrm.cpp:141
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
msgstr ""
|
||||
"ZRColine bližnjice na tipkovnici Win+F5 ni mogoče registrirati. Nekaj "
|
||||
"funkcionalnosti ne bo na voljo."
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid "ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."
|
||||
msgstr "ZRColine bližnjice na tipkovnici Win+F5 ni mogoče registrirati. Nekaj funkcionalnosti ne bo na voljo."
|
||||
|
||||
#: zrcolafrm.cpp:141 zrcolafrm.cpp:143
|
||||
#: zrcolafrm.cpp:143 zrcolafrm.cpp:145
|
||||
msgid "Warning"
|
||||
msgstr "Opozorilo"
|
||||
|
||||
#: zrcolafrm.cpp:143
|
||||
msgid ""
|
||||
"ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality "
|
||||
"will not be available."
|
||||
msgstr ""
|
||||
"ZRColine bližnjice na tipkovnici Win+F6 ni mogoče registrirati. Nekaj "
|
||||
"funkcionalnosti ne bo na voljo."
|
||||
#: zrcolafrm.cpp:145
|
||||
msgid "ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."
|
||||
msgstr "ZRColine bližnjice na tipkovnici Win+F6 ni mogoče registrirati. Nekaj funkcionalnosti ne bo na voljo."
|
||||
|
||||
#: zrcolafrm.cpp:351
|
||||
#: zrcolafrm.cpp:362
|
||||
msgid "http://zrcola.zrc-sazu.si/en/info/instructions/"
|
||||
msgstr "http://zrcola.zrc-sazu.si/info/instructions/"
|
||||
|
||||
#: zrcolafrm.cpp:375
|
||||
msgid ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr ""
|
||||
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
|
||||
"ZRCola_tipkovnica_Jun2016.pdf"
|
||||
#: zrcolafrm.cpp:386
|
||||
msgid "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
msgstr "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"
|
||||
|
||||
#: zrcolagui.cpp:36
|
||||
msgid "E&xit"
|
||||
@@ -114,7 +110,7 @@ msgstr "Izberi celotno besedilo"
|
||||
msgid "Find C&haracter..."
|
||||
msgstr "Poišči &znak ..."
|
||||
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:78 zrcolagui.cpp:198
|
||||
msgid "Display character search to select character to insert into text"
|
||||
msgstr "Prikaži iskalnik znakov za izbor znaka za vstavljanje v besedilo"
|
||||
|
||||
@@ -122,348 +118,392 @@ msgstr "Prikaži iskalnik znakov za izbor znaka za vstavljanje v besedilo"
|
||||
msgid "&Send Composed"
|
||||
msgstr "Pošlji &sestavljeno"
|
||||
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:89 zrcolagui.cpp:200
|
||||
msgid "Send composed text to source window"
|
||||
msgstr "Pošlji sestavljeno besedilo izvornemu oknu"
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy Composed and &Return"
|
||||
msgstr "Kopi&raj sestavljeno in se vrni"
|
||||
|
||||
#: zrcolagui.cpp:98
|
||||
msgid "Copy composed text to clipboard and return focus to source window"
|
||||
msgstr "Kopiraj sestavljeno besedilo na odložišče in vrni fokus nazaj izvornemu oknu"
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
msgid "Send &Decomposed"
|
||||
msgstr "Pošlji &razstavljeno"
|
||||
|
||||
#: zrcolagui.cpp:98 zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:107 zrcolagui.cpp:202
|
||||
msgid "Send decomposed text to source window"
|
||||
msgstr "Pošlji razstavljeno besedilo izvornemu oknu"
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy Decomposed and Re&turn"
|
||||
msgstr "Kopi&raj razstavljeno in se vrni"
|
||||
|
||||
#: zrcolagui.cpp:116
|
||||
msgid "Copy decomposed text to clipboard and return focus to source window"
|
||||
msgstr "Kopiraj razstavljeno besedilo na odložišče in vrni fokus nazaj izvornemu oknu"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort (De)composition"
|
||||
msgstr "Prekini raz/sestavljanje"
|
||||
|
||||
#: zrcolagui.cpp:107
|
||||
#: zrcolagui.cpp:125
|
||||
msgid "Abort composition and return focus to source window"
|
||||
msgstr "Prekini sestavljanje in vrni fokus nazaj izvornemu oknu"
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "&Settings..."
|
||||
msgstr "Na&stavitve ..."
|
||||
|
||||
#: zrcolagui.cpp:118
|
||||
#: zrcolagui.cpp:136
|
||||
msgid "Open program configuration dialog"
|
||||
msgstr "Odpri nastavitveni dialog programa"
|
||||
|
||||
#: zrcolagui.cpp:121
|
||||
#: zrcolagui.cpp:139
|
||||
msgid "&Edit"
|
||||
msgstr "Ur&edi"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "&Edit Toolbar"
|
||||
msgstr "Orodna vrstica za ur&ejanje"
|
||||
|
||||
#: zrcolagui.cpp:125
|
||||
#: zrcolagui.cpp:143
|
||||
msgid "Toggle edit toolbar"
|
||||
msgstr "Prikaži/skrij orodno vrstico za urejanje"
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "&Compose Toolbar"
|
||||
msgstr "Orodna vrsti&ca za sestavljanje"
|
||||
|
||||
#: zrcolagui.cpp:129
|
||||
#: zrcolagui.cpp:147
|
||||
msgid "Toggle compose toolbar"
|
||||
msgstr "Prikaži/skrij orodno vrstico za sestavljanje"
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Character Catalo&g"
|
||||
msgstr "Katalo&g znakov"
|
||||
|
||||
#: zrcolagui.cpp:135
|
||||
#: zrcolagui.cpp:153
|
||||
msgid "Toggle character catalog panel"
|
||||
msgstr "Prikaži/skrij katalog znakov"
|
||||
|
||||
#: zrcolagui.cpp:138
|
||||
#: zrcolagui.cpp:156
|
||||
msgid "&View"
|
||||
msgstr "Po&gled"
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "&Instructions..."
|
||||
msgstr "Navod&ila ..."
|
||||
|
||||
#: zrcolagui.cpp:142
|
||||
#: zrcolagui.cpp:160
|
||||
msgid "Open a web site with product instructions"
|
||||
msgstr "Odpri spletno stran z navodili izdelka"
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Keyboard &Shortcuts..."
|
||||
msgstr "&Bližnjice na tipkovnici ..."
|
||||
|
||||
#: zrcolagui.cpp:146
|
||||
#: zrcolagui.cpp:164
|
||||
msgid "Open a list of keyboard shortcuts"
|
||||
msgstr "Odpri seznam bližnjic na tipkovnici"
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "&Request a new character..."
|
||||
msgstr "&Zahtevaj nov znak ..."
|
||||
|
||||
#: zrcolagui.cpp:152
|
||||
#: zrcolagui.cpp:170
|
||||
msgid "Submit a request to ZRC to add a new character"
|
||||
msgstr "Oddaj prošnjo za dodajanje novega znaka"
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check for &Updates..."
|
||||
msgstr "Preveri &posodobitve ..."
|
||||
|
||||
#: zrcolagui.cpp:156
|
||||
#: zrcolagui.cpp:174
|
||||
msgid "Check online for product update"
|
||||
msgstr "Preveri na spletu za posodobitev izdelka"
|
||||
|
||||
#: zrcolagui.cpp:162
|
||||
#: zrcolagui.cpp:180
|
||||
msgid "&About..."
|
||||
msgstr "O progr&amu ..."
|
||||
|
||||
#: zrcolagui.cpp:165
|
||||
#: zrcolagui.cpp:183
|
||||
msgid "&Help"
|
||||
msgstr "Po&moč"
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
msgid "Cut"
|
||||
msgstr "Izreži"
|
||||
|
||||
#: zrcolagui.cpp:170
|
||||
#: zrcolagui.cpp:188
|
||||
msgid "Cut selection"
|
||||
msgstr "Izreži izbor"
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
msgid "Copy"
|
||||
msgstr "Kopiraj"
|
||||
|
||||
#: zrcolagui.cpp:172
|
||||
#: zrcolagui.cpp:190
|
||||
msgid "Copy selection"
|
||||
msgstr "Kopiraj izbor"
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
msgid "Paste"
|
||||
msgstr "Prilepi"
|
||||
|
||||
#: zrcolagui.cpp:174
|
||||
#: zrcolagui.cpp:192
|
||||
msgid "Paste selection"
|
||||
msgstr "Prilepi izbor"
|
||||
|
||||
#: zrcolagui.cpp:177
|
||||
#: zrcolagui.cpp:195
|
||||
msgid "Edit"
|
||||
msgstr "Urejanje"
|
||||
|
||||
#: zrcolagui.cpp:180
|
||||
#: zrcolagui.cpp:198
|
||||
msgid "Find Character"
|
||||
msgstr "Poišči znak"
|
||||
|
||||
#: zrcolagui.cpp:182
|
||||
#: zrcolagui.cpp:200
|
||||
msgid "Send Composed"
|
||||
msgstr "Pošlji sestavljeno"
|
||||
|
||||
#: zrcolagui.cpp:184
|
||||
#: zrcolagui.cpp:202
|
||||
msgid "Send Decomposed"
|
||||
msgstr "Pošlji razstavljeno"
|
||||
|
||||
#: zrcolagui.cpp:187
|
||||
#: zrcolagui.cpp:205
|
||||
msgid "Compose"
|
||||
msgstr "Sestavljanje"
|
||||
|
||||
#: zrcolagui.cpp:191
|
||||
#: zrcolagui.cpp:209
|
||||
msgid "Character Catalog"
|
||||
msgstr "Katalog znakov"
|
||||
|
||||
#: zrcolagui.cpp:195
|
||||
#: zrcolagui.cpp:213
|
||||
msgid "(De)Composer"
|
||||
msgstr "Razstavljalnik/Sestavljalnik"
|
||||
|
||||
#: zrcolagui.cpp:234
|
||||
#: zrcolagui.cpp:252
|
||||
msgid "Decomposed Text"
|
||||
msgstr "Razstavljeno besedilo"
|
||||
|
||||
#: zrcolagui.cpp:254
|
||||
#: zrcolagui.cpp:272
|
||||
msgid "Decomposed Unicode Dump"
|
||||
msgstr "Unicode razstavljenega"
|
||||
|
||||
#: zrcolagui.cpp:281
|
||||
#: zrcolagui.cpp:299
|
||||
msgid "Composed Text"
|
||||
msgstr "Sestavljeno besedilo"
|
||||
|
||||
#: zrcolagui.cpp:301
|
||||
#: zrcolagui.cpp:319
|
||||
msgid "Composed Unicode Dump"
|
||||
msgstr "Unicode sestavljenega"
|
||||
|
||||
#: zrcolagui.cpp:355
|
||||
#: zrcolagui.cpp:373
|
||||
msgid "Select category to display"
|
||||
msgstr "Izberi kategorijo za prikaz"
|
||||
|
||||
#: zrcolagui.cpp:389
|
||||
#: zrcolagui.cpp:407
|
||||
msgid "Show &All"
|
||||
msgstr "Prik&aži vse"
|
||||
|
||||
#: zrcolagui.cpp:390
|
||||
#: zrcolagui.cpp:408
|
||||
msgid "Toggle display of less frequent characters"
|
||||
msgstr "Prikaži/skrij manj pogoste znake"
|
||||
|
||||
#: zrcolagui.cpp:430
|
||||
#: zrcolagui.cpp:448
|
||||
msgid "&Browse"
|
||||
msgstr "Pre&brskaj"
|
||||
|
||||
#: zrcolagui.cpp:437
|
||||
msgid ""
|
||||
"Full or partial terms from Unicode character description (in English) to "
|
||||
"search for"
|
||||
msgstr ""
|
||||
"Polne ali delne besede iz opisa znaka Unicode (v angleščini) za iskanje"
|
||||
#: zrcolagui.cpp:455
|
||||
msgid "Full or partial terms from Unicode character description (in English) to search for"
|
||||
msgstr "Polne ali delne besede iz opisa znaka Unicode (v angleščini) za iskanje"
|
||||
|
||||
#: zrcolagui.cpp:441
|
||||
#: zrcolagui.cpp:459
|
||||
msgid "Search Options"
|
||||
msgstr "Možnosti iskanja"
|
||||
|
||||
#: zrcolagui.cpp:442
|
||||
#: zrcolagui.cpp:460
|
||||
msgid "Shows/hides additional search options"
|
||||
msgstr "Prikaže/skrije dodatne možnosti iskanja"
|
||||
|
||||
#: zrcolagui.cpp:454
|
||||
#: zrcolagui.cpp:472
|
||||
msgid "List of Unicode character categories to search in"
|
||||
msgstr "Seznam kategorij znaka Unicode za iskanje"
|
||||
|
||||
#: zrcolagui.cpp:461
|
||||
#: zrcolagui.cpp:479
|
||||
msgid "All"
|
||||
msgstr "Vse"
|
||||
|
||||
#: zrcolagui.cpp:462
|
||||
#: zrcolagui.cpp:480
|
||||
msgid "Select all categories"
|
||||
msgstr "Izberi vse kategorije"
|
||||
|
||||
#: zrcolagui.cpp:466
|
||||
#: zrcolagui.cpp:484
|
||||
msgid "None"
|
||||
msgstr "Nič"
|
||||
|
||||
#: zrcolagui.cpp:467
|
||||
#: zrcolagui.cpp:485
|
||||
msgid "Clear category selection"
|
||||
msgstr "Počisti izbor kategorij"
|
||||
|
||||
#: zrcolagui.cpp:471
|
||||
#: zrcolagui.cpp:489
|
||||
msgid "Invert"
|
||||
msgstr "Obrni"
|
||||
|
||||
#: zrcolagui.cpp:472
|
||||
#: zrcolagui.cpp:490
|
||||
msgid "Invert category selection"
|
||||
msgstr "Obrni izbor kategorij"
|
||||
|
||||
#: zrcolagui.cpp:511
|
||||
#: zrcolagui.cpp:529
|
||||
msgid "Character search results"
|
||||
msgstr "Rezultati iskanja znakov"
|
||||
|
||||
#: zrcolagui.cpp:521
|
||||
#: zrcolagui.cpp:539
|
||||
msgid "Re¢ly Used"
|
||||
msgstr "Nedavno &uporabljeni"
|
||||
|
||||
#: zrcolagui.cpp:549
|
||||
#: zrcolagui.cpp:567
|
||||
msgid "List of recently inserted characters"
|
||||
msgstr "Seznam nedavno vstavljenih znakov"
|
||||
|
||||
#: zrcolagui.cpp:563
|
||||
#: zrcolagui.cpp:581
|
||||
msgid "Preview"
|
||||
msgstr "Predogled"
|
||||
|
||||
#: zrcolagui.cpp:568
|
||||
#: zrcolagui.cpp:586
|
||||
msgid "U+"
|
||||
msgstr "U+"
|
||||
|
||||
#: zrcolagui.cpp:573
|
||||
#: zrcolagui.cpp:591
|
||||
msgid "Unicode hexadecimal code"
|
||||
msgstr "Šestnajstiška koda Unicode"
|
||||
|
||||
#: zrcolagui.cpp:578
|
||||
#: zrcolagui.cpp:596
|
||||
msgid "Keyboard shortcut in Composer window"
|
||||
msgstr "Bližnjica na tipkovnici v oknu sestavljalnika"
|
||||
|
||||
#: zrcolagui.cpp:613
|
||||
#: zrcolagui.cpp:631
|
||||
msgid "Character preview"
|
||||
msgstr "Predogled znaka"
|
||||
|
||||
#: zrcolagui.cpp:618
|
||||
#: zrcolagui.cpp:636
|
||||
msgid "Unicode character description"
|
||||
msgstr "Opis znaka Unicode"
|
||||
|
||||
#: zrcolagui.cpp:623
|
||||
#: zrcolagui.cpp:641
|
||||
msgid "Character tags"
|
||||
msgstr "Oznake znaka"
|
||||
|
||||
#: zrcolagui.cpp:628
|
||||
#: zrcolagui.cpp:646
|
||||
msgid "Unicode character category"
|
||||
msgstr "Kategorija znaka Unicode"
|
||||
|
||||
#: zrcolagui.cpp:635
|
||||
#: zrcolagui.cpp:653
|
||||
msgid "« Back"
|
||||
msgstr "« Nazaj"
|
||||
|
||||
#: zrcolagui.cpp:637
|
||||
#: zrcolagui.cpp:655
|
||||
msgid "To previously viewed character"
|
||||
msgstr "Na prejšnji prikazan znak"
|
||||
|
||||
#: zrcolagui.cpp:641
|
||||
#: zrcolagui.cpp:659
|
||||
msgid "Forward »"
|
||||
msgstr "Naprej »"
|
||||
|
||||
#: zrcolagui.cpp:643
|
||||
#: zrcolagui.cpp:661
|
||||
msgid "To following viewed character"
|
||||
msgstr "Na naslednji prikazan znak"
|
||||
|
||||
#: zrcolagui.cpp:654
|
||||
#: zrcolagui.cpp:672
|
||||
msgid "Re&lated"
|
||||
msgstr "&Sorodni"
|
||||
|
||||
#: zrcolagui.cpp:681
|
||||
#: zrcolagui.cpp:699
|
||||
msgid "List of related characters"
|
||||
msgstr "Seznam sorodnih znakov"
|
||||
|
||||
#: zrcolagui.cpp:770
|
||||
#: zrcolagui.cpp:790
|
||||
msgid ""
|
||||
"Some character native to specific language you are working with should not "
|
||||
"decompose to primitives.\n"
|
||||
"Some character native to specific language you are working with should not decompose to primitives.\n"
|
||||
"For optimal decomposition you should set the language correctly."
|
||||
msgstr ""
|
||||
"Nekateri znaki iz posameznih jezikov, s katerimi delate, se ne smejo "
|
||||
"razstavljati.\n"
|
||||
"Nekateri znaki iz posameznih jezikov, s katerimi delate, se ne smejo razstavljati.\n"
|
||||
"Za optimalno razstavljanje izberite pravilni jezik."
|
||||
|
||||
#: zrcolagui.cpp:774
|
||||
#: zrcolagui.cpp:794
|
||||
msgid "Select language &automatically according to selected keyboard"
|
||||
msgstr "S&amodejno izberi jezik glede na izbrano tipkovnico"
|
||||
|
||||
#: zrcolagui.cpp:777
|
||||
#: zrcolagui.cpp:797
|
||||
msgid "&Manually select the language from the list below:"
|
||||
msgstr "&Ročno izberi jezik s seznama spodaj:"
|
||||
|
||||
#: zrcolagui.cpp:789
|
||||
#: zrcolagui.cpp:809
|
||||
msgid "Text Language"
|
||||
msgstr "Jezik besedila"
|
||||
|
||||
#: zrcolagui.cpp:794
|
||||
#: zrcolagui.cpp:816
|
||||
msgid ""
|
||||
"ZRCola offers multiple text transformations that can be arranged in a sequence.\n"
|
||||
"Please select desired transformations and the order they are applied."
|
||||
msgstr ""
|
||||
"ZRCola ponuja različne pretvorbe besedila, ki jih lahko uredimo v zaporedje.\n"
|
||||
"Prosimo, izberite želene pretvorbe in vrstni red, v katerem naj jih uporabi."
|
||||
|
||||
#: zrcolagui.cpp:831
|
||||
msgid "A&vailable:"
|
||||
msgstr "Na &voljo:"
|
||||
|
||||
#: zrcolagui.cpp:844
|
||||
msgid ">"
|
||||
msgstr ">"
|
||||
|
||||
#: zrcolagui.cpp:847
|
||||
msgid "<"
|
||||
msgstr "<"
|
||||
|
||||
#: zrcolagui.cpp:856
|
||||
msgid "&Active:"
|
||||
msgstr "&Aktivni:"
|
||||
|
||||
#: zrcolagui.cpp:872
|
||||
msgid "Up"
|
||||
msgstr "Gor"
|
||||
|
||||
#: zrcolagui.cpp:875
|
||||
msgid "Down"
|
||||
msgstr "Dol"
|
||||
|
||||
#: zrcolagui.cpp:885
|
||||
msgid "Transformation"
|
||||
msgstr "Pretvorba"
|
||||
|
||||
#: zrcolagui.cpp:892
|
||||
msgid ""
|
||||
"ZRCola can be launched every time you log in to your computer.\n"
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 "
|
||||
"and Win+F6."
|
||||
"It will be available on the system tray and via registered shortcuts Win+F5 and Win+F6."
|
||||
msgstr ""
|
||||
"ZRCola se lahko zažene ob vsaki prijavi v vaš računalnik.\n"
|
||||
"Na voljo bo v vrstici za sistemska obvestila ter preko registriranih "
|
||||
"bližnjic Win+F5 in Win+F6."
|
||||
"Na voljo bo v vrstici za sistemska obvestila ter preko registriranih bližnjic Win+F5 in Win+F6."
|
||||
|
||||
#: zrcolagui.cpp:798
|
||||
#: zrcolagui.cpp:896
|
||||
msgid "Start ZRCola &automatically on logon"
|
||||
msgstr "S&amodejno zaženi ZRColo ob prijavi"
|
||||
|
||||
#: zrcolagui.cpp:805
|
||||
#: zrcolagui.cpp:903
|
||||
msgid "Startup"
|
||||
msgstr "Zagon"
|
||||
|
||||
#: zrcolagui.cpp:885
|
||||
#: zrcolagui.cpp:991
|
||||
msgid ""
|
||||
"Program and Website Editor: Janoš Ježovnik\n"
|
||||
"Development: Amebis, d. o. o., Kamnik\n"
|
||||
"Translation into English: Janoš Ježovnik\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia "
|
||||
"Plotnikova\n"
|
||||
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia Plotnikova\n"
|
||||
"Development and maintenance of the original program (2004–2015): Peter Weiss"
|
||||
msgstr ""
|
||||
"Urednik programa in spletne strani: Janoš Ježovnik\n"
|
||||
@@ -472,98 +512,81 @@ msgstr ""
|
||||
"Prevod v ruski jezik: Domen Krvina, Silvo Torkar, Anastasija Plotnikova\n"
|
||||
"Razvoj in vzdrževanje prvotnega programa (2004–2015): Peter Weiss"
|
||||
|
||||
#: zrcolagui.cpp:893
|
||||
#: zrcolagui.cpp:999
|
||||
msgid "zrcola.zrc-sazu.si"
|
||||
msgstr "zrcola.zrc-sazu.si"
|
||||
|
||||
#: zrcolagui.cpp:899
|
||||
msgid ""
|
||||
"Texts made using ZRCola have to include in a footnote or some other "
|
||||
"appropriate part of the publication the note below:"
|
||||
msgstr ""
|
||||
"Besedilo, nastalo z uporabo ZRCole, mora biti v opombi ali na drugem "
|
||||
"ustreznem mestu v publikaciji opremljeno z naslednjim zapisom:"
|
||||
#: zrcolagui.cpp:1005
|
||||
msgid "Texts made using ZRCola have to include in a footnote or some other appropriate part of the publication the note below:"
|
||||
msgstr "Besedilo, nastalo z uporabo ZRCole, mora biti v opombi ali na drugem ustreznem mestu v publikaciji opremljeno z naslednjim zapisom:"
|
||||
|
||||
#: zrcolagui.cpp:903
|
||||
msgid ""
|
||||
"This text was written using the ZRCola input system (http://zrcola.zrc-sazu."
|
||||
"si), developed at the Science and Research Centre of SAZU in Ljubljana "
|
||||
"(http://www.zrc-sazu.si) by Peter Weiss."
|
||||
msgstr ""
|
||||
"Besedilo je bilo pripravljeno z vnašalnim sistemom ZRCola (http://zrcola.zrc-"
|
||||
"sazu.si), ki ga je na Znanstvenoraziskovalnem centru SAZU v Ljubljani "
|
||||
"(http://www.zrc-sazu.si) razvil Peter Weiss."
|
||||
#: zrcolagui.cpp:1009
|
||||
msgid "This text was written using the ZRCola input system (http://zrcola.zrc-sazu.si), developed at the Science and Research Centre of SAZU in Ljubljana (http://www.zrc-sazu.si) by Peter Weiss."
|
||||
msgstr "Besedilo je bilo pripravljeno z vnašalnim sistemom ZRCola (http://zrcola.zrc-sazu.si), ki ga je na Znanstvenoraziskovalnem centru SAZU v Ljubljani (http://www.zrc-sazu.si) razvil Peter Weiss."
|
||||
|
||||
#: zrcolagui.cpp:944
|
||||
#: zrcolagui.cpp:1050
|
||||
msgid "Log"
|
||||
msgstr "Dnevnik"
|
||||
|
||||
#: zrcolagui.cpp:960
|
||||
#: zrcolagui.cpp:1066
|
||||
msgid "Quit and &Update..."
|
||||
msgstr "Za&ustavi in posodobi ..."
|
||||
|
||||
#: zrcolagui.cpp:962
|
||||
#: zrcolagui.cpp:1068
|
||||
msgid "Exit this program and launch product update"
|
||||
msgstr "Zaustavi program in zaženi posodobitev izdelka"
|
||||
|
||||
#: zrcolagui.cpp:966
|
||||
#: zrcolagui.cpp:1072
|
||||
msgid "&Close"
|
||||
msgstr "&Zapri"
|
||||
|
||||
#: zrcolagui.cpp:967
|
||||
#: zrcolagui.cpp:1073
|
||||
msgid "Close this window"
|
||||
msgstr "Zapri to okno"
|
||||
|
||||
#: zrcolagui.cpp:1006
|
||||
#: zrcolagui.cpp:1112
|
||||
msgid "Enter the &character you would like to request:"
|
||||
msgstr "Vpišite &znak, ki ga želite zahtevati:"
|
||||
|
||||
#: zrcolagui.cpp:1013
|
||||
#: zrcolagui.cpp:1119
|
||||
msgid "Decomposed character to request"
|
||||
msgstr "Zahtevani znak v razstavljeni obliki"
|
||||
|
||||
# Please use a double && for final "&" character
|
||||
#: zrcolagui.cpp:1017
|
||||
#: zrcolagui.cpp:1123
|
||||
msgid ""
|
||||
"Please, use the decomposed form.\n"
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste "
|
||||
"it from the Decomposed window."
|
||||
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste it from the Decomposed window."
|
||||
msgstr ""
|
||||
"Uporabite razstavljeno obliko.\n"
|
||||
"Za vnos znaka lahko uporabite ZRColine bližnjice na tipkovnici ali ga "
|
||||
"kopirate in prilepite iz okna z razstavljenim besedilom."
|
||||
"Za vnos znaka lahko uporabite ZRColine bližnjice na tipkovnici ali ga kopirate in prilepite iz okna z razstavljenim besedilom."
|
||||
|
||||
#: zrcolagui.cpp:1027
|
||||
msgid ""
|
||||
"The &context, examples or description why and where the character is "
|
||||
"required:"
|
||||
#: zrcolagui.cpp:1133
|
||||
msgid "The &context, examples or description why and where the character is required:"
|
||||
msgstr "&Kontekst, primeri oziroma opis, zakaj in kje potrebujete novi znak:"
|
||||
|
||||
#: zrcolagui.cpp:1033
|
||||
#: zrcolagui.cpp:1139
|
||||
msgid "Additional notes for character request"
|
||||
msgstr "Dodatne opombe za zahtevo znaka"
|
||||
|
||||
#: zrcolagui.cpp:1040
|
||||
#: zrcolagui.cpp:1146
|
||||
msgid ""
|
||||
"After clicking OK button, your e-mail application should open allowing you "
|
||||
"to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but "
|
||||
"the Editor will be able to read them correctly anyway."
|
||||
"After clicking OK button, your e-mail application should open allowing you to submit the new character request to ZRCola Editor.\n"
|
||||
"Your e-mail application might not display all the characters correctly, but the Editor will be able to read them correctly anyway."
|
||||
msgstr ""
|
||||
"Ko boste kliknili gumb V redu, se bo odprl vaš program za e-pošto, s katerim "
|
||||
"boste lahko oddali zahtevo za nov znak uredniku programa.\n"
|
||||
"Vsi znaki v sporočilu morda ne bodo prikazani pravilno, vendar jih bo "
|
||||
"urednik lahko kljub temu razbral."
|
||||
"Ko boste kliknili gumb V redu, se bo odprl vaš program za e-pošto, s katerim boste lahko oddali zahtevo za nov znak uredniku programa.\n"
|
||||
"Vsi znaki v sporočilu morda ne bodo prikazani pravilno, vendar jih bo urednik lahko kljub temu razbral."
|
||||
|
||||
#: zrcolakeyhndlr.cpp:44
|
||||
msgid ""
|
||||
"INS key is pressed. Type the Unicode code of desired character now (up to "
|
||||
"four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgstr ""
|
||||
"Pritisnili ste tipko INS. Vtipkajte kodo Unicode želenega znaka (do štiri "
|
||||
"šestnajstiške števke: 0–9, A–F), nato izpustite INS."
|
||||
msgid "INS key is pressed. Type the Unicode code of desired character now (up to four hexadecimal digits: 0-9, A-F), then release INS."
|
||||
msgstr "Pritisnili ste tipko INS. Vtipkajte kodo Unicode želenega znaka (do štiri šestnajstiške števke: 0–9, A–F), nato izpustite INS."
|
||||
|
||||
#: zrcolasettings.cpp:93
|
||||
#: zrcolasettings.cpp:90
|
||||
#, c-format
|
||||
msgid "Unknown transformation (%u)"
|
||||
msgstr "Neznana pretvorba (%u)"
|
||||
|
||||
#: zrcolasettings.cpp:181
|
||||
msgid "Start ZRCola automatically on logon"
|
||||
msgstr "Samodejno zaženi ZRColo ob prijavi"
|
||||
|
||||
@@ -575,149 +598,92 @@ msgstr ""
|
||||
"Program se bo zdaj zaprl in zagnala se bo posodobitev.\n"
|
||||
"Ali ste prepričani, da želite nadaljevati?"
|
||||
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:334
|
||||
#: zrcolaupdater.cpp:94 zrcolagui.h:350
|
||||
msgid "Product Update"
|
||||
msgstr "Posodabljanje izdelka"
|
||||
|
||||
#: zrcolagui.h:246
|
||||
#: zrcolagui.h:248
|
||||
msgid "Character Search"
|
||||
msgstr "Poišči znak"
|
||||
|
||||
#: zrcolagui.h:283
|
||||
#: zrcolagui.h:299
|
||||
msgid "Settings"
|
||||
msgstr "Nastavitve"
|
||||
|
||||
#: zrcolagui.h:309
|
||||
#: zrcolagui.h:325
|
||||
msgid "About ZRCola"
|
||||
msgstr "O ZRColi"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:15
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:10
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:15
|
||||
msgid "binUIHeader.bmp"
|
||||
msgstr "binUIHeader.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:5
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:5
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Starting"
|
||||
msgstr "[DlgTitleFont]Vadnica [SimpleProductName] : Zagon"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:6
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:6
|
||||
msgid "bintutorial1.bmp"
|
||||
msgstr "bintutorial1.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:7
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:7
|
||||
msgid ""
|
||||
"When configured, ZRCola starts at system startup and runs in the background. "
|
||||
"If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgstr ""
|
||||
"Če jo tako nastavimo, se ZRCola zažene samodejno in teče v ozadju. V "
|
||||
"ospredje jo prikličemo s pritiskom na bližnjico Win+F5."
|
||||
msgid "When configured, ZRCola starts at system startup and runs in the background. If needed, it can be brought up by pressing the combination Win+F5."
|
||||
msgstr "Če jo tako nastavimo, se ZRCola zažene samodejno in teče v ozadju. V ospredje jo prikličemo s pritiskom na bližnjico Win+F5."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:8
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:8
|
||||
msgid ""
|
||||
"IMPORTANT: Upon pressing the combination Win+F5 the program memorises the "
|
||||
"location of the cursor in the text. If ZRCola is brought to the foreground "
|
||||
"without using the aforementioned combination of keys, the program won't know "
|
||||
"where to insert the special characters!"
|
||||
msgstr ""
|
||||
"POMEMBNO: Ob pritisku na Win+F5 si program zapomni mesto kurzorja v "
|
||||
"besedilu. Če ZRColo povečamo brez pritiska na ti dve tipki, program ne bo "
|
||||
"vedel, kam vstaviti želene znake!"
|
||||
msgid "IMPORTANT: Upon pressing the combination Win+F5 the program memorises the location of the cursor in the text. If ZRCola is brought to the foreground without using the aforementioned combination of keys, the program won't know where to insert the special characters!"
|
||||
msgstr "POMEMBNO: Ob pritisku na Win+F5 si program zapomni mesto kurzorja v besedilu. Če ZRColo povečamo brez pritiska na ti dve tipki, program ne bo vedel, kam vstaviti želene znake!"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:19
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:9
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:14
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:19
|
||||
msgid "&Continue"
|
||||
msgstr "&Nadaljuj"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:11
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:11
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Composition"
|
||||
msgstr "[DlgTitleFont]Vadnica [SimpleProductName] : Sestavljanje"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:12
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:12
|
||||
msgid "bintutorial2.bmp"
|
||||
msgstr "bintutorial2.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:13
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:13
|
||||
msgid ""
|
||||
"The string of basic and substitute characters is entered into the upper "
|
||||
"input window of the program. In the window below the resulted special "
|
||||
"characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgstr ""
|
||||
"Želeni niz osnovnih in nadomestnih znakov vnesemo v zgornjo vrstico v "
|
||||
"programu. V spodnji vrstici se prikažejo sestavljeni znaki. V besedilo jih "
|
||||
"vnesemo s pritiskom na tipko F5."
|
||||
msgid "The string of basic and substitute characters is entered into the upper input window of the program. In the window below the resulted special characters are displayed. To insert them in the text, the F5 key is used."
|
||||
msgstr "Želeni niz osnovnih in nadomestnih znakov vnesemo v zgornjo vrstico v programu. V spodnji vrstici se prikažejo sestavljeni znaki. V besedilo jih vnesemo s pritiskom na tipko F5."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:16
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:16
|
||||
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Entering Characters"
|
||||
msgstr "[DlgTitleFont]Vadnica [SimpleProductName] : Vnos znakov"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:17
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:17
|
||||
msgid "bintutorial3.bmp"
|
||||
msgstr "bintutorial3.bmp"
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:18
|
||||
#: MSIBuild/en_US.x64.Release.Control-2.idtx:18
|
||||
msgid ""
|
||||
"Characters can be entered using keyboard shortcuts, the character catalogue "
|
||||
"(F4) or the character finding tool (F8)."
|
||||
msgstr ""
|
||||
"Znake lahko v vnosno vrstico vstavljamo s pomočjo bližnjic na tipkovnici, iz "
|
||||
"kataloga znakov (F4) ali z iskalnikom znakov (F8)."
|
||||
msgid "Characters can be entered using keyboard shortcuts, the character catalogue (F4) or the character finding tool (F8)."
|
||||
msgstr "Znake lahko v vnosno vrstico vstavljamo s pomočjo bližnjic na tipkovnici, iz kataloga znakov (F4) ali z iskalnikom znakov (F8)."
|
||||
|
||||
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.Win32.Release.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Debug.Shortcut-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Feature-2.idtx:4
|
||||
#: MSIBuild/en_US.x64.Release.Shortcut-2.idtx:4
|
||||
msgid "Input system for linguistic use"
|
||||
|
||||
BIN
ZRCola/res/copy_destination_and_return.ico
Normal file
BIN
ZRCola/res/copy_destination_and_return.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
1698
ZRCola/res/copy_destination_and_return.pdf
Normal file
1698
ZRCola/res/copy_destination_and_return.pdf
Normal file
File diff suppressed because one or more lines are too long
BIN
ZRCola/res/copy_source_and_return.ico
Normal file
BIN
ZRCola/res/copy_source_and_return.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
1718
ZRCola/res/copy_source_and_return.pdf
Normal file
1718
ZRCola/res/copy_source_and_return.pdf
Normal file
File diff suppressed because one or more lines are too long
4
ZRCola/res/desktop.ini
Normal file
4
ZRCola/res/desktop.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[ViewState]
|
||||
Mode=
|
||||
Vid=
|
||||
FolderType=Pictures
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
1783
ZRCola/res/send_destination.pdf
Normal file
1783
ZRCola/res/send_destination.pdf
Normal file
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
1891
ZRCola/res/send_source.pdf
Normal file
1891
ZRCola/res/send_source.pdf
Normal file
File diff suppressed because one or more lines are too long
@@ -37,13 +37,15 @@
|
||||
#include <wxex/url.h>
|
||||
#include <wxex/persist/auimanager.h>
|
||||
|
||||
#include <wx/clipbrd.h>
|
||||
#include <wx/ffile.h>
|
||||
#include <wx/msgdlg.h>
|
||||
#include <wx/persist.h>
|
||||
#include <wx/persist/toplevel.h>
|
||||
#include <wx/socket.h>
|
||||
#include <wx/tokenzr.h>
|
||||
#include <wx/utils.h>
|
||||
#include <wx/valtext.h>
|
||||
#include <wx/socket.h>
|
||||
|
||||
#include <WinStd/MSI.h>
|
||||
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BEGIN_EVENT_TABLE(wxZRColaCharacterCatalogPanel, wxZRColaCharacterCatalogPanelBase)
|
||||
EVT_MENU(wxZRColaCharacterCatalogPanel::wxID_FOCUS_DECOMPOSED, wxZRColaCharacterCatalogPanel::OnFocusDecomposed)
|
||||
EVT_MENU(wxZRColaCharacterCatalogPanel::wxID_FOCUS_SOURCE, wxZRColaCharacterCatalogPanel::OnFocusSource)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
@@ -42,8 +42,8 @@ wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) :
|
||||
dat >> rec;
|
||||
if (!dat.good()) {
|
||||
wxFAIL_MSG(wxT("Error reading character group data from ZRCola.zrcdb."));
|
||||
m_cg_db.idxRnk.clear();
|
||||
m_cg_db.data .clear();
|
||||
m_cg_db.idxRank.clear();
|
||||
m_cg_db.data .clear();
|
||||
}
|
||||
} else
|
||||
wxFAIL_MSG(wxT("ZRCola.zrcdb has no character group data."));
|
||||
@@ -52,16 +52,16 @@ wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) :
|
||||
wxFAIL_MSG(wxT("ZRCola.zrcdb is not a valid ZRCola database."));
|
||||
}
|
||||
|
||||
if (!m_cg_db.idxRnk.empty()) {
|
||||
if (!m_cg_db.idxRank.empty()) {
|
||||
// Populate character group list.
|
||||
for (size_t i = 0, n = m_cg_db.idxRnk.size(); i < n; i++) {
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRnk[i];
|
||||
for (size_t i = 0, n = m_cg_db.idxRank.size(); i < n; i++) {
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRank[i];
|
||||
wxString
|
||||
label(cg.data, cg.name_len),
|
||||
label(cg.name(), cg.name_len()),
|
||||
label_tran2(wxGetTranslation(label, wxT("ZRCola-zrcdb")));
|
||||
m_choice->Insert(label_tran2, i);
|
||||
}
|
||||
m_cg_id = m_cg_db.idxRnk[0].id;
|
||||
m_cg_id = m_cg_db.idxRank[0].grp;
|
||||
m_choice->Select(0);
|
||||
|
||||
Update();
|
||||
@@ -70,7 +70,7 @@ wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) :
|
||||
// Register frame specific hotkey(s).
|
||||
{
|
||||
wxAcceleratorEntry entries[1];
|
||||
entries[0].Set(wxACCEL_NORMAL, WXK_ESCAPE, wxID_FOCUS_DECOMPOSED);
|
||||
entries[0].Set(wxACCEL_NORMAL, WXK_ESCAPE, wxID_FOCUS_SOURCE);
|
||||
SetAcceleratorTable(wxAcceleratorTable(_countof(entries), entries));
|
||||
}
|
||||
}
|
||||
@@ -83,10 +83,10 @@ wxZRColaCharacterCatalogPanel::~wxZRColaCharacterCatalogPanel()
|
||||
|
||||
void wxZRColaCharacterCatalogPanel::OnChoice(wxCommandEvent& event)
|
||||
{
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRnk[event.GetSelection()];
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRank[event.GetSelection()];
|
||||
|
||||
if (m_cg_id != cg.id) {
|
||||
m_cg_id = cg.id;
|
||||
if (m_cg_id != cg.grp) {
|
||||
m_cg_id = cg.grp;
|
||||
Update();
|
||||
}
|
||||
|
||||
@@ -98,8 +98,8 @@ void wxZRColaCharacterCatalogPanel::OnGridClick(wxGridEvent& event)
|
||||
{
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
if (app->m_mainWnd) {
|
||||
app->m_mainWnd->m_panel->m_decomposed->WriteText(m_grid->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
app->m_mainWnd->m_panel->m_decomposed->SetFocus();
|
||||
app->m_mainWnd->m_panel->m_source->WriteText(m_grid->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
app->m_mainWnd->m_panel->m_source->SetFocus();
|
||||
}
|
||||
|
||||
event.Skip();
|
||||
@@ -113,8 +113,8 @@ void wxZRColaCharacterCatalogPanel::OnGridKeyDown(wxKeyEvent& event)
|
||||
case WXK_NUMPAD_ENTER:
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
if (app->m_mainWnd) {
|
||||
app->m_mainWnd->m_panel->m_decomposed->WriteText(m_grid->GetCellValue(m_grid->GetCursorRow(), m_grid->GetCursorColumn()));
|
||||
app->m_mainWnd->m_panel->m_decomposed->SetFocus();
|
||||
app->m_mainWnd->m_panel->m_source->WriteText(m_grid->GetCellValue(m_grid->GetCursorRow(), m_grid->GetCursorColumn()));
|
||||
app->m_mainWnd->m_panel->m_source->SetFocus();
|
||||
|
||||
event.StopPropagation();
|
||||
return;
|
||||
@@ -135,11 +135,11 @@ void wxZRColaCharacterCatalogPanel::OnShowAll(wxCommandEvent& event)
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaCharacterCatalogPanel::OnFocusDecomposed(wxCommandEvent& event)
|
||||
void wxZRColaCharacterCatalogPanel::OnFocusSource(wxCommandEvent& event)
|
||||
{
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
if (app->m_mainWnd) {
|
||||
app->m_mainWnd->m_panel->m_decomposed->SetFocus();
|
||||
app->m_mainWnd->m_panel->m_source->SetFocus();
|
||||
|
||||
event.StopPropagation();
|
||||
return;
|
||||
@@ -151,21 +151,23 @@ void wxZRColaCharacterCatalogPanel::OnFocusDecomposed(wxCommandEvent& event)
|
||||
|
||||
void wxZRColaCharacterCatalogPanel::Update()
|
||||
{
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRnk[m_choice->GetSelection()];
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRank[m_choice->GetSelection()];
|
||||
|
||||
if (m_show_all->GetValue()) {
|
||||
m_grid->SetCharacters(
|
||||
wxString(cg.get_chars(), cg.char_len),
|
||||
wxArrayShort((const short*)cg.get_char_shown(), (const short*)cg.get_char_shown() + (cg.char_len + 15)/16));
|
||||
wxString(cg.chrlst(), cg.chrlst_end()),
|
||||
wxArrayShort(reinterpret_cast<const short*>(cg.chrshow()), reinterpret_cast<const short*>(cg.chrshow_end())));
|
||||
} else {
|
||||
// Select frequently used characters only.
|
||||
const wchar_t *src = cg.get_chars();
|
||||
const unsigned __int16 *shown = cg.get_char_shown();
|
||||
wxString chars;
|
||||
for (unsigned __int16 i = 0, j = 0; i < cg.char_len; j++) {
|
||||
for (unsigned __int16 k = 0, mask = shown[j]; k < 16 && i < cg.char_len; k++, mask >>= 1, i++) {
|
||||
const wchar_t *src = cg.chrlst();
|
||||
const unsigned __int16 *shown = cg.chrshow();
|
||||
wxArrayString chars;
|
||||
for (size_t i = 0, i_end = cg.chrlst_len(), j = 0; i < i_end; j++) {
|
||||
for (unsigned __int16 k = 0, mask = shown[j]; k < 16 && i < i_end; k++, mask >>= 1) {
|
||||
size_t len = wcsnlen(src + i, i_end - i);
|
||||
if (mask & 1)
|
||||
chars += src[i];
|
||||
chars.Add(wxString(src + i, len));
|
||||
i += len + 1;
|
||||
}
|
||||
}
|
||||
m_grid->SetCharacters(chars);
|
||||
@@ -208,11 +210,11 @@ bool wxPersistentZRColaCharacterCatalogPanel::Restore()
|
||||
// Restore selected character group.
|
||||
int cg_id;
|
||||
if (RestoreValue(wxT("charGroup"), &cg_id)) {
|
||||
for (size_t i = 0, n = wnd->m_cg_db.idxRnk.size(); i < n; i++) {
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = wnd->m_cg_db.idxRnk[i];
|
||||
if (cg.id == cg_id) {
|
||||
if (wnd->m_cg_id != cg.id) {
|
||||
wnd->m_cg_id = cg.id;
|
||||
for (size_t i = 0, n = wnd->m_cg_db.idxRank.size(); i < n; i++) {
|
||||
const ZRCola::chrgrp_db::chrgrp &cg = wnd->m_cg_db.idxRank[i];
|
||||
if (cg.grp == cg_id) {
|
||||
if (wnd->m_cg_id != cg.grp) {
|
||||
wnd->m_cg_id = cg.grp;
|
||||
wnd->m_choice->Select(i);
|
||||
update = true;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ class wxZRColaCharacterCatalogPanel : public wxZRColaCharacterCatalogPanelBase
|
||||
public:
|
||||
enum
|
||||
{
|
||||
wxID_FOCUS_DECOMPOSED = 6000,
|
||||
wxID_FOCUS_SOURCE = 6000,
|
||||
};
|
||||
|
||||
wxZRColaCharacterCatalogPanel(wxWindow* parent);
|
||||
@@ -51,7 +51,7 @@ protected:
|
||||
virtual void OnGridClick(wxGridEvent& event);
|
||||
virtual void OnGridKeyDown(wxKeyEvent& event);
|
||||
virtual void OnShowAll(wxCommandEvent& event);
|
||||
void OnFocusDecomposed(wxCommandEvent& event);
|
||||
void OnFocusSource(wxCommandEvent& event);
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
void Update();
|
||||
|
||||
@@ -68,6 +68,24 @@ void wxZRColaCharGrid::Init()
|
||||
|
||||
|
||||
void wxZRColaCharGrid::SetCharacters(const wxString &chars)
|
||||
{
|
||||
m_chars.Clear();
|
||||
const wxCStrData chr = chars.GetData();
|
||||
for (size_t i = 0, i_end = chars.Length(), i_next; i < i_end; i = i_next + 1) {
|
||||
i_next = i + _tcsnlen(chr + i, i_end - i);
|
||||
m_chars.Add(wxString(chr + i, chr + i_next));
|
||||
};
|
||||
m_relevance.Clear();
|
||||
m_regenerate = true;
|
||||
|
||||
// Invoke OnSize(), which will populate the grid.
|
||||
wxSizeEvent e(GetSize(), m_windowId);
|
||||
e.SetEventObject(this);
|
||||
HandleWindowEvent(e);
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaCharGrid::SetCharacters(const wxArrayString &chars)
|
||||
{
|
||||
m_chars = chars;
|
||||
m_relevance.Clear();
|
||||
@@ -82,7 +100,12 @@ void wxZRColaCharGrid::SetCharacters(const wxString &chars)
|
||||
|
||||
void wxZRColaCharGrid::SetCharacters(const wxString &chars, const wxArrayShort &relevance)
|
||||
{
|
||||
m_chars = chars;
|
||||
m_chars.Clear();
|
||||
const wxCStrData chr = chars.GetData();
|
||||
for (size_t i = 0, i_end = chars.Length(), i_next; i < i_end; i = i_next + 1) {
|
||||
i_next = i + _tcsnlen(chr + i, i_end - i);
|
||||
m_chars.Add(wxString(chr + i, chr + i_next));
|
||||
};
|
||||
m_relevance = relevance;
|
||||
m_regenerate = true;
|
||||
|
||||
@@ -95,22 +118,23 @@ void wxZRColaCharGrid::SetCharacters(const wxString &chars, const wxArrayShort &
|
||||
|
||||
wxString wxZRColaCharGrid::GetToolTipText(int idx)
|
||||
{
|
||||
wxASSERT_MSG(idx < (int)m_chars.Length(), wxT("index out of bounds"));
|
||||
wxASSERT_MSG(idx < (int)m_chars.GetCount(), wxT("index out of bounds"));
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
const auto &chr = m_chars[idx];
|
||||
|
||||
// See if this character has a key sequence registered.
|
||||
char ks[sizeof(ZRCola::keyseq_db::keyseq)] = {};
|
||||
((ZRCola::keyseq_db::keyseq*)ks)->chr = m_chars[idx];
|
||||
std::unique_ptr<ZRCola::keyseq_db::keyseq> ks((ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(wchar_t)*chr.length()]);
|
||||
ks->ZRCola::keyseq_db::keyseq::keyseq(NULL, 0, chr.data(), chr.length());
|
||||
ZRCola::keyseq_db::indexKey::size_type start;
|
||||
if (app->m_ks_db.idxChr.find(*(ZRCola::keyseq_db::keyseq*)ks, start)) {
|
||||
if (app->m_ks_db.idxChr.find(*ks, start)) {
|
||||
ZRCola::keyseq_db::keyseq &seq = app->m_ks_db.idxChr[start];
|
||||
wxString ks_str;
|
||||
if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq, seq.seq_len, ks_str))
|
||||
return wxString::Format(wxT("U+%04X (%s)"), (int)m_chars[idx], ks_str.c_str());
|
||||
if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq(), seq.seq_len(), ks_str))
|
||||
return wxString::Format(wxT("U+%s (%s)"), ZRCola::GetUnicodeDump(chr.data(), chr.length(), _T("+")).c_str(), ks_str.c_str());
|
||||
}
|
||||
|
||||
return wxString::Format(wxT("U+%04X"), (int)m_chars[idx]);
|
||||
return wxString::Format(wxT("U+%s"), ZRCola::GetUnicodeDump(chr.data(), chr.length(), _T("+")).c_str());
|
||||
}
|
||||
|
||||
|
||||
@@ -126,17 +150,17 @@ void wxZRColaCharGrid::OnSize(wxSizeEvent& event)
|
||||
// Calculate initial estimate of columns and rows.
|
||||
wxSize size(event.GetSize());
|
||||
size_t
|
||||
char_len = m_chars.Length();
|
||||
char_count = m_chars.GetCount();
|
||||
int
|
||||
width = size.GetWidth() - m_rowLabelWidth - m_extraWidth,
|
||||
cols = std::max<int>(width / wxZRColaCharacterGridColumnWidth, 1),
|
||||
rows = std::max<int>((char_len + cols - 1) / cols, 1);
|
||||
width = size.GetWidth() - m_rowLabelWidth - m_extraWidth,
|
||||
cols = std::max<int>(width / wxZRColaCharacterGridColumnWidth, 1),
|
||||
rows = std::max<int>((char_count + cols - 1) / cols, 1);
|
||||
|
||||
if (m_colLabelHeight + rows*wxZRColaCharacterGridRowHeight + m_extraHeight > size.GetHeight()) {
|
||||
// Vertical scrollbar will be shown. Adjust the width and recalculate layout to avoid horizontal scrollbar.
|
||||
width = std::max<int>(width - wxSystemSettings::GetMetric(wxSYS_VSCROLL_X, this), 0);
|
||||
cols = std::max<int>(width / wxZRColaCharacterGridColumnWidth, 1);
|
||||
rows = std::max<int>((char_len + cols - 1) / cols, 1);
|
||||
rows = std::max<int>((char_count + cols - 1) / cols, 1);
|
||||
}
|
||||
|
||||
BeginBatch();
|
||||
@@ -146,14 +170,14 @@ void wxZRColaCharGrid::OnSize(wxSizeEvent& event)
|
||||
wxGridStringTable *table = new wxGridStringTable(rows, cols);
|
||||
for (int r = 0, i = 0; r < rows; r++)
|
||||
for (int c = 0; c < cols; c++, i++)
|
||||
table->SetValue(r, c, i < (int)char_len ? wxString(1, m_chars[i]) : wxEmptyString);
|
||||
table->SetValue(r, c, i < (int)char_count ? m_chars[i] : wxEmptyString);
|
||||
SetTable(table, true);
|
||||
if (!m_relevance.IsEmpty()) {
|
||||
const wxColour colour_def;
|
||||
const wxColour colour_irr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT);
|
||||
for (int r = 0, i = 0; r < rows; r++)
|
||||
for (int c = 0; c < cols; c++, i++)
|
||||
SetCellBackgroundColour(r, c, i >= (int)char_len || ((unsigned short)(m_relevance[i/16]) & (1<<(i%16))) ? colour_def : colour_irr);
|
||||
SetCellBackgroundColour(r, c, i >= (int)char_count || ((unsigned short)(m_relevance[i/16]) & (1<<(i%16))) ? colour_def : colour_irr);
|
||||
} else {
|
||||
for (int r = 0, i = 0; r < rows; r++)
|
||||
for (int c = 0; c < cols; c++, i++)
|
||||
@@ -217,7 +241,7 @@ void wxZRColaCharGrid::OnMotion(wxMouseEvent& event)
|
||||
return;
|
||||
|
||||
size_t toolTipIdx = row*m_numCols + col;
|
||||
if (toolTipIdx >= m_chars.Length()) {
|
||||
if (toolTipIdx >= m_chars.GetCount()) {
|
||||
// Index out of range.
|
||||
m_toolTipIdx = (size_t)-1;
|
||||
m_timerToolTip.Stop();
|
||||
@@ -241,7 +265,7 @@ void wxZRColaCharGrid::OnTooltipTimer(wxTimerEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
if (m_toolTipIdx >= m_chars.Length())
|
||||
if (m_toolTipIdx >= m_chars.GetCount())
|
||||
return;
|
||||
|
||||
GetGridWindow()->SetToolTip(GetToolTipText(m_toolTipIdx));
|
||||
|
||||
@@ -54,14 +54,21 @@ public:
|
||||
///
|
||||
/// Sets new array of characters to display
|
||||
///
|
||||
/// \param[in] chars The string containing characters to display
|
||||
/// \param[in] chars The string containing characters to display (zero delimited)
|
||||
///
|
||||
void SetCharacters(const wxString &chars);
|
||||
|
||||
///
|
||||
/// Sets new array of characters to display
|
||||
///
|
||||
/// \param[in] chars The string containing characters to display
|
||||
/// \param[in] chars The array of characters to display
|
||||
///
|
||||
void SetCharacters(const wxArrayString &chars);
|
||||
|
||||
///
|
||||
/// Sets new array of characters to display
|
||||
///
|
||||
/// \param[in] chars The string containing characters to display (zero delimited)
|
||||
/// \param[in] relevance Bit-array of \p chars relevance (1=more relevant, 0=less relevant)
|
||||
///
|
||||
void SetCharacters(const wxString &chars, const wxArrayShort &relevance);
|
||||
@@ -71,7 +78,7 @@ public:
|
||||
///
|
||||
/// \returns The string containing displayed characters
|
||||
///
|
||||
inline wxString GetCharacters() const
|
||||
inline const wxArrayString& GetCharacters() const
|
||||
{
|
||||
return m_chars;
|
||||
}
|
||||
@@ -83,10 +90,14 @@ public:
|
||||
///
|
||||
/// \returns Grid coordinates of selected character or (-1, -1) if character not found.
|
||||
///
|
||||
inline wxGridCellCoords GetCharacterCoords(wchar_t c) const
|
||||
inline wxGridCellCoords GetCharacterCoords(const wxString &c) const
|
||||
{
|
||||
int i = m_chars.Find(c);
|
||||
return i != wxNOT_FOUND ? wxGridCellCoords(i / m_numCols, i % m_numCols) : wxGridCellCoords(-1, -1);
|
||||
for (size_t i = 0, n = m_chars.GetCount(); ; i++) {
|
||||
if (i >= n)
|
||||
return wxGridCellCoords(-1, -1);
|
||||
else if (m_chars[i] == c)
|
||||
return wxGridCellCoords(i / m_numCols, i % m_numCols);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -102,7 +113,7 @@ private:
|
||||
void Init(); // common part of all ctors
|
||||
|
||||
protected:
|
||||
wxString m_chars; ///< Array of Unicode characters to display in the grid
|
||||
wxArrayString m_chars; ///< Array of Unicode characters to display in the grid
|
||||
wxArrayShort m_relevance; ///< Bit-array of `m_chars` relevance
|
||||
|
||||
private:
|
||||
|
||||
@@ -20,6 +20,174 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// wxZRColaUTF16CharValidator
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxZRColaUTF16CharValidator, wxValidator);
|
||||
|
||||
|
||||
wxZRColaUTF16CharValidator::wxZRColaUTF16CharValidator(wchar_t *val) :
|
||||
m_val(val),
|
||||
wxValidator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
wxObject* wxZRColaUTF16CharValidator::Clone() const
|
||||
{
|
||||
return new wxZRColaUTF16CharValidator(*this);
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUTF16CharValidator::Validate(wxWindow *parent)
|
||||
{
|
||||
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
|
||||
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
|
||||
if (!ctrl->IsEnabled()) return true;
|
||||
|
||||
wxString val(ctrl->GetValue());
|
||||
return Parse(val, 0, val.Length(), ctrl, parent);
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUTF16CharValidator::TransferToWindow()
|
||||
{
|
||||
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
|
||||
|
||||
if (m_val)
|
||||
((wxTextCtrl*)GetWindow())->SetValue(wxString::Format(wxT("%04X"), *m_val));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUTF16CharValidator::TransferFromWindow()
|
||||
{
|
||||
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
|
||||
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
|
||||
|
||||
wxString val(ctrl->GetValue());
|
||||
return Parse(val, 0, val.Length(), ctrl, NULL, m_val);
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUTF16CharValidator::Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wchar_t *val_out)
|
||||
{
|
||||
const wxStringCharType *buf = val_in;
|
||||
|
||||
wchar_t chr = 0;
|
||||
for (size_t i = i_start;;) {
|
||||
if (i >= i_end) {
|
||||
// End of Unicode found.
|
||||
if (val_out) *val_out = chr;
|
||||
return true;
|
||||
} else if (i >= i_start + 4) {
|
||||
// Maximum characters exceeded.
|
||||
ctrl->SetFocus();
|
||||
ctrl->SetSelection(i, i_end);
|
||||
wxMessageBox(_("Too many digits in Unicode."), _("Validation conflict"), wxOK | wxICON_EXCLAMATION, parent);
|
||||
return false;
|
||||
} else if (_T('0') <= buf[i] && buf[i] <= _T('9')) {
|
||||
// Digit found.
|
||||
chr = (chr << 4) | (buf[i] - _T('0'));
|
||||
i++;
|
||||
} else if (_T('A') <= buf[i] && buf[i] <= _T('F')) {
|
||||
// Capital letter found.
|
||||
chr = (chr << 4) | (buf[i] - _T('A') + 10);
|
||||
i++;
|
||||
} else if (_T('a') <= buf[i] && buf[i] <= _T('f')) {
|
||||
// Lower letter found.
|
||||
chr = (chr << 4) | (buf[i] - _T('a') + 10);
|
||||
i++;
|
||||
} else {
|
||||
// Invalid character found.
|
||||
ctrl->SetFocus();
|
||||
ctrl->SetSelection(i, i + 1);
|
||||
wxMessageBox(wxString::Format(_("Invalid character in Unicode found: %c"), buf[i]), _("Validation conflict"), wxOK | wxICON_EXCLAMATION, parent);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// wxZRColaUnicodeDumpValidator
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxZRColaUnicodeDumpValidator, wxValidator);
|
||||
|
||||
|
||||
wxZRColaUnicodeDumpValidator::wxZRColaUnicodeDumpValidator(wxString *val) :
|
||||
m_val(val),
|
||||
wxValidator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
wxObject* wxZRColaUnicodeDumpValidator::Clone() const
|
||||
{
|
||||
return new wxZRColaUnicodeDumpValidator(*this);
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUnicodeDumpValidator::Validate(wxWindow *parent)
|
||||
{
|
||||
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
|
||||
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
|
||||
if (!ctrl->IsEnabled()) return true;
|
||||
|
||||
wxString val(ctrl->GetValue());
|
||||
return Parse(val, 0, val.Length(), ctrl, parent);
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUnicodeDumpValidator::TransferToWindow()
|
||||
{
|
||||
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
|
||||
|
||||
if (m_val)
|
||||
((wxTextCtrl*)GetWindow())->SetValue(ZRCola::GetUnicodeDumpW(m_val->c_str(), m_val->length(), L"+"));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUnicodeDumpValidator::TransferFromWindow()
|
||||
{
|
||||
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
|
||||
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
|
||||
|
||||
wxString val(ctrl->GetValue());
|
||||
return Parse(val, 0, val.Length(), ctrl, NULL, m_val);
|
||||
}
|
||||
|
||||
|
||||
bool wxZRColaUnicodeDumpValidator::Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wxString *val_out)
|
||||
{
|
||||
const wxStringCharType *buf = val_in;
|
||||
|
||||
wxString str;
|
||||
for (size_t i = i_start;;) {
|
||||
const wxStringCharType *buf_next;
|
||||
wchar_t chr;
|
||||
if ((buf_next = wmemchr(buf + i, L'+', i_end - i)) != NULL) {
|
||||
// Unicode dump separator found.
|
||||
if (!wxZRColaUTF16CharValidator::Parse(val_in, i, buf_next - buf, ctrl, parent, &chr))
|
||||
return false;
|
||||
str += chr;
|
||||
i = buf_next - buf + 1;
|
||||
} else if (wxZRColaUTF16CharValidator::Parse(val_in, i, i_end, ctrl, parent, &chr)) {
|
||||
// The rest of the FQDN parsed succesfully.
|
||||
if (chr) str += chr;
|
||||
if (val_out) *val_out = str;
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// wxZRColaCharSelect
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -30,7 +198,6 @@ wxDEFINE_EVENT(wxEVT_SEARCH_COMPLETE, wxThreadEvent);
|
||||
wxZRColaCharSelect::wxZRColaCharSelect(wxWindow* parent) :
|
||||
m_searchChanged(false),
|
||||
m_unicodeChanged(false),
|
||||
m_char(0),
|
||||
m_searchThread(NULL),
|
||||
wxZRColaCharSelectBase(parent)
|
||||
{
|
||||
@@ -46,15 +213,15 @@ wxZRColaCharSelect::wxZRColaCharSelect(wxWindow* parent) :
|
||||
|
||||
m_search_more->SetLabel(_(L"▸ Search Options"));
|
||||
|
||||
m_unicode->SetValidator(wxHexValidator<wchar_t>(&m_char, wxNUM_VAL_DEFAULT, 4));
|
||||
m_unicode->SetValidator(wxZRColaUnicodeDumpValidator(&m_char));
|
||||
|
||||
// Fill categories.
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRnk[i];
|
||||
int idx = m_categories->Insert(wxGetTranslation(wxString(cc.name, cc.name_len), wxT("ZRCola-zrcdb")), i);
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRank[i];
|
||||
int idx = m_categories->Insert(wxGetTranslation(wxString(cc.name(), cc.name_len()), wxT("ZRCola-zrcdb")), i);
|
||||
m_categories->Check(idx);
|
||||
m_ccOrder.insert(std::make_pair(cc.id, idx));
|
||||
m_ccOrder.insert(std::make_pair(cc.cat, idx));
|
||||
}
|
||||
|
||||
ResetResults();
|
||||
@@ -84,24 +251,24 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
|
||||
if (m_unicode->GetValidator()->TransferFromWindow()) {
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
|
||||
m_gridPreview->SetCellValue(wxString(1, m_char), 0, 0);
|
||||
m_gridPreview->SetCellValue(m_char, 0, 0);
|
||||
|
||||
char chr[sizeof(ZRCola::character_db::character)] = {};
|
||||
((ZRCola::character_db::character*)chr)->chr = m_char;
|
||||
std::unique_ptr<ZRCola::character_db::character> chr((ZRCola::character_db::character*)new char[sizeof(ZRCola::character_db::character) + sizeof(wchar_t)*m_char.length()]);
|
||||
chr->ZRCola::character_db::character::character(m_char.data(), m_char.length());
|
||||
size_t start;
|
||||
if (app->m_chr_db.idxChr.find(*(ZRCola::character_db::character*)chr, start)) {
|
||||
if (app->m_chr_db.idxChr.find(*chr, start)) {
|
||||
const auto &chr = app->m_chr_db.idxChr[start];
|
||||
// Update character description.
|
||||
m_description->SetValue(wxString(chr.data, chr.desc_len));
|
||||
m_description->SetValue(wxString(chr.desc(), chr.desc_len()));
|
||||
{
|
||||
// See if this character has a key sequence registered.
|
||||
char ks[sizeof(ZRCola::keyseq_db::keyseq)] = {};
|
||||
((ZRCola::keyseq_db::keyseq*)ks)->chr = m_char;
|
||||
std::unique_ptr<ZRCola::keyseq_db::keyseq> ks((ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(wchar_t)*m_char.length()]);
|
||||
ks->ZRCola::keyseq_db::keyseq::keyseq(NULL, 0, m_char.data(), m_char.length());
|
||||
ZRCola::keyseq_db::indexKey::size_type start;
|
||||
if (app->m_ks_db.idxChr.find(*(ZRCola::keyseq_db::keyseq*)ks, start)) {
|
||||
if (app->m_ks_db.idxChr.find(*ks, start)) {
|
||||
ZRCola::keyseq_db::keyseq &seq = app->m_ks_db.idxChr[start];
|
||||
wxString ks_str;
|
||||
if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq, seq.seq_len, ks_str))
|
||||
if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq(), seq.seq_len(), ks_str))
|
||||
m_shortcut->SetValue(ks_str);
|
||||
else
|
||||
m_shortcut->SetValue(wxEmptyString);
|
||||
@@ -109,18 +276,16 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
|
||||
m_shortcut->SetValue(wxEmptyString);
|
||||
}
|
||||
{
|
||||
char cc[sizeof(ZRCola::chrcat_db::chrcat)] = {};
|
||||
((ZRCola::chrcat_db::chrcat*)cc)->id = chr.cat;
|
||||
size_t start;
|
||||
// Update character category.
|
||||
if (app->m_cc_db.idxChrCat.find(*((ZRCola::chrcat_db::chrcat*)cc), start)) {
|
||||
if (app->m_cc_db.idxChrCat.find(ZRCola::chrcat_db::chrcat(chr.cat), start)) {
|
||||
const auto &cat = app->m_cc_db.idxChrCat[start];
|
||||
m_category->SetValue(wxGetTranslation(wxString(cat.name, cat.name_len), wxT("ZRCola-zrcdb")));
|
||||
m_category->SetValue(wxGetTranslation(wxString(cat.name(), cat.name_len()), wxT("ZRCola-zrcdb")));
|
||||
} else
|
||||
m_category->SetValue(wxEmptyString);
|
||||
}
|
||||
// Update related characters.
|
||||
m_gridRelated->SetCharacters(wxString(chr.data + chr.desc_len, chr.rel_len));
|
||||
m_gridRelated->SetCharacters(wxString(chr.rel(), chr.rel_end()));
|
||||
} else {
|
||||
m_description->SetValue(wxEmptyString);
|
||||
m_shortcut->SetValue(wxEmptyString);
|
||||
@@ -130,18 +295,16 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
|
||||
|
||||
// Find character tags.
|
||||
std::list<std::wstring> tag_names;
|
||||
ZRCola::chrtag_db::chrtag ct = { m_char };
|
||||
std::unique_ptr<ZRCola::chrtag_db::chrtag> ct((ZRCola::chrtag_db::chrtag*)new char[sizeof(ZRCola::chrtag_db::chrtag) + sizeof(wchar_t)*m_char.length()]);
|
||||
ct->ZRCola::chrtag_db::chrtag::chrtag(m_char.data(), m_char.length());
|
||||
size_t end;
|
||||
if (app->m_ct_db.idxChr.find(ct, start, end)) {
|
||||
if (app->m_ct_db.idxChr.find(*ct, start, end)) {
|
||||
for (size_t i = start; i < end; i++) {
|
||||
const ZRCola::chrtag_db::chrtag &ct = app->m_ct_db.idxChr[i];
|
||||
|
||||
// Find tag names.
|
||||
char tn[sizeof(ZRCola::tagname_db::tagname)] = {};
|
||||
((ZRCola::tagname_db::tagname*)tn)->locale = m_locale;
|
||||
((ZRCola::tagname_db::tagname*)tn)->tag = ct.tag;
|
||||
size_t start, end;
|
||||
if (app->m_tn_db.idxTag.find(*((ZRCola::tagname_db::tagname*)tn), start, end)) {
|
||||
if (app->m_tn_db.idxTag.find(ZRCola::tagname_db::tagname(ct.tag, m_locale), start, end)) {
|
||||
for (size_t i = start; i < end; i++) {
|
||||
const ZRCola::tagname_db::tagname &tn = app->m_tn_db.idxTag[i];
|
||||
|
||||
@@ -149,9 +312,9 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
|
||||
for (auto name = tag_names.cbegin(), name_end = tag_names.cend();; ++name) {
|
||||
if (name == name_end) {
|
||||
// Add name to the list.
|
||||
tag_names.push_back(std::wstring(tn.name, tn.name + tn.name_len));
|
||||
tag_names.push_back(std::wstring(tn.name(), tn.name_end()));
|
||||
break;
|
||||
} else if (ZRCola::tagname_db::tagname::CompareName(m_locale, name->data(), (unsigned __int16)name->length(), tn.name, tn.name_len) == 0)
|
||||
} else if (ZRCola::tagname_db::tagname::CompareName(m_locale, name->data(), (unsigned __int16)name->length(), tn.name(), tn.name_len()) == 0)
|
||||
// Name is already on the list.
|
||||
break;
|
||||
}
|
||||
@@ -191,10 +354,10 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
|
||||
m_searchThread->m_search.assign(val.c_str(), val.Length());
|
||||
|
||||
// Select categories.
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRnk[i];
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRank[i];
|
||||
if (m_categories->IsChecked(i))
|
||||
m_searchThread->m_cats.insert(cc.id);
|
||||
m_searchThread->m_cats.insert(cc.cat);
|
||||
}
|
||||
|
||||
if (m_searchThread->Run() != wxTHREAD_NO_ERROR) {
|
||||
@@ -239,7 +402,7 @@ void wxZRColaCharSelect::OnCategoriesAll(wxHyperlinkEvent& event)
|
||||
event.StopPropagation();
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++)
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++)
|
||||
m_categories->Check(i, true);
|
||||
|
||||
m_searchChanged = true;
|
||||
@@ -251,7 +414,7 @@ void wxZRColaCharSelect::OnCategoriesNone(wxHyperlinkEvent& event)
|
||||
event.StopPropagation();
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++)
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++)
|
||||
m_categories->Check(i, false);
|
||||
|
||||
m_searchChanged = true;
|
||||
@@ -263,7 +426,7 @@ void wxZRColaCharSelect::OnCategoriesInvert(wxHyperlinkEvent& event)
|
||||
event.StopPropagation();
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++)
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++)
|
||||
m_categories->Check(i, !m_categories->IsChecked(i));
|
||||
|
||||
m_searchChanged = true;
|
||||
@@ -284,10 +447,10 @@ void wxZRColaCharSelect::OnSearchComplete(wxThreadEvent& event)
|
||||
|
||||
if (m_searchThread) {
|
||||
// Display results.
|
||||
wxString chars;
|
||||
wxArrayString chars;
|
||||
chars.reserve(m_searchThread->m_hits.size());
|
||||
for (auto i = m_searchThread->m_hits.cbegin(), i_end = m_searchThread->m_hits.cend(); i != i_end; ++i)
|
||||
chars += i->second;
|
||||
chars.Add(i->second);
|
||||
m_gridResults->SetCharacters(chars);
|
||||
|
||||
m_searchThread->Delete();
|
||||
@@ -304,7 +467,7 @@ void wxZRColaCharSelect::OnResultSelectCell(wxGridEvent& event)
|
||||
|
||||
wxString val(m_gridResults->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
if (!val.IsEmpty())
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
}
|
||||
|
||||
|
||||
@@ -314,7 +477,7 @@ void wxZRColaCharSelect::OnResultCellDClick(wxGridEvent& event)
|
||||
|
||||
wxString val(m_gridResults->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
if (!val.IsEmpty()) {
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
|
||||
m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
|
||||
}
|
||||
@@ -328,7 +491,7 @@ void wxZRColaCharSelect::OnResultsKeyDown(wxKeyEvent& event)
|
||||
case WXK_NUMPAD_ENTER:
|
||||
wxString val(m_gridResults->GetCellValue(m_gridResults->GetCursorRow(), m_gridResults->GetCursorColumn()));
|
||||
if (!val.IsEmpty()) {
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
|
||||
m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
|
||||
|
||||
@@ -347,7 +510,7 @@ void wxZRColaCharSelect::OnRecentSelectCell(wxGridEvent& event)
|
||||
|
||||
wxString val(m_gridRecent->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
if (!val.IsEmpty())
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
}
|
||||
|
||||
|
||||
@@ -357,7 +520,7 @@ void wxZRColaCharSelect::OnRecentCellDClick(wxGridEvent& event)
|
||||
|
||||
wxString val(m_gridRecent->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
if (!val.IsEmpty()) {
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
|
||||
m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
|
||||
}
|
||||
@@ -371,7 +534,7 @@ void wxZRColaCharSelect::OnRecentKeyDown(wxKeyEvent& event)
|
||||
case WXK_NUMPAD_ENTER:
|
||||
wxString val(m_gridRecent->GetCellValue(m_gridRecent->GetCursorRow(), m_gridRecent->GetCursorColumn()));
|
||||
if (!val.IsEmpty()) {
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
|
||||
m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
|
||||
|
||||
@@ -431,7 +594,7 @@ void wxZRColaCharSelect::OnRelatedSelectCell(wxGridEvent& event)
|
||||
|
||||
wxString val(m_gridRelated->GetCellValue(event.GetRow(), event.GetCol()));
|
||||
if (!val.IsEmpty())
|
||||
NavigateTo(val[0]);
|
||||
NavigateTo(val);
|
||||
}
|
||||
|
||||
|
||||
@@ -439,15 +602,15 @@ void wxZRColaCharSelect::OnOKButtonClick(wxCommandEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
wxString
|
||||
recent(m_gridRecent->GetCharacters()),
|
||||
val(1, m_char);
|
||||
for (size_t i = 0, n = recent.Length(); i < n; i++) {
|
||||
const wxStringCharType c = recent[i];
|
||||
const wxArrayString &recent = m_gridRecent->GetCharacters();
|
||||
wxArrayString val;
|
||||
val.reserve(recent.GetCount() + 1);
|
||||
val.Add(m_char);
|
||||
for (size_t i = 0, n = recent.GetCount(); i < n; i++) {
|
||||
const wxString &c = recent[i];
|
||||
if (c != m_char)
|
||||
val += c;
|
||||
val.Add(c);
|
||||
}
|
||||
|
||||
m_gridRecent->SetCharacters(val);
|
||||
}
|
||||
|
||||
@@ -457,13 +620,13 @@ void wxZRColaCharSelect::ResetResults()
|
||||
// Fill the results.
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
size_t i, n = app->m_chr_db.idxChr.size();
|
||||
wxString val;
|
||||
wxArrayString val;
|
||||
val.reserve(n);
|
||||
for (i = 0; i < n; i++) {
|
||||
const auto &chr = app->m_chr_db.idxChr[i];
|
||||
auto idx = m_ccOrder.find(chr.cat);
|
||||
if (idx == m_ccOrder.end() || m_categories->IsChecked(idx->second))
|
||||
val += chr.chr;
|
||||
val.Add(wxString(chr.chr(), chr.chr_len()));
|
||||
}
|
||||
m_gridResults->SetCharacters(val);
|
||||
}
|
||||
@@ -507,7 +670,7 @@ void wxZRColaCharSelect::NavigateBy(int offset)
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaCharSelect::NavigateTo(wchar_t c)
|
||||
void wxZRColaCharSelect::NavigateTo(const wxString &c)
|
||||
{
|
||||
if (m_char != c) {
|
||||
// Update history state
|
||||
@@ -548,7 +711,7 @@ wxZRColaCharSelect::SearchThread::SearchThread(wxZRColaCharSelect *parent) :
|
||||
wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry()
|
||||
{
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
std::map<wchar_t, ZRCola::charrank_t> hits;
|
||||
std::map<std::wstring, ZRCola::charrank_t> hits;
|
||||
|
||||
if (TestDestroy()) return (wxThread::ExitCode)1;
|
||||
|
||||
@@ -561,7 +724,7 @@ wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry()
|
||||
|
||||
{
|
||||
// Search by description and merge results.
|
||||
std::map<wchar_t, ZRCola::charrank_t> hits_sub;
|
||||
std::map<std::wstring, ZRCola::charrank_t> hits_sub;
|
||||
if (!app->m_chr_db.Search(m_search.c_str(), m_cats, hits, hits_sub, TestDestroyS, this)) return (wxThread::ExitCode)1;
|
||||
for (auto i = hits_sub.cbegin(), i_end = hits_sub.cend(); i != i_end; ++i) {
|
||||
if (TestDestroy()) return (wxThread::ExitCode)1;
|
||||
@@ -589,7 +752,7 @@ wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry()
|
||||
if (i->second > rank_threshold)
|
||||
m_hits.push_back(std::make_pair(i->second, i->first));
|
||||
}
|
||||
std::qsort(m_hits.data(), m_hits.size(), sizeof(std::pair<ZRCola::charrank_t, wchar_t>), CompareHits);
|
||||
std::qsort(m_hits.data(), m_hits.size(), sizeof(std::pair<ZRCola::charrank_t, std::wstring>), CompareHits);
|
||||
|
||||
// Signal the event handler that this thread is going to be destroyed.
|
||||
// NOTE: here we assume that using the m_parent pointer is safe,
|
||||
@@ -637,12 +800,25 @@ void wxPersistentZRColaCharSelect::Save() const
|
||||
auto wnd = static_cast<const wxZRColaCharSelect*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
|
||||
SaveValue(wxT("recentChars"), wnd->m_gridRecent->GetCharacters());
|
||||
wxString str, str2;
|
||||
auto &recent = wnd->m_gridRecent->GetCharacters();
|
||||
for (size_t i = 0, n = recent.GetCount(); i < n; i++) {
|
||||
if (i) str2 += wxT('|');
|
||||
auto &chr = recent[i];
|
||||
for (size_t j = 0, m = chr.Length(); j < m; j++) {
|
||||
if (j) str2 += wxT('+');
|
||||
str2 += wxString::Format(wxT("%04X"), chr[j]);
|
||||
}
|
||||
if (chr.Length() == 1)
|
||||
str += chr[0];
|
||||
}
|
||||
SaveValue(wxT("recentChars" ), str ); // Save in legacy format for backward compatibility.
|
||||
SaveValue(wxT("recentChars2"), str2); // Save in native format
|
||||
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRnk[i];
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRank[i];
|
||||
wxString name(wxT("category"));
|
||||
name.Append(cc.id.data, _countof(cc.id.data));
|
||||
name.Append(cc.cat.data, _countof(cc.cat.data));
|
||||
SaveValue(name, wnd->m_categories->IsChecked(i));
|
||||
}
|
||||
|
||||
@@ -655,14 +831,29 @@ bool wxPersistentZRColaCharSelect::Restore()
|
||||
auto wnd = dynamic_cast<wxZRColaCharSelect*>(GetWindow());
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
|
||||
wxString recent;
|
||||
if (RestoreValue(wxT("recentChars"), &recent))
|
||||
wnd->m_gridRecent->SetCharacters(recent);
|
||||
wxString str;
|
||||
if (RestoreValue(wxT("recentChars2"), &str)) {
|
||||
// Native format found.
|
||||
wxArrayString val;
|
||||
for (wxStringTokenizer tok(str, wxT("|")); tok.HasMoreTokens(); ) {
|
||||
wxString chr;
|
||||
for (wxStringTokenizer tok_chr(tok.GetNextToken(), wxT("+")); tok_chr.HasMoreTokens(); )
|
||||
chr += (wchar_t)_tcstoul(tok_chr.GetNextToken().c_str(), NULL, 16);
|
||||
val.Add(chr);
|
||||
}
|
||||
wnd->m_gridRecent->SetCharacters(val);
|
||||
} else if (RestoreValue(wxT("recentChars"), &str)) {
|
||||
// Legacy value found.
|
||||
wxArrayString val;
|
||||
for (size_t i = 0, n = str.Length(); i < n; i++)
|
||||
val.Add(wxString(1, str[i]));
|
||||
wnd->m_gridRecent->SetCharacters(val);
|
||||
}
|
||||
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRnk[i];
|
||||
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) {
|
||||
const auto &cc = app->m_cc_db.idxRank[i];
|
||||
wxString name(wxT("category"));
|
||||
name.Append(cc.id.data, _countof(cc.id.data));
|
||||
name.Append(cc.cat.data, _countof(cc.cat.data));
|
||||
bool val;
|
||||
if (RestoreValue(name, &val))
|
||||
wnd->m_categories->Check(i, val);
|
||||
|
||||
@@ -28,15 +28,106 @@ class wxPersistentZRColaCharSelect;
|
||||
|
||||
#include "zrcolagui.h"
|
||||
#include <zrcola/character.h>
|
||||
#include <wxex/valhex.h>
|
||||
#include <wx/validate.h>
|
||||
#include <wxex/persist/dialog.h>
|
||||
#include <wx/event.h>
|
||||
#include <wx/thread.h>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
///
|
||||
/// Validator for Unicode character
|
||||
///
|
||||
class WXEXTEND_API wxZRColaUTF16CharValidator : public wxValidator
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Construct the validator with a value to store data
|
||||
///
|
||||
wxZRColaUTF16CharValidator(wchar_t *val = NULL);
|
||||
|
||||
///
|
||||
/// Copies this validator
|
||||
///
|
||||
virtual wxObject* Clone() const;
|
||||
|
||||
///
|
||||
/// Validates the value
|
||||
///
|
||||
virtual bool Validate(wxWindow *parent);
|
||||
|
||||
///
|
||||
/// Transfers the value to the window
|
||||
///
|
||||
virtual bool TransferToWindow();
|
||||
|
||||
///
|
||||
/// Transfers the value from the window
|
||||
///
|
||||
virtual bool TransferFromWindow();
|
||||
|
||||
///
|
||||
/// Parses FQDN value
|
||||
///
|
||||
static bool Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wchar_t *val_out = NULL);
|
||||
|
||||
protected:
|
||||
wchar_t *m_val; ///< Pointer to variable to receive control's parsed value
|
||||
|
||||
private:
|
||||
wxDECLARE_DYNAMIC_CLASS(wxZRColaUTF16CharValidator);
|
||||
wxDECLARE_NO_ASSIGN_CLASS(wxZRColaUTF16CharValidator);
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Validator for Unicode dump
|
||||
///
|
||||
class wxZRColaUnicodeDumpValidator : public wxValidator
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Construct the validator with a value to store data
|
||||
///
|
||||
wxZRColaUnicodeDumpValidator(wxString *val = NULL);
|
||||
|
||||
///
|
||||
/// Copies this validator
|
||||
///
|
||||
virtual wxObject* Clone() const;
|
||||
|
||||
///
|
||||
/// Validates the value
|
||||
///
|
||||
virtual bool Validate(wxWindow *parent);
|
||||
|
||||
///
|
||||
/// Transfers the value to the window
|
||||
///
|
||||
virtual bool TransferToWindow();
|
||||
|
||||
///
|
||||
/// Transfers the value from the window
|
||||
///
|
||||
virtual bool TransferFromWindow();
|
||||
|
||||
///
|
||||
/// Parses Unicode dump value
|
||||
///
|
||||
static bool Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wxString *val_out = NULL);
|
||||
|
||||
protected:
|
||||
wxString *m_val; ///< Pointer to variable to receive control's parsed value
|
||||
|
||||
private:
|
||||
wxDECLARE_DYNAMIC_CLASS(wxZRColaUnicodeDumpValidator);
|
||||
wxDECLARE_NO_ASSIGN_CLASS(wxZRColaUnicodeDumpValidator);
|
||||
};
|
||||
|
||||
|
||||
wxDECLARE_EVENT(wxEVT_SEARCH_COMPLETE, wxThreadEvent);
|
||||
|
||||
|
||||
@@ -76,10 +167,10 @@ protected:
|
||||
|
||||
void ResetResults();
|
||||
void NavigateBy(int offset);
|
||||
void NavigateTo(wchar_t c);
|
||||
void NavigateTo(const wxString &c);
|
||||
|
||||
public:
|
||||
wchar_t m_char; ///< Currently selected character (0 when none)
|
||||
wxString m_char; ///< Currently selected character (empty when none)
|
||||
|
||||
protected:
|
||||
LCID m_locale; ///< Locale for tag lookup
|
||||
@@ -104,7 +195,7 @@ protected:
|
||||
public:
|
||||
std::wstring m_search; ///< Search phrase
|
||||
std::set<ZRCola::chrcatid_t> m_cats; ///< Search categories
|
||||
std::vector<std::pair<ZRCola::charrank_t, wchar_t> > m_hits; ///< Search results
|
||||
std::vector<std::pair<ZRCola::charrank_t, std::wstring> > m_hits; ///< Search results
|
||||
|
||||
protected:
|
||||
wxZRColaCharSelect *m_parent; ///< Thread owner
|
||||
@@ -116,7 +207,7 @@ protected:
|
||||
///
|
||||
struct NavigationState
|
||||
{
|
||||
wchar_t m_char;
|
||||
std::wstring m_char;
|
||||
struct {
|
||||
wxGridCellCoords m_selected;
|
||||
} m_related;
|
||||
|
||||
@@ -25,42 +25,42 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
wxZRColaComposerPanel::wxZRColaComposerPanel(wxWindow* parent) :
|
||||
m_decomposedChanged(false),
|
||||
m_composedChanged(false),
|
||||
m_selDecomposed(0, 0),
|
||||
m_selComposed(0, 0),
|
||||
m_sourceChanged(false),
|
||||
m_destinationChanged(false),
|
||||
m_selSource(0, 0),
|
||||
m_selDestination(0, 0),
|
||||
wxZRColaComposerPanelBase(parent)
|
||||
{
|
||||
m_decomposed->PushEventHandler(&m_keyhandler);
|
||||
m_source->PushEventHandler(&m_keyhandler);
|
||||
|
||||
// Restore the previously saved state (if exists).
|
||||
wxString fileName(GetStateFileName());
|
||||
if (wxFileExists(fileName)) {
|
||||
wxFFile file(fileName, wxT("rb"));
|
||||
if (file.IsOpened()) {
|
||||
// Load decomposed text.
|
||||
// Load source text.
|
||||
unsigned __int64 n;
|
||||
file.Read(&n, sizeof(n));
|
||||
if (!file.Error()) {
|
||||
wxString decomposed;
|
||||
file.Read(wxStringBuffer(decomposed, n), sizeof(wchar_t)*n);
|
||||
wxString source;
|
||||
file.Read(wxStringBuffer(source, n), sizeof(wchar_t)*n);
|
||||
if (!file.Error()) {
|
||||
// Load composed text.
|
||||
// Load destination text.
|
||||
file.Read(&n, sizeof(n));
|
||||
if (!file.Error()) {
|
||||
wxString composed;
|
||||
file.Read(wxStringBuffer(composed, n), sizeof(wchar_t)*n);
|
||||
wxString destination;
|
||||
file.Read(wxStringBuffer(destination, n), sizeof(wchar_t)*n);
|
||||
if (!file.Error()) {
|
||||
// Restore state.
|
||||
m_decomposed->SetValue(decomposed);
|
||||
m_decomposed->GetSelection(&m_selDecomposed.first, &m_selDecomposed.second);
|
||||
SetHexValue(m_decomposedHex, m_selDecomposedHex, m_mappingDecomposedHex, decomposed.GetData(), decomposed.Length(), m_selDecomposed.first, m_selDecomposed.second);
|
||||
m_decomposedChanged = false;
|
||||
m_source->SetValue(source);
|
||||
m_source->GetSelection(&m_selSource.first, &m_selSource.second);
|
||||
SetHexValue(m_sourceHex, m_selSourceHex, m_mappingSourceHex, source.GetData(), source.Length(), m_selSource.first, m_selSource.second);
|
||||
m_sourceChanged = false;
|
||||
|
||||
m_composed->SetValue(composed);
|
||||
m_composed->GetSelection(&m_selComposed.first, &m_selComposed.second);
|
||||
SetHexValue(m_composedHex, m_selComposedHex, m_mappingComposedHex, composed.GetData(), composed.Length(), m_selComposed.first, m_selComposed.second);
|
||||
m_composedChanged = false;
|
||||
m_destination->SetValue(destination);
|
||||
m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second);
|
||||
SetHexValue(m_destinationHex, m_selDestinationHex, m_mappingDestinationHex, destination.GetData(), destination.Length(), m_selDestination.first, m_selDestination.second);
|
||||
m_destinationChanged = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,7 @@ wxZRColaComposerPanel::wxZRColaComposerPanel(wxWindow* parent) :
|
||||
|
||||
wxZRColaComposerPanel::~wxZRColaComposerPanel()
|
||||
{
|
||||
m_decomposed->PopEventHandler();
|
||||
m_source->PopEventHandler();
|
||||
|
||||
// This is a controlled exit. Purge saved state.
|
||||
wxString fileName(GetStateFileName());
|
||||
@@ -83,195 +83,221 @@ wxZRColaComposerPanel::~wxZRColaComposerPanel()
|
||||
|
||||
void wxZRColaComposerPanel::SynchronizePanels()
|
||||
{
|
||||
if (m_decomposedChanged) {
|
||||
if (m_sourceChanged) {
|
||||
m_timerSave.Stop();
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
wxString src;
|
||||
size_t len = GetValue(m_decomposed, src);
|
||||
|
||||
std::wstring norm;
|
||||
app->m_t_db.Decompose(src.data(), len, norm, &m_mapping1);
|
||||
|
||||
std::wstring dst;
|
||||
app->m_t_db.Compose(norm.data(), norm.size(), dst, &m_mapping2);
|
||||
|
||||
m_decomposed->GetSelection(&m_selDecomposed.first, &m_selDecomposed.second);
|
||||
|
||||
// Update decomposed HEX dump.
|
||||
SetHexValue(m_decomposedHex, m_selDecomposedHex, m_mappingDecomposedHex, src.data(), len, m_selDecomposed.first, m_selDecomposed.second);
|
||||
|
||||
// Update composed text, and its HEX dump.
|
||||
m_composed->SetValue(dst);
|
||||
m_composed->SetSelection(
|
||||
m_selComposed.first = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.first )),
|
||||
m_selComposed.second = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.second)));
|
||||
SetHexValue(m_composedHex, m_selComposedHex, m_mappingComposedHex, dst.data(), dst.length(), m_selComposed.first, m_selComposed.second);
|
||||
|
||||
// Schedule state save after 3s.
|
||||
m_timerSave.Start(3000, true);
|
||||
} else if (m_composedChanged) {
|
||||
m_timerSave.Stop();
|
||||
|
||||
wxString src;
|
||||
size_t len = GetValue(m_composed, src);
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
std::wstring dst;
|
||||
wxZRColaFrame *mainWnd = dynamic_cast<wxZRColaFrame*>(wxGetActiveWindow());
|
||||
if (mainWnd)
|
||||
app->m_t_db.Decompose(src.data(), len, &app->m_lc_db, mainWnd->m_settings->m_lang, dst, &m_mapping2);
|
||||
else
|
||||
app->m_t_db.Decompose(src.data(), len, dst, &m_mapping2);
|
||||
wxASSERT_MSG(mainWnd, "main window missing");
|
||||
|
||||
m_mapping1.clear();
|
||||
m_mapping2.invert();
|
||||
wxString src;
|
||||
size_t len = GetValue(m_source, src);
|
||||
std::wstring dst(src.data(), len), dst2;
|
||||
ZRCola::mapping_vector map;
|
||||
|
||||
m_composed->GetSelection(&m_selComposed.first, &m_selComposed.second);
|
||||
m_mapping.clear();
|
||||
for (auto s = mainWnd->m_settings->m_transeq.cbegin(), s_end = mainWnd->m_settings->m_transeq.cend(); s != s_end; ++s) {
|
||||
if (*s == 0) {
|
||||
// ZRCola Decomposed => ZRCola Composed should decompose first.
|
||||
app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), dst2, &map);
|
||||
m_mapping.push_back(std::move(map));
|
||||
|
||||
// Update composed HEX dump.
|
||||
SetHexValue(m_composedHex, m_selComposedHex, m_mappingComposedHex, src.data(), len, m_selComposed.first, m_selComposed.second);
|
||||
app->m_t_db.Translate(*s, dst2.data(), dst2.size(), dst, &map);
|
||||
m_mapping.push_back(std::move(map));
|
||||
} else {
|
||||
// Other transforms
|
||||
app->m_t_db.Translate(*s, dst.data(), dst.size(), dst2, &map);
|
||||
m_mapping.push_back(std::move(map));
|
||||
dst = std::move(dst2);
|
||||
}
|
||||
}
|
||||
|
||||
// Update decomposed text, and its HEX dump.
|
||||
m_decomposed->SetValue(dst);
|
||||
m_decomposed->SetSelection(
|
||||
m_selDecomposed.first = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.first )),
|
||||
m_selDecomposed.second = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.second)));
|
||||
SetHexValue(m_decomposedHex, m_selDecomposedHex, m_mappingDecomposedHex, dst.data(), dst.length(), m_selDecomposed.first, m_selDecomposed.second);
|
||||
m_source->GetSelection(&m_selSource.first, &m_selSource.second);
|
||||
|
||||
// Update source HEX dump.
|
||||
SetHexValue(m_sourceHex, m_selSourceHex, m_mappingSourceHex, src.data(), len, m_selSource.first, m_selSource.second);
|
||||
|
||||
// Update destination text, and its HEX dump.
|
||||
m_destination->SetValue(dst);
|
||||
m_destination->SetSelection(
|
||||
m_selDestination.first = MapToDestination(m_selSource.first ),
|
||||
m_selDestination.second = MapToDestination(m_selSource.second));
|
||||
SetHexValue(m_destinationHex, m_selDestinationHex, m_mappingDestinationHex, dst.data(), dst.length(), m_selDestination.first, m_selDestination.second);
|
||||
|
||||
// Schedule state save after 3s.
|
||||
m_timerSave.Start(3000, true);
|
||||
} else if (m_destinationChanged) {
|
||||
m_timerSave.Stop();
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
wxZRColaFrame *mainWnd = dynamic_cast<wxZRColaFrame*>(wxGetActiveWindow());
|
||||
wxASSERT_MSG(mainWnd, "main window missing");
|
||||
|
||||
wxString src;
|
||||
size_t len = GetValue(m_destination, src);
|
||||
std::wstring dst(src.data(), len), dst2;
|
||||
ZRCola::mapping_vector map;
|
||||
|
||||
m_mapping.clear();
|
||||
for (auto s = mainWnd->m_settings->m_transeq.crbegin(), s_end = mainWnd->m_settings->m_transeq.crend(); s != s_end; ++s) {
|
||||
if (*s) {
|
||||
// ZRCola Decomposed => ZRCola Composed
|
||||
app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), &app->m_lc_db, mainWnd->m_settings->m_lang, dst2, &map);
|
||||
} else {
|
||||
// Other transforms
|
||||
app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), dst2, &map);
|
||||
}
|
||||
dst = std::move(dst2);
|
||||
|
||||
map.invert();
|
||||
m_mapping.push_back(std::move(map));
|
||||
}
|
||||
|
||||
m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second);
|
||||
|
||||
// Update destination HEX dump.
|
||||
SetHexValue(m_destinationHex, m_selDestinationHex, m_mappingDestinationHex, src.data(), len, m_selDestination.first, m_selDestination.second);
|
||||
|
||||
// Update source text, and its HEX dump.
|
||||
m_source->SetValue(dst);
|
||||
m_source->SetSelection(
|
||||
m_selSource.first = MapToSource(m_selDestination.first ),
|
||||
m_selSource.second = MapToSource(m_selDestination.second));
|
||||
SetHexValue(m_sourceHex, m_selSourceHex, m_mappingSourceHex, dst.data(), dst.length(), m_selSource.first, m_selSource.second);
|
||||
|
||||
// Schedule state save after 3s.
|
||||
m_timerSave.Start(3000, true);
|
||||
}
|
||||
|
||||
m_decomposedChanged = false;
|
||||
m_composedChanged = false;
|
||||
m_sourceChanged = false;
|
||||
m_destinationChanged = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxZRColaComposerPanel::OnDecomposedPaint(wxPaintEvent& event)
|
||||
void wxZRColaComposerPanel::OnSourcePaint(wxPaintEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
long from, to;
|
||||
m_decomposed->GetSelection(&from, &to);
|
||||
m_source->GetSelection(&from, &to);
|
||||
|
||||
if (m_selDecomposed.first != from || m_selDecomposed.second != to) {
|
||||
if (m_selSource.first != from || m_selSource.second != to) {
|
||||
// Save new selection first, to avoid loop.
|
||||
m_selDecomposed.first = from;
|
||||
m_selDecomposed.second = to;
|
||||
m_selSource.first = from;
|
||||
m_selSource.second = to;
|
||||
|
||||
m_decomposedHex->SetSelection(
|
||||
m_selDecomposedHex.first = m_mappingDecomposedHex.to_dst(from),
|
||||
m_selDecomposedHex.second = m_mappingDecomposedHex.to_dst(to ));
|
||||
m_sourceHex->SetSelection(
|
||||
m_selSourceHex.first = m_mappingSourceHex.to_dst(from),
|
||||
m_selSourceHex.second = m_mappingSourceHex.to_dst(to ));
|
||||
|
||||
m_composed->SetSelection(
|
||||
m_selComposed.first = m_mapping2.to_dst(m_mapping1.to_dst(from)),
|
||||
m_selComposed.second = m_mapping2.to_dst(m_mapping1.to_dst(to )));
|
||||
m_destination->SetSelection(
|
||||
m_selDestination.first = MapToDestination(from),
|
||||
m_selDestination.second = MapToDestination(to ));
|
||||
|
||||
m_composedHex->SetSelection(
|
||||
m_selComposedHex.first = m_mappingComposedHex.to_dst(m_selComposed.first ),
|
||||
m_selComposedHex.second = m_mappingComposedHex.to_dst(m_selComposed.second));
|
||||
m_destinationHex->SetSelection(
|
||||
m_selDestinationHex.first = m_mappingDestinationHex.to_dst(m_selDestination.first ),
|
||||
m_selDestinationHex.second = m_mappingDestinationHex.to_dst(m_selDestination.second));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaComposerPanel::OnDecomposedHexPaint(wxPaintEvent& event)
|
||||
void wxZRColaComposerPanel::OnSourceHexPaint(wxPaintEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
long from, to;
|
||||
m_decomposedHex->GetSelection(&from, &to);
|
||||
m_sourceHex->GetSelection(&from, &to);
|
||||
|
||||
if (m_selDecomposedHex.first != from || m_selDecomposedHex.second != to) {
|
||||
if (m_selSourceHex.first != from || m_selSourceHex.second != to) {
|
||||
// Save new selection first, to avoid loop.
|
||||
m_selDecomposedHex.first = from;
|
||||
m_selDecomposedHex.second = to;
|
||||
m_selSourceHex.first = from;
|
||||
m_selSourceHex.second = to;
|
||||
|
||||
m_decomposed->SetSelection(
|
||||
m_selDecomposed.first = m_mappingDecomposedHex.to_src(from),
|
||||
m_selDecomposed.second = m_mappingDecomposedHex.to_src(to ));
|
||||
m_source->SetSelection(
|
||||
m_selSource.first = m_mappingSourceHex.to_src(from),
|
||||
m_selSource.second = m_mappingSourceHex.to_src(to ));
|
||||
|
||||
m_composed->SetSelection(
|
||||
m_selComposed.first = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.first )),
|
||||
m_selComposed.second = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.second)));
|
||||
m_destination->SetSelection(
|
||||
m_selDestination.first = MapToDestination(m_selSource.first ),
|
||||
m_selDestination.second = MapToDestination(m_selSource.second));
|
||||
|
||||
m_composedHex->SetSelection(
|
||||
m_selComposedHex.first = m_mappingComposedHex.to_dst(m_selComposed.first ),
|
||||
m_selComposedHex.second = m_mappingComposedHex.to_dst(m_selComposed.second));
|
||||
m_destinationHex->SetSelection(
|
||||
m_selDestinationHex.first = m_mappingDestinationHex.to_dst(m_selDestination.first ),
|
||||
m_selDestinationHex.second = m_mappingDestinationHex.to_dst(m_selDestination.second));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaComposerPanel::OnDecomposedText(wxCommandEvent& event)
|
||||
void wxZRColaComposerPanel::OnSourceText(wxCommandEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
// Set the flag the decomposed text changed to trigger idle-time composition.
|
||||
m_decomposedChanged = true;
|
||||
// Set the flag the source text changed to trigger idle-time transformation.
|
||||
m_sourceChanged = true;
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaComposerPanel::OnComposedPaint(wxPaintEvent& event)
|
||||
void wxZRColaComposerPanel::OnDestinationPaint(wxPaintEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
long from, to;
|
||||
m_composed->GetSelection(&from, &to);
|
||||
m_destination->GetSelection(&from, &to);
|
||||
|
||||
if (m_selComposed.first != from || m_selComposed.second != to) {
|
||||
if (m_selDestination.first != from || m_selDestination.second != to) {
|
||||
// Save new selection first, to avoid loop.
|
||||
m_selComposed.first = from;
|
||||
m_selComposed.second = to;
|
||||
m_selDestination.first = from;
|
||||
m_selDestination.second = to;
|
||||
|
||||
m_composedHex->SetSelection(
|
||||
m_selComposedHex.first = m_mappingComposedHex.to_dst(from),
|
||||
m_selComposedHex.second = m_mappingComposedHex.to_dst(to ));
|
||||
m_destinationHex->SetSelection(
|
||||
m_selDestinationHex.first = m_mappingDestinationHex.to_dst(from),
|
||||
m_selDestinationHex.second = m_mappingDestinationHex.to_dst(to ));
|
||||
|
||||
m_decomposed->SetSelection(
|
||||
m_selDecomposed.first = m_mapping1.to_src(m_mapping2.to_src(from)),
|
||||
m_selDecomposed.second = m_mapping1.to_src(m_mapping2.to_src(to )));
|
||||
m_source->SetSelection(
|
||||
m_selSource.first = MapToSource(from),
|
||||
m_selSource.second = MapToSource(to ));
|
||||
|
||||
m_decomposedHex->SetSelection(
|
||||
m_selDecomposedHex.first = m_mappingDecomposedHex.to_dst(m_selDecomposed.first ),
|
||||
m_selDecomposedHex.second = m_mappingDecomposedHex.to_dst(m_selDecomposed.second));
|
||||
m_sourceHex->SetSelection(
|
||||
m_selSourceHex.first = m_mappingSourceHex.to_dst(m_selSource.first ),
|
||||
m_selSourceHex.second = m_mappingSourceHex.to_dst(m_selSource.second));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaComposerPanel::OnComposedHexPaint(wxPaintEvent& event)
|
||||
void wxZRColaComposerPanel::OnDestinationHexPaint(wxPaintEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
long from, to;
|
||||
m_composedHex->GetSelection(&from, &to);
|
||||
m_destinationHex->GetSelection(&from, &to);
|
||||
|
||||
if (m_selComposedHex.first != from || m_selComposedHex.second != to) {
|
||||
if (m_selDestinationHex.first != from || m_selDestinationHex.second != to) {
|
||||
// Save new selection first, to avoid loop.
|
||||
m_selComposedHex.first = from;
|
||||
m_selComposedHex.second = to;
|
||||
m_selDestinationHex.first = from;
|
||||
m_selDestinationHex.second = to;
|
||||
|
||||
m_composed->SetSelection(
|
||||
m_selComposed.first = m_mappingComposedHex.to_src(from),
|
||||
m_selComposed.second = m_mappingComposedHex.to_src(to ));
|
||||
m_destination->SetSelection(
|
||||
m_selDestination.first = m_mappingDestinationHex.to_src(from),
|
||||
m_selDestination.second = m_mappingDestinationHex.to_src(to ));
|
||||
|
||||
m_decomposed->SetSelection(
|
||||
m_selDecomposed.first = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.first )),
|
||||
m_selDecomposed.second = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.second)));
|
||||
m_source->SetSelection(
|
||||
m_selSource.first = MapToSource(m_selDestination.first ),
|
||||
m_selSource.second = MapToSource(m_selDestination.second));
|
||||
|
||||
m_decomposedHex->SetSelection(
|
||||
m_selDecomposedHex.first = m_mappingDecomposedHex.to_dst(m_selDecomposed.first ),
|
||||
m_selDecomposedHex.second = m_mappingDecomposedHex.to_dst(m_selDecomposed.second));
|
||||
m_sourceHex->SetSelection(
|
||||
m_selSourceHex.first = m_mappingSourceHex.to_dst(m_selSource.first ),
|
||||
m_selSourceHex.second = m_mappingSourceHex.to_dst(m_selSource.second));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaComposerPanel::OnComposedText(wxCommandEvent& event)
|
||||
void wxZRColaComposerPanel::OnDestinationText(wxCommandEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
|
||||
// Set the flag the composed text changed to trigger idle-time decomposition.
|
||||
m_composedChanged = true;
|
||||
// Set the flag the destination text changed to trigger idle-time inverse transformation.
|
||||
m_destinationChanged = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -283,13 +309,13 @@ void wxZRColaComposerPanel::OnSaveTimer(wxTimerEvent& event)
|
||||
wxString text;
|
||||
size_t len;
|
||||
|
||||
// Save decomposed text.
|
||||
len = GetValue(m_decomposed, text);
|
||||
// Save source text.
|
||||
len = GetValue(m_source, text);
|
||||
file.Write(&len, sizeof(len));
|
||||
file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
|
||||
|
||||
// Save composed text.
|
||||
len = GetValue(m_composed, text);
|
||||
// Save destination text.
|
||||
len = GetValue(m_destination, text);
|
||||
file.Write(&len, sizeof(len));
|
||||
file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
|
||||
}
|
||||
@@ -385,8 +411,8 @@ void wxPersistentZRColaComposerPanel::Save() const
|
||||
{
|
||||
auto const wnd = static_cast<const wxZRColaComposerPanel*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
|
||||
|
||||
SaveValue(wxT("splitDecomposed"), wnd->m_splitterDecomposed->GetSashPosition());
|
||||
SaveValue(wxT("splitComposed" ), wnd->m_splitterComposed ->GetSashPosition());
|
||||
SaveValue(wxT("splitDecomposed"), wnd->m_splitterSource->GetSashPosition());
|
||||
SaveValue(wxT("splitComposed" ), wnd->m_splitterDestination ->GetSashPosition());
|
||||
}
|
||||
|
||||
|
||||
@@ -398,14 +424,14 @@ bool wxPersistentZRColaComposerPanel::Restore()
|
||||
|
||||
if (RestoreValue(wxT("splitDecomposed"), &sashVal)) {
|
||||
// wxFormBuilder sets initial splitter stash in idle event handler after GUI settles. Overriding our loaded value. Disconnect it's idle event handler.
|
||||
wnd->m_splitterDecomposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDecomposedOnIdle ), NULL, wnd );
|
||||
wnd->m_splitterDecomposed->SetSashPosition(sashVal);
|
||||
wnd->m_splitterSource->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterSourceOnIdle ), NULL, wnd );
|
||||
wnd->m_splitterSource->SetSashPosition(sashVal);
|
||||
}
|
||||
|
||||
if (RestoreValue(wxT("splitComposed"), &sashVal)) {
|
||||
// wxFormBuilder sets initial splitter stash in idle event handler after GUI settles. Overriding our loaded value. Disconnect it's idle event handler.
|
||||
wnd->m_splitterComposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterComposedOnIdle ), NULL, wnd );
|
||||
wnd->m_splitterComposed->SetSashPosition(sashVal);
|
||||
wnd->m_splitterDestination->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDestinationOnIdle ), NULL, wnd );
|
||||
wnd->m_splitterDestination->SetSashPosition(sashVal);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -30,6 +30,7 @@ class wxZRColaComposerPanel;
|
||||
#include <wx/persist/window.h>
|
||||
#include <wx/timer.h>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
|
||||
///
|
||||
@@ -46,31 +47,32 @@ public:
|
||||
friend class wxPersistentZRColaComposerPanel; // Allow saving/restoring window state.
|
||||
|
||||
protected:
|
||||
virtual void OnDecomposedPaint(wxPaintEvent& event);
|
||||
virtual void OnDecomposedHexPaint(wxPaintEvent& event);
|
||||
virtual void OnDecomposedText(wxCommandEvent& event);
|
||||
virtual void OnComposedPaint(wxPaintEvent& event);
|
||||
virtual void OnComposedHexPaint(wxPaintEvent& event);
|
||||
virtual void OnComposedText(wxCommandEvent& event);
|
||||
virtual void OnSourcePaint(wxPaintEvent& event);
|
||||
virtual void OnSourceHexPaint(wxPaintEvent& event);
|
||||
virtual void OnSourceText(wxCommandEvent& event);
|
||||
virtual void OnDestinationPaint(wxPaintEvent& event);
|
||||
virtual void OnDestinationHexPaint(wxPaintEvent& event);
|
||||
virtual void OnDestinationText(wxCommandEvent& event);
|
||||
virtual void OnSaveTimer(wxTimerEvent& event);
|
||||
inline size_t MapToDestination(_In_ size_t src) const;
|
||||
inline size_t MapToSource(_In_ size_t dst) const;
|
||||
|
||||
static wxString GetStateFileName();
|
||||
static size_t GetValue(wxTextCtrl *wnd, wxString &text);
|
||||
static void SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &range, ZRCola::mapping_vector &mapping, const wchar_t *src, size_t len, long from, long to);
|
||||
|
||||
protected:
|
||||
bool m_decomposedChanged; ///< Boolean flag to mark decomposed text "dirty" to trigger composition
|
||||
bool m_composedChanged; ///< Boolean flag to mark composed text "dirty" to trigger decomposition
|
||||
ZRCola::mapping_vector m_mapping1; ///< Character index mapping vector between decomposed and normalized text
|
||||
ZRCola::mapping_vector m_mapping2; ///< Character index mapping vector between normalized and composed text
|
||||
bool m_sourceChanged; ///< Boolean flag to mark source text "dirty" to trigger transformation
|
||||
bool m_destinationChanged; ///< Boolean flag to mark destination text "dirty" to trigger inverse transformation
|
||||
std::vector<ZRCola::mapping_vector> m_mapping; ///< Character index mapping vector between source and normalized text
|
||||
std::pair<long, long>
|
||||
m_selDecomposed, ///< Character index of selected text in decomposed text control
|
||||
m_selDecomposedHex, ///< Character index of selected text in decomposed HEX dump text control
|
||||
m_selComposed, ///< Character index of selected text in composed text control
|
||||
m_selComposedHex; ///< Character index of selected text in composed HEX dump text control
|
||||
wxZRColaKeyHandler m_keyhandler; ///< Key handler for decomposed window
|
||||
ZRCola::mapping_vector m_mappingDecomposedHex; ///< Character index mapping vector between decomposed text and its HEX dump
|
||||
ZRCola::mapping_vector m_mappingComposedHex; ///< Character index mapping vector between composed text and its HEX dump
|
||||
m_selSource, ///< Character index of selected text in source text control
|
||||
m_selSourceHex, ///< Character index of selected text in source HEX dump text control
|
||||
m_selDestination, ///< Character index of selected text in destination text control
|
||||
m_selDestinationHex; ///< Character index of selected text in destination HEX dump text control
|
||||
wxZRColaKeyHandler m_keyhandler; ///< Key handler for source window
|
||||
ZRCola::mapping_vector m_mappingSourceHex; ///< Character index mapping vector between source text and its HEX dump
|
||||
ZRCola::mapping_vector m_mappingDestinationHex; ///< Character index mapping vector between destination text and its HEX dump
|
||||
};
|
||||
|
||||
|
||||
@@ -88,6 +90,24 @@ public:
|
||||
};
|
||||
|
||||
|
||||
inline size_t wxZRColaComposerPanel::MapToDestination(_In_ size_t src) const
|
||||
{
|
||||
for (auto m = m_mapping.cbegin(), m_end = m_mapping.cend(); m != m_end; ++m)
|
||||
src = m->to_dst(src);
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
|
||||
inline size_t wxZRColaComposerPanel::MapToSource(_In_ size_t dst) const
|
||||
{
|
||||
for (auto m = m_mapping.crbegin(), m_end = m_mapping.crend(); m != m_end; ++m)
|
||||
dst = m->to_src(dst);
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
inline wxPersistentObject *wxCreatePersistentObject(wxZRColaComposerPanel *wnd)
|
||||
{
|
||||
return new wxPersistentZRColaComposerPanel(wnd);
|
||||
|
||||
@@ -34,17 +34,19 @@ wxBEGIN_EVENT_TABLE(wxZRColaFrame, wxZRColaFrameBase)
|
||||
|
||||
EVT_MENU (wxID_CHARACTER_SELECTOR , wxZRColaFrame::OnInsertCharacter )
|
||||
|
||||
EVT_UPDATE_UI_RANGE(wxID_SEND_COMPOSED , wxID_SEND_ABORT, wxZRColaFrame::OnSendUpdate )
|
||||
EVT_MENU (wxID_SEND_COMPOSED , wxZRColaFrame::OnSendComposed )
|
||||
EVT_MENU (wxID_SEND_DECOMPOSED , wxZRColaFrame::OnSendDecomposed )
|
||||
EVT_UPDATE_UI_RANGE(wxID_SEND_DESTINATION , wxID_SEND_ABORT, wxZRColaFrame::OnSendUpdate )
|
||||
EVT_MENU (wxID_COPY_DESTINATION_AND_RETURN , wxZRColaFrame::OnCopyDestinationAndReturn )
|
||||
EVT_MENU (wxID_SEND_DESTINATION , wxZRColaFrame::OnSendDestination )
|
||||
EVT_MENU (wxID_COPY_SOURCE_AND_RETURN , wxZRColaFrame::OnCopySourceAndReturn )
|
||||
EVT_MENU (wxID_SEND_SOURCE , wxZRColaFrame::OnSendSource )
|
||||
EVT_MENU (wxID_SEND_ABORT , wxZRColaFrame::OnSendAbort )
|
||||
|
||||
EVT_MENU (wxID_SETTINGS , wxZRColaFrame::OnSettings )
|
||||
|
||||
EVT_UPDATE_UI (wxID_TOOLBAR_EDIT , wxZRColaFrame::OnToolbarEditUpdate )
|
||||
EVT_MENU (wxID_TOOLBAR_EDIT , wxZRColaFrame::OnToolbarEdit )
|
||||
EVT_UPDATE_UI (wxID_TOOLBAR_COMPOSE , wxZRColaFrame::OnToolbarComposeUpdate )
|
||||
EVT_MENU (wxID_TOOLBAR_COMPOSE , wxZRColaFrame::OnToolbarCompose )
|
||||
EVT_UPDATE_UI (wxID_TOOLBAR_TRANSFORM , wxZRColaFrame::OnToolbarTransformUpdate )
|
||||
EVT_MENU (wxID_TOOLBAR_TRANSFORM , wxZRColaFrame::OnToolbarTransform )
|
||||
EVT_UPDATE_UI (wxID_PANEL_CHRGRPS , wxZRColaFrame::OnPanelCharacterCatalogUpdate)
|
||||
EVT_MENU (wxID_PANEL_CHRGRPS , wxZRColaFrame::OnPanelCharacterCatalog )
|
||||
EVT_MENU (wxID_FOCUS_CHARACTER_CATALOG , wxZRColaFrame::OnPanelCharacterCatalogFocus )
|
||||
@@ -67,10 +69,10 @@ wxZRColaFrame::wxZRColaFrame() :
|
||||
{
|
||||
{
|
||||
// wxFrameBuilder 3.5 does not support wxAUI_TB_HORIZONTAL flag. Add it manually.
|
||||
wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarCompose);
|
||||
wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarTransform);
|
||||
paneInfo.LeftDockable(false);
|
||||
paneInfo.RightDockable(false);
|
||||
m_toolbarCompose->SetWindowStyleFlag(m_toolbarCompose->GetWindowStyleFlag() | wxAUI_TB_HORIZONTAL);
|
||||
m_toolbarTransform->SetWindowStyleFlag(m_toolbarTransform->GetWindowStyleFlag() | wxAUI_TB_HORIZONTAL);
|
||||
}
|
||||
|
||||
// Load main window icons.
|
||||
@@ -104,7 +106,7 @@ wxZRColaFrame::wxZRColaFrame() :
|
||||
wxPersistentRegisterAndRestore<wxZRColaCharRequest>(m_chrReq);
|
||||
|
||||
// Set focus.
|
||||
m_panel->m_decomposed->SetFocus();
|
||||
m_panel->m_source->SetFocus();
|
||||
|
||||
#if defined(__WXMSW__)
|
||||
// Register notification sink for language detection.
|
||||
@@ -137,9 +139,9 @@ wxZRColaFrame::wxZRColaFrame() :
|
||||
wxPersistentAuiManager(&m_mgr).Restore();
|
||||
|
||||
// Register global hotkey(s).
|
||||
if (!RegisterHotKey(wxZRColaHKID_INVOKE_COMPOSE, wxMOD_WIN, VK_F5))
|
||||
if (!RegisterHotKey(wxZRColaHKID_INVOKE_TRANSFORM, wxMOD_WIN, VK_F5))
|
||||
wxMessageBox(_("ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING);
|
||||
if (!RegisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE, wxMOD_WIN, VK_F6))
|
||||
if (!RegisterHotKey(wxZRColaHKID_INVOKE_TRANSFORM_INV, wxMOD_WIN, VK_F6))
|
||||
wxMessageBox(_("ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING);
|
||||
}
|
||||
|
||||
@@ -147,8 +149,8 @@ wxZRColaFrame::wxZRColaFrame() :
|
||||
wxZRColaFrame::~wxZRColaFrame()
|
||||
{
|
||||
// Unregister global hotkey(s).
|
||||
UnregisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE);
|
||||
UnregisterHotKey(wxZRColaHKID_INVOKE_COMPOSE);
|
||||
UnregisterHotKey(wxZRColaHKID_INVOKE_TRANSFORM_INV);
|
||||
UnregisterHotKey(wxZRColaHKID_INVOKE_TRANSFORM );
|
||||
|
||||
#if defined(__WXMSW__)
|
||||
if (m_tfSource) {
|
||||
@@ -157,15 +159,6 @@ wxZRColaFrame::~wxZRColaFrame()
|
||||
}
|
||||
#endif
|
||||
|
||||
if (m_chrReq)
|
||||
delete m_chrReq;
|
||||
|
||||
if (m_chrSelect)
|
||||
delete m_chrSelect;
|
||||
|
||||
if (m_settings)
|
||||
delete m_settings;
|
||||
|
||||
if (m_taskBarIcon) {
|
||||
m_taskBarIcon->Disconnect(wxEVT_TASKBAR_LEFT_DOWN, wxTaskBarIconEventHandler(wxZRColaFrame::OnTaskbarIconClick), NULL, this);
|
||||
delete m_taskBarIcon;
|
||||
@@ -211,9 +204,9 @@ void wxZRColaFrame::OnForwardEvent(wxCommandEvent& event)
|
||||
|
||||
void wxZRColaFrame::OnInsertCharacter(wxCommandEvent& event)
|
||||
{
|
||||
if (m_chrSelect->ShowModal() == wxID_OK && m_chrSelect->m_char) {
|
||||
m_panel->m_decomposed->WriteText(m_chrSelect->m_char);
|
||||
m_panel->m_decomposed->SetFocus();
|
||||
if (m_chrSelect->ShowModal() == wxID_OK && !m_chrSelect->m_char.empty()) {
|
||||
m_panel->m_source->WriteText(m_chrSelect->m_char);
|
||||
m_panel->m_source->SetFocus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,19 +217,37 @@ void wxZRColaFrame::OnSendUpdate(wxUpdateUIEvent& event)
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::OnSendComposed(wxCommandEvent& event)
|
||||
void wxZRColaFrame::OnSendDestination(wxCommandEvent& event)
|
||||
{
|
||||
if (m_hWndSource)
|
||||
DoSend(m_panel->m_composed->GetValue());
|
||||
DoSend(m_panel->m_destination->GetValue());
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::OnSendDecomposed(wxCommandEvent& event)
|
||||
void wxZRColaFrame::OnCopyDestinationAndReturn(wxCommandEvent& event)
|
||||
{
|
||||
if (m_hWndSource)
|
||||
DoSend(m_panel->m_decomposed->GetValue());
|
||||
DoCopyAndReturn(m_panel->m_destination->GetValue());
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::OnSendSource(wxCommandEvent& event)
|
||||
{
|
||||
if (m_hWndSource)
|
||||
DoSend(m_panel->m_source->GetValue());
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::OnCopySourceAndReturn(wxCommandEvent& event)
|
||||
{
|
||||
if (m_hWndSource)
|
||||
DoCopyAndReturn(m_panel->m_source->GetValue());
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
@@ -252,8 +263,8 @@ void wxZRColaFrame::OnSendAbort(wxCommandEvent& event)
|
||||
}
|
||||
|
||||
// Select all input in composer to prepare for the overwrite next time.
|
||||
m_panel->m_decomposed->SelectAll();
|
||||
m_panel->m_composed->SelectAll();
|
||||
m_panel->m_source ->SelectAll();
|
||||
m_panel->m_destination->SelectAll();
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
@@ -306,15 +317,15 @@ void wxZRColaFrame::OnToolbarEdit(wxCommandEvent& event)
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::OnToolbarComposeUpdate(wxUpdateUIEvent& event)
|
||||
void wxZRColaFrame::OnToolbarTransformUpdate(wxUpdateUIEvent& event)
|
||||
{
|
||||
event.Check(m_mgr.GetPane(m_toolbarCompose).IsShown());
|
||||
event.Check(m_mgr.GetPane(m_toolbarTransform).IsShown());
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::OnToolbarCompose(wxCommandEvent& event)
|
||||
void wxZRColaFrame::OnToolbarTransform(wxCommandEvent& event)
|
||||
{
|
||||
wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarCompose);
|
||||
wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarTransform);
|
||||
paneInfo.Show(!paneInfo.IsShown());
|
||||
m_mgr.Update();
|
||||
}
|
||||
@@ -483,9 +494,27 @@ void wxZRColaFrame::DoSend(const wxString& str)
|
||||
::SendInput(input.size(), input.data(), sizeof(INPUT));
|
||||
m_hWndSource = NULL;
|
||||
|
||||
// Select all input in composer and decomposed to prepare for the overwrite next time.
|
||||
m_panel->m_decomposed->SelectAll();
|
||||
m_panel->m_composed->SelectAll();
|
||||
// Select all input in source and destination to prepare for the overwrite next time.
|
||||
m_panel->m_source ->SelectAll();
|
||||
m_panel->m_destination->SelectAll();
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaFrame::DoCopyAndReturn(const wxString& str)
|
||||
{
|
||||
if (wxTheClipboard->Open()) {
|
||||
wxTheClipboard->SetData(new wxTextDataObject(str));
|
||||
wxTheClipboard->Close();
|
||||
}
|
||||
|
||||
// Return focus to the source window.
|
||||
::SetActiveWindow(m_hWndSource);
|
||||
::SetForegroundWindow(m_hWndSource);
|
||||
m_hWndSource = NULL;
|
||||
|
||||
// Select all input in composer and source to prepare for the overwrite next time.
|
||||
m_panel->m_source ->SelectAll();
|
||||
m_panel->m_destination->SelectAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -498,8 +527,8 @@ WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM
|
||||
WXHWND hWndSource = ::GetForegroundWindow();
|
||||
|
||||
switch (wParam) {
|
||||
case wxZRColaHKID_INVOKE_COMPOSE : m_panel->m_decomposed->SetFocus(); break;
|
||||
case wxZRColaHKID_INVOKE_DECOMPOSE: m_panel->m_composed ->SetFocus(); break;
|
||||
case wxZRColaHKID_INVOKE_TRANSFORM : m_panel->m_source ->SetFocus(); break;
|
||||
case wxZRColaHKID_INVOKE_TRANSFORM_INV: m_panel->m_destination->SetFocus(); break;
|
||||
default:
|
||||
wxFAIL_MSG(wxT("not our registered shortcut"));
|
||||
return wxZRColaFrameBase::MSWWindowProc(message, wParam, lParam);
|
||||
|
||||
@@ -40,8 +40,8 @@ class wxZRColaFrame;
|
||||
///
|
||||
/// Global hotkey message identifiers
|
||||
///
|
||||
#define wxZRColaHKID_INVOKE_COMPOSE 0
|
||||
#define wxZRColaHKID_INVOKE_DECOMPOSE 1
|
||||
#define wxZRColaHKID_INVOKE_TRANSFORM 0
|
||||
#define wxZRColaHKID_INVOKE_TRANSFORM_INV 1
|
||||
|
||||
|
||||
///
|
||||
@@ -72,8 +72,10 @@ protected:
|
||||
void OnForwardEvent(wxCommandEvent& event);
|
||||
void OnInsertCharacter(wxCommandEvent& event);
|
||||
void OnSendUpdate(wxUpdateUIEvent& event);
|
||||
void OnSendComposed(wxCommandEvent& event);
|
||||
void OnSendDecomposed(wxCommandEvent& event);
|
||||
void OnSendDestination(wxCommandEvent& event);
|
||||
void OnCopyDestinationAndReturn(wxCommandEvent& event);
|
||||
void OnSendSource(wxCommandEvent& event);
|
||||
void OnCopySourceAndReturn(wxCommandEvent& event);
|
||||
void OnSendAbort(wxCommandEvent& event);
|
||||
void OnSettings(wxCommandEvent& event);
|
||||
virtual void OnIdle(wxIdleEvent& event);
|
||||
@@ -81,8 +83,8 @@ protected:
|
||||
virtual void OnIconize(wxIconizeEvent& event);
|
||||
void OnToolbarEditUpdate(wxUpdateUIEvent& event);
|
||||
void OnToolbarEdit(wxCommandEvent& event);
|
||||
void OnToolbarComposeUpdate(wxUpdateUIEvent& event);
|
||||
void OnToolbarCompose(wxCommandEvent& event);
|
||||
void OnToolbarTransformUpdate(wxUpdateUIEvent& event);
|
||||
void OnToolbarTransform(wxCommandEvent& event);
|
||||
void OnPanelCharacterCatalogUpdate(wxUpdateUIEvent& event);
|
||||
void OnPanelCharacterCatalog(wxCommandEvent& event);
|
||||
void OnPanelCharacterCatalogFocus(wxCommandEvent& event);
|
||||
@@ -111,6 +113,7 @@ protected:
|
||||
|
||||
private:
|
||||
void DoSend(const wxString& str);
|
||||
void DoCopyAndReturn(const wxString& str);
|
||||
|
||||
protected:
|
||||
#ifdef __WXMSW__
|
||||
|
||||
@@ -85,23 +85,41 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
|
||||
|
||||
m_menuEdit->AppendSeparator();
|
||||
|
||||
wxMenuItem* m_menuItemSendComposed;
|
||||
m_menuItemSendComposed = new wxMenuItem( m_menuEdit, wxID_SEND_COMPOSED, wxString( _("&Send Composed") ) + wxT('\t') + wxT("F5"), _("Send composed text to source window"), wxITEM_NORMAL );
|
||||
wxMenuItem* m_menuItemSendDestination;
|
||||
m_menuItemSendDestination = new wxMenuItem( m_menuEdit, wxID_SEND_DESTINATION, wxString( _("&Send Composed") ) + wxT('\t') + wxT("F5"), _("Send composed text to source window"), wxITEM_NORMAL );
|
||||
#ifdef __WXMSW__
|
||||
m_menuItemSendComposed->SetBitmaps( wxIcon( wxT("send_composed.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
m_menuItemSendDestination->SetBitmaps( wxIcon( wxT("send_destination.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#elif (defined( __WXGTK__ ) || defined( __WXOSX__ ))
|
||||
m_menuItemSendComposed->SetBitmap( wxIcon( wxT("send_composed.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
m_menuItemSendDestination->SetBitmap( wxIcon( wxT("send_destination.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#endif
|
||||
m_menuEdit->Append( m_menuItemSendComposed );
|
||||
m_menuEdit->Append( m_menuItemSendDestination );
|
||||
|
||||
wxMenuItem* m_menuItemSendDecomposed;
|
||||
m_menuItemSendDecomposed = new wxMenuItem( m_menuEdit, wxID_SEND_DECOMPOSED, wxString( _("Send &Decomposed") ) + wxT('\t') + wxT("F6"), _("Send decomposed text to source window"), wxITEM_NORMAL );
|
||||
wxMenuItem* m_menuItemCopyDestinationAndReturn;
|
||||
m_menuItemCopyDestinationAndReturn = new wxMenuItem( m_menuEdit, wxID_COPY_DESTINATION_AND_RETURN, wxString( _("Copy Composed and &Return") ) + wxT('\t') + wxT("Ctrl+F5"), _("Copy composed text to clipboard and return focus to source window"), wxITEM_NORMAL );
|
||||
#ifdef __WXMSW__
|
||||
m_menuItemSendDecomposed->SetBitmaps( wxIcon( wxT("send_decomposed.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
m_menuItemCopyDestinationAndReturn->SetBitmaps( wxIcon( wxT("copy_destination_and_return.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#elif (defined( __WXGTK__ ) || defined( __WXOSX__ ))
|
||||
m_menuItemSendDecomposed->SetBitmap( wxIcon( wxT("send_decomposed.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
m_menuItemCopyDestinationAndReturn->SetBitmap( wxIcon( wxT("copy_destination_and_return.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#endif
|
||||
m_menuEdit->Append( m_menuItemSendDecomposed );
|
||||
m_menuEdit->Append( m_menuItemCopyDestinationAndReturn );
|
||||
|
||||
wxMenuItem* m_menuItemSendSource;
|
||||
m_menuItemSendSource = new wxMenuItem( m_menuEdit, wxID_SEND_SOURCE, wxString( _("Send &Decomposed") ) + wxT('\t') + wxT("F6"), _("Send decomposed text to source window"), wxITEM_NORMAL );
|
||||
#ifdef __WXMSW__
|
||||
m_menuItemSendSource->SetBitmaps( wxIcon( wxT("send_source.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#elif (defined( __WXGTK__ ) || defined( __WXOSX__ ))
|
||||
m_menuItemSendSource->SetBitmap( wxIcon( wxT("send_source.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#endif
|
||||
m_menuEdit->Append( m_menuItemSendSource );
|
||||
|
||||
wxMenuItem* m_menuItemCopySourceAndReturn;
|
||||
m_menuItemCopySourceAndReturn = new wxMenuItem( m_menuEdit, wxID_COPY_SOURCE_AND_RETURN, wxString( _("Copy Decomposed and Re&turn") ) + wxT('\t') + wxT("Ctrl+F6"), _("Copy decomposed text to clipboard and return focus to source window"), wxITEM_NORMAL );
|
||||
#ifdef __WXMSW__
|
||||
m_menuItemCopySourceAndReturn->SetBitmaps( wxIcon( wxT("copy_source_and_return.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#elif (defined( __WXGTK__ ) || defined( __WXOSX__ ))
|
||||
m_menuItemCopySourceAndReturn->SetBitmap( wxIcon( wxT("copy_source_and_return.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16 ) );
|
||||
#endif
|
||||
m_menuEdit->Append( m_menuItemCopySourceAndReturn );
|
||||
|
||||
wxMenuItem* m_menuItemSendAbort;
|
||||
m_menuItemSendAbort = new wxMenuItem( m_menuEdit, wxID_SEND_ABORT, wxString( _("Abort (De)composition") ) + wxT('\t') + wxT("Esc"), _("Abort composition and return focus to source window"), wxITEM_NORMAL );
|
||||
@@ -126,7 +144,7 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
|
||||
m_menuView->Append( m_menuItemToolbarEdit );
|
||||
|
||||
wxMenuItem* m_menuItemToolbarCompose;
|
||||
m_menuItemToolbarCompose = new wxMenuItem( m_menuView, wxID_TOOLBAR_COMPOSE, wxString( _("&Compose Toolbar") ) , _("Toggle compose toolbar"), wxITEM_CHECK );
|
||||
m_menuItemToolbarCompose = new wxMenuItem( m_menuView, wxID_TOOLBAR_TRANSFORM, wxString( _("&Compose Toolbar") ) , _("Toggle compose toolbar"), wxITEM_CHECK );
|
||||
m_menuView->Append( m_menuItemToolbarCompose );
|
||||
|
||||
m_menuView->AppendSeparator();
|
||||
@@ -176,15 +194,15 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
|
||||
m_toolbarEdit->Realize();
|
||||
m_mgr.AddPane( m_toolbarEdit, wxAuiPaneInfo().Name( wxT("toolbarEdit") ).Top().Caption( _("Edit") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() );
|
||||
|
||||
m_toolbarCompose = new wxAuiToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_HORZ_LAYOUT );
|
||||
m_toolCharSelect = m_toolbarCompose->AddTool( wxID_CHARACTER_SELECTOR, _("Find Character"), wxIcon( wxT("char_select.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_NORMAL, _("Find Character"), _("Display character search to select character to insert into text"), NULL );
|
||||
m_toolbarTransform = new wxAuiToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_HORZ_LAYOUT );
|
||||
m_toolCharSelect = m_toolbarTransform->AddTool( wxID_CHARACTER_SELECTOR, _("Find Character"), wxIcon( wxT("char_select.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_NORMAL, _("Find Character"), _("Display character search to select character to insert into text"), NULL );
|
||||
|
||||
m_toolSendComposed = m_toolbarCompose->AddTool( wxID_SEND_COMPOSED, _("Send Composed"), wxIcon( wxT("send_composed.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_NORMAL, _("Send Composed"), _("Send composed text to source window"), NULL );
|
||||
m_toolSendDestination = m_toolbarTransform->AddTool( wxID_SEND_DESTINATION, _("Send Composed"), wxIcon( wxT("send_destination.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_NORMAL, _("Send Composed"), _("Send composed text to source window"), NULL );
|
||||
|
||||
m_toolSendDecomposed = m_toolbarCompose->AddTool( wxID_SEND_DECOMPOSED, _("Send Decomposed"), wxIcon( wxT("send_decomposed.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_NORMAL, _("Send Decomposed"), _("Send decomposed text to source window"), NULL );
|
||||
m_toolSendSource = m_toolbarTransform->AddTool( wxID_SEND_SOURCE, _("Send Decomposed"), wxIcon( wxT("send_source.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_NORMAL, _("Send Decomposed"), _("Send decomposed text to source window"), NULL );
|
||||
|
||||
m_toolbarCompose->Realize();
|
||||
m_mgr.AddPane( m_toolbarCompose, wxAuiPaneInfo().Name( wxT("toolbarCompose") ).Top().Caption( _("Compose") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() );
|
||||
m_toolbarTransform->Realize();
|
||||
m_mgr.AddPane( m_toolbarTransform, wxAuiPaneInfo().Name( wxT("toolbarCompose") ).Top().Caption( _("Compose") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() );
|
||||
|
||||
m_panelChrCat = new wxZRColaCharacterCatalogPanel( this );
|
||||
|
||||
@@ -221,99 +239,99 @@ wxZRColaComposerPanelBase::wxZRColaComposerPanelBase( wxWindow* parent, wxWindow
|
||||
wxBoxSizer* bSizerMain;
|
||||
bSizerMain = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_splitterDecomposed = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_LIVE_UPDATE );
|
||||
m_splitterDecomposed->SetSashGravity( 1 );
|
||||
m_splitterDecomposed->Connect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDecomposedOnIdle ), NULL, this );
|
||||
m_splitterDecomposed->SetMinimumPaneSize( 5 );
|
||||
m_splitterSource = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_LIVE_UPDATE );
|
||||
m_splitterSource->SetSashGravity( 1 );
|
||||
m_splitterSource->Connect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterSourceOnIdle ), NULL, this );
|
||||
m_splitterSource->SetMinimumPaneSize( 5 );
|
||||
|
||||
m_panelDecomposedEdit = new wxPanel( m_splitterDecomposed, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerDecomposedEdit;
|
||||
bSizerDecomposedEdit = new wxBoxSizer( wxVERTICAL );
|
||||
m_panelSourceEdit = new wxPanel( m_splitterSource, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerSourceEdit;
|
||||
bSizerSourceEdit = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* bSizerDecomposedEdit2;
|
||||
bSizerDecomposedEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDecomposedEdit, wxID_ANY, _("Decomposed Text") ), wxVERTICAL );
|
||||
wxStaticBoxSizer* bSizerSourceEdit2;
|
||||
bSizerSourceEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelSourceEdit, wxID_ANY, _("Decomposed Text") ), wxVERTICAL );
|
||||
|
||||
m_decomposed = new wxTextCtrl( bSizerDecomposedEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
|
||||
m_decomposed->SetFont( wxFont( 20, 70, 90, 90, false, wxT("ZRCola") ) );
|
||||
m_decomposed->SetMinSize( wxSize( 100,25 ) );
|
||||
m_source = new wxTextCtrl( bSizerSourceEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
|
||||
m_source->SetFont( wxFont( 20, 70, 90, 90, false, wxT("ZRCola") ) );
|
||||
m_source->SetMinSize( wxSize( 100,25 ) );
|
||||
|
||||
bSizerDecomposedEdit2->Add( m_decomposed, 1, wxEXPAND, 5 );
|
||||
bSizerSourceEdit2->Add( m_source, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerDecomposedEdit->Add( bSizerDecomposedEdit2, 1, wxEXPAND, 5 );
|
||||
bSizerSourceEdit->Add( bSizerSourceEdit2, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panelDecomposedEdit->SetSizer( bSizerDecomposedEdit );
|
||||
m_panelDecomposedEdit->Layout();
|
||||
bSizerDecomposedEdit->Fit( m_panelDecomposedEdit );
|
||||
m_panelDecomposedHex = new wxPanel( m_splitterDecomposed, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerDecomposedHex;
|
||||
bSizerDecomposedHex = new wxBoxSizer( wxVERTICAL );
|
||||
m_panelSourceEdit->SetSizer( bSizerSourceEdit );
|
||||
m_panelSourceEdit->Layout();
|
||||
bSizerSourceEdit->Fit( m_panelSourceEdit );
|
||||
m_panelSourceHex = new wxPanel( m_splitterSource, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerSourceHex;
|
||||
bSizerSourceHex = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* bSizerDecomposedHex2;
|
||||
bSizerDecomposedHex2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDecomposedHex, wxID_ANY, _("Decomposed Unicode Dump") ), wxVERTICAL );
|
||||
wxStaticBoxSizer* bSizerSourceHex2;
|
||||
bSizerSourceHex2 = new wxStaticBoxSizer( new wxStaticBox( m_panelSourceHex, wxID_ANY, _("Decomposed Unicode Dump") ), wxVERTICAL );
|
||||
|
||||
m_decomposedHex = new wxTextCtrl( bSizerDecomposedHex2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
|
||||
m_decomposedHex->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 76, 90, 90, false, wxEmptyString ) );
|
||||
m_sourceHex = new wxTextCtrl( bSizerSourceHex2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
|
||||
m_sourceHex->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 76, 90, 90, false, wxEmptyString ) );
|
||||
|
||||
bSizerDecomposedHex2->Add( m_decomposedHex, 1, wxEXPAND, 5 );
|
||||
bSizerSourceHex2->Add( m_sourceHex, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerDecomposedHex->Add( bSizerDecomposedHex2, 1, wxEXPAND, 5 );
|
||||
bSizerSourceHex->Add( bSizerSourceHex2, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panelDecomposedHex->SetSizer( bSizerDecomposedHex );
|
||||
m_panelDecomposedHex->Layout();
|
||||
bSizerDecomposedHex->Fit( m_panelDecomposedHex );
|
||||
m_splitterDecomposed->SplitVertically( m_panelDecomposedEdit, m_panelDecomposedHex, -5 );
|
||||
bSizerMain->Add( m_splitterDecomposed, 50, wxALL|wxEXPAND, 5 );
|
||||
m_panelSourceHex->SetSizer( bSizerSourceHex );
|
||||
m_panelSourceHex->Layout();
|
||||
bSizerSourceHex->Fit( m_panelSourceHex );
|
||||
m_splitterSource->SplitVertically( m_panelSourceEdit, m_panelSourceHex, -5 );
|
||||
bSizerMain->Add( m_splitterSource, 50, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_splitterComposed = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_LIVE_UPDATE );
|
||||
m_splitterComposed->SetSashGravity( 1 );
|
||||
m_splitterComposed->Connect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterComposedOnIdle ), NULL, this );
|
||||
m_splitterComposed->SetMinimumPaneSize( 5 );
|
||||
m_splitterDestination = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_LIVE_UPDATE );
|
||||
m_splitterDestination->SetSashGravity( 1 );
|
||||
m_splitterDestination->Connect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDestinationOnIdle ), NULL, this );
|
||||
m_splitterDestination->SetMinimumPaneSize( 5 );
|
||||
|
||||
m_panelComposedEdit = new wxPanel( m_splitterComposed, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerComposedEdit;
|
||||
bSizerComposedEdit = new wxBoxSizer( wxVERTICAL );
|
||||
m_panelDestinationEdit = new wxPanel( m_splitterDestination, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerDestinationEdit;
|
||||
bSizerDestinationEdit = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* bSizerComposedEdit2;
|
||||
bSizerComposedEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelComposedEdit, wxID_ANY, _("Composed Text") ), wxVERTICAL );
|
||||
wxStaticBoxSizer* bSizerDestinationEdit2;
|
||||
bSizerDestinationEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDestinationEdit, wxID_ANY, _("Composed Text") ), wxVERTICAL );
|
||||
|
||||
m_composed = new wxTextCtrl( bSizerComposedEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
|
||||
m_composed->SetFont( wxFont( 20, 70, 90, 90, false, wxT("ZRCola") ) );
|
||||
m_composed->SetMinSize( wxSize( 100,25 ) );
|
||||
m_destination = new wxTextCtrl( bSizerDestinationEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
|
||||
m_destination->SetFont( wxFont( 20, 70, 90, 90, false, wxT("ZRCola") ) );
|
||||
m_destination->SetMinSize( wxSize( 100,25 ) );
|
||||
|
||||
bSizerComposedEdit2->Add( m_composed, 1, wxEXPAND, 5 );
|
||||
bSizerDestinationEdit2->Add( m_destination, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerComposedEdit->Add( bSizerComposedEdit2, 1, wxEXPAND, 5 );
|
||||
bSizerDestinationEdit->Add( bSizerDestinationEdit2, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panelComposedEdit->SetSizer( bSizerComposedEdit );
|
||||
m_panelComposedEdit->Layout();
|
||||
bSizerComposedEdit->Fit( m_panelComposedEdit );
|
||||
m_panelComposedHex = new wxPanel( m_splitterComposed, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerComposedHex;
|
||||
bSizerComposedHex = new wxBoxSizer( wxVERTICAL );
|
||||
m_panelDestinationEdit->SetSizer( bSizerDestinationEdit );
|
||||
m_panelDestinationEdit->Layout();
|
||||
bSizerDestinationEdit->Fit( m_panelDestinationEdit );
|
||||
m_panelDestinationHex = new wxPanel( m_splitterDestination, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerDestinationHex;
|
||||
bSizerDestinationHex = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* bSizerComposedHex2;
|
||||
bSizerComposedHex2 = new wxStaticBoxSizer( new wxStaticBox( m_panelComposedHex, wxID_ANY, _("Composed Unicode Dump") ), wxVERTICAL );
|
||||
wxStaticBoxSizer* bSizerDestinationHex2;
|
||||
bSizerDestinationHex2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDestinationHex, wxID_ANY, _("Composed Unicode Dump") ), wxVERTICAL );
|
||||
|
||||
m_composedHex = new wxTextCtrl( bSizerComposedHex2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
|
||||
m_composedHex->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 76, 90, 90, false, wxEmptyString ) );
|
||||
m_destinationHex = new wxTextCtrl( bSizerDestinationHex2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
|
||||
m_destinationHex->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 76, 90, 90, false, wxEmptyString ) );
|
||||
|
||||
bSizerComposedHex2->Add( m_composedHex, 1, wxEXPAND, 5 );
|
||||
bSizerDestinationHex2->Add( m_destinationHex, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerComposedHex->Add( bSizerComposedHex2, 1, wxEXPAND, 5 );
|
||||
bSizerDestinationHex->Add( bSizerDestinationHex2, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panelComposedHex->SetSizer( bSizerComposedHex );
|
||||
m_panelComposedHex->Layout();
|
||||
bSizerComposedHex->Fit( m_panelComposedHex );
|
||||
m_splitterComposed->SplitVertically( m_panelComposedEdit, m_panelComposedHex, -5 );
|
||||
bSizerMain->Add( m_splitterComposed, 50, wxALL|wxEXPAND, 5 );
|
||||
m_panelDestinationHex->SetSizer( bSizerDestinationHex );
|
||||
m_panelDestinationHex->Layout();
|
||||
bSizerDestinationHex->Fit( m_panelDestinationHex );
|
||||
m_splitterDestination->SplitVertically( m_panelDestinationEdit, m_panelDestinationHex, -5 );
|
||||
bSizerMain->Add( m_splitterDestination, 50, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizerMain );
|
||||
@@ -322,24 +340,24 @@ wxZRColaComposerPanelBase::wxZRColaComposerPanelBase( wxWindow* parent, wxWindow
|
||||
m_timerSave.SetOwner( this, wxID_TIMER_SAVE );
|
||||
|
||||
// Connect Events
|
||||
m_decomposed->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDecomposedPaint ), NULL, this );
|
||||
m_decomposed->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnDecomposedText ), NULL, this );
|
||||
m_decomposedHex->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDecomposedHexPaint ), NULL, this );
|
||||
m_composed->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnComposedPaint ), NULL, this );
|
||||
m_composed->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnComposedText ), NULL, this );
|
||||
m_composedHex->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnComposedHexPaint ), NULL, this );
|
||||
m_source->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnSourcePaint ), NULL, this );
|
||||
m_source->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnSourceText ), NULL, this );
|
||||
m_sourceHex->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnSourceHexPaint ), NULL, this );
|
||||
m_destination->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDestinationPaint ), NULL, this );
|
||||
m_destination->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnDestinationText ), NULL, this );
|
||||
m_destinationHex->Connect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDestinationHexPaint ), NULL, this );
|
||||
this->Connect( wxID_TIMER_SAVE, wxEVT_TIMER, wxTimerEventHandler( wxZRColaComposerPanelBase::OnSaveTimer ) );
|
||||
}
|
||||
|
||||
wxZRColaComposerPanelBase::~wxZRColaComposerPanelBase()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_decomposed->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDecomposedPaint ), NULL, this );
|
||||
m_decomposed->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnDecomposedText ), NULL, this );
|
||||
m_decomposedHex->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDecomposedHexPaint ), NULL, this );
|
||||
m_composed->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnComposedPaint ), NULL, this );
|
||||
m_composed->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnComposedText ), NULL, this );
|
||||
m_composedHex->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnComposedHexPaint ), NULL, this );
|
||||
m_source->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnSourcePaint ), NULL, this );
|
||||
m_source->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnSourceText ), NULL, this );
|
||||
m_sourceHex->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnSourceHexPaint ), NULL, this );
|
||||
m_destination->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDestinationPaint ), NULL, this );
|
||||
m_destination->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( wxZRColaComposerPanelBase::OnDestinationText ), NULL, this );
|
||||
m_destinationHex->Disconnect( wxEVT_PAINT, wxPaintEventHandler( wxZRColaComposerPanelBase::OnDestinationHexPaint ), NULL, this );
|
||||
this->Disconnect( wxID_TIMER_SAVE, wxEVT_TIMER, wxTimerEventHandler( wxZRColaComposerPanelBase::OnSaveTimer ) );
|
||||
|
||||
}
|
||||
@@ -763,12 +781,12 @@ wxZRColaSettingsBase::wxZRColaSettingsBase( wxWindow* parent, wxWindowID id, con
|
||||
bSizerContent = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_listbook = new wxListbook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_DEFAULT );
|
||||
m_panelLanguage = new wxPanel( m_listbook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_panelLanguage = new wxPanel( m_listbook, wxID_ANY, wxDefaultPosition, wxSize( 500,-1 ), wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerLanguage;
|
||||
bSizerLanguage = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_langLabel = new wxStaticText( m_panelLanguage, wxID_ANY, _("Some character native to specific language you are working with should not decompose to primitives.\nFor optimal decomposition you should set the language correctly."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_langLabel->Wrap( -1 );
|
||||
m_langLabel->Wrap( 490 );
|
||||
bSizerLanguage->Add( m_langLabel, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_langAuto = new wxRadioButton( m_panelLanguage, wxID_ANY, _("Select language &automatically according to selected keyboard"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
|
||||
@@ -785,14 +803,86 @@ wxZRColaSettingsBase::wxZRColaSettingsBase( wxWindow* parent, wxWindowID id, con
|
||||
|
||||
m_panelLanguage->SetSizer( bSizerLanguage );
|
||||
m_panelLanguage->Layout();
|
||||
bSizerLanguage->Fit( m_panelLanguage );
|
||||
m_listbook->AddPage( m_panelLanguage, _("Text Language"), true );
|
||||
m_panelAutoStart = new wxPanel( m_listbook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_panelTransformation = new wxPanel( m_listbook, wxID_ANY, wxDefaultPosition, wxSize( 500,-1 ), wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerTransformation;
|
||||
bSizerTransformation = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_transLabel = new wxStaticText( m_panelTransformation, wxID_ANY, _("ZRCola offers multiple text transformations that can be arranged in a sequence.\nPlease select desired transformations and the order they are applied."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_transLabel->Wrap( 490 );
|
||||
bSizerTransformation->Add( m_transLabel, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizerTransformation;
|
||||
fgSizerTransformation = new wxFlexGridSizer( 2, 3, 0, 0 );
|
||||
fgSizerTransformation->AddGrowableCol( 0 );
|
||||
fgSizerTransformation->AddGrowableCol( 2 );
|
||||
fgSizerTransformation->AddGrowableRow( 0 );
|
||||
fgSizerTransformation->SetFlexibleDirection( wxBOTH );
|
||||
fgSizerTransformation->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
wxBoxSizer* bSizerTransAvailable;
|
||||
bSizerTransAvailable = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_transAvailableLabel = new wxStaticText( m_panelTransformation, wxID_ANY, _("A&vailable:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_transAvailableLabel->Wrap( -1 );
|
||||
bSizerTransAvailable->Add( m_transAvailableLabel, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_transAvailable = new wxListBox( m_panelTransformation, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE|wxLB_SORT );
|
||||
bSizerTransAvailable->Add( m_transAvailable, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizerTransformation->Add( bSizerTransAvailable, 1, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizerTransActivate;
|
||||
bSizerTransActivate = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_transActivate = new wxButton( m_panelTransformation, wxID_ANY, _(">"), wxDefaultPosition, wxSize( 32,32 ), 0 );
|
||||
bSizerTransActivate->Add( m_transActivate, 0, wxALL, 5 );
|
||||
|
||||
m_transDeactivate = new wxButton( m_panelTransformation, wxID_ANY, _("<"), wxDefaultPosition, wxSize( 32,32 ), 0 );
|
||||
bSizerTransActivate->Add( m_transDeactivate, 0, wxALL, 5 );
|
||||
|
||||
|
||||
fgSizerTransformation->Add( bSizerTransActivate, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
wxBoxSizer* bSizerTransActive;
|
||||
bSizerTransActive = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_transActiveLabel = new wxStaticText( m_panelTransformation, wxID_ANY, _("&Active:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_transActiveLabel->Wrap( -1 );
|
||||
bSizerTransActive->Add( m_transActiveLabel, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_transActive = new wxListBox( m_panelTransformation, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE );
|
||||
bSizerTransActive->Add( m_transActive, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizerTransformation->Add( bSizerTransActive, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerTransformation->Add( fgSizerTransformation, 1, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizerTransActiveReorder;
|
||||
bSizerTransActiveReorder = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
m_transActiveUp = new wxButton( m_panelTransformation, wxID_ANY, _("Up"), wxDefaultPosition, wxSize( 70,-1 ), 0 );
|
||||
bSizerTransActiveReorder->Add( m_transActiveUp, 0, wxALL, 5 );
|
||||
|
||||
m_transActiveDown = new wxButton( m_panelTransformation, wxID_ANY, _("Down"), wxDefaultPosition, wxSize( 70,-1 ), 0 );
|
||||
bSizerTransActiveReorder->Add( m_transActiveDown, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizerTransformation->Add( bSizerTransActiveReorder, 0, wxALIGN_RIGHT, 5 );
|
||||
|
||||
|
||||
m_panelTransformation->SetSizer( bSizerTransformation );
|
||||
m_panelTransformation->Layout();
|
||||
m_listbook->AddPage( m_panelTransformation, _("Transformation"), false );
|
||||
m_panelAutoStart = new wxPanel( m_listbook, wxID_ANY, wxDefaultPosition, wxSize( 500,-1 ), wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerAutoStart;
|
||||
bSizerAutoStart = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_autoStartLabel = new wxStaticText( m_panelAutoStart, wxID_ANY, _("ZRCola can be launched every time you log in to your computer.\nIt will be available on the system tray and via registered shortcuts Win+F5 and Win+F6."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_autoStartLabel->Wrap( -1 );
|
||||
m_autoStartLabel->Wrap( 490 );
|
||||
bSizerAutoStart->Add( m_autoStartLabel, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_autoStart = new wxCheckBox( m_panelAutoStart, wxID_ANY, _("Start ZRCola &automatically on logon"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
@@ -801,7 +891,6 @@ wxZRColaSettingsBase::wxZRColaSettingsBase( wxWindow* parent, wxWindowID id, con
|
||||
|
||||
m_panelAutoStart->SetSizer( bSizerAutoStart );
|
||||
m_panelAutoStart->Layout();
|
||||
bSizerAutoStart->Fit( m_panelAutoStart );
|
||||
m_listbook->AddPage( m_panelAutoStart, _("Startup"), false );
|
||||
#ifdef __WXGTK__ // Small icon style not supported in GTK
|
||||
wxListView* m_listbookListView = m_listbook->GetListView();
|
||||
@@ -813,7 +902,7 @@ wxZRColaSettingsBase::wxZRColaSettingsBase( wxWindow* parent, wxWindowID id, con
|
||||
m_listbookListView->SetWindowStyleFlag( m_listbookFlags );
|
||||
#endif
|
||||
|
||||
bSizerContent->Add( m_listbook, 1, wxEXPAND | wxALL, 5 );
|
||||
bSizerContent->Add( m_listbook, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerContent->Add( 0, 0, 0, wxALL|wxEXPAND, 5 );
|
||||
@@ -838,8 +927,12 @@ wxZRColaSettingsBase::wxZRColaSettingsBase( wxWindow* parent, wxWindowID id, con
|
||||
|
||||
// Connect Events
|
||||
this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( wxZRColaSettingsBase::OnInitDialog ) );
|
||||
m_langAuto->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( wxZRColaSettingsBase::OnLangAuto ), NULL, this );
|
||||
m_langManual->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( wxZRColaSettingsBase::OnLangManual ), NULL, this );
|
||||
m_panelLanguage->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( wxZRColaSettingsBase::OnLanguageUpdate ), NULL, this );
|
||||
m_panelTransformation->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( wxZRColaSettingsBase::OnTransformationUpdate ), NULL, this );
|
||||
m_transActivate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransActivate ), NULL, this );
|
||||
m_transDeactivate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransDeactivate ), NULL, this );
|
||||
m_transActiveUp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransActiveUp ), NULL, this );
|
||||
m_transActiveDown->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransActiveDown ), NULL, this );
|
||||
m_sdbSizerButtonsApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnApplyButtonClick ), NULL, this );
|
||||
m_sdbSizerButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnOKButtonClick ), NULL, this );
|
||||
}
|
||||
@@ -848,8 +941,12 @@ wxZRColaSettingsBase::~wxZRColaSettingsBase()
|
||||
{
|
||||
// Disconnect Events
|
||||
this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( wxZRColaSettingsBase::OnInitDialog ) );
|
||||
m_langAuto->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( wxZRColaSettingsBase::OnLangAuto ), NULL, this );
|
||||
m_langManual->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( wxZRColaSettingsBase::OnLangManual ), NULL, this );
|
||||
m_panelLanguage->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( wxZRColaSettingsBase::OnLanguageUpdate ), NULL, this );
|
||||
m_panelTransformation->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( wxZRColaSettingsBase::OnTransformationUpdate ), NULL, this );
|
||||
m_transActivate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransActivate ), NULL, this );
|
||||
m_transDeactivate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransDeactivate ), NULL, this );
|
||||
m_transActiveUp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransActiveUp ), NULL, this );
|
||||
m_transActiveDown->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnTransActiveDown ), NULL, this );
|
||||
m_sdbSizerButtonsApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnApplyButtonClick ), NULL, this );
|
||||
m_sdbSizerButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( wxZRColaSettingsBase::OnOKButtonClick ), NULL, this );
|
||||
|
||||
|
||||
@@ -63,12 +63,14 @@ class wxZRColaFrameBase : public wxFrame
|
||||
enum
|
||||
{
|
||||
wxID_CHARACTER_SELECTOR = 1000,
|
||||
wxID_SEND_COMPOSED,
|
||||
wxID_SEND_DECOMPOSED,
|
||||
wxID_SEND_DESTINATION,
|
||||
wxID_COPY_DESTINATION_AND_RETURN,
|
||||
wxID_SEND_SOURCE,
|
||||
wxID_COPY_SOURCE_AND_RETURN,
|
||||
wxID_SEND_ABORT,
|
||||
wxID_SETTINGS,
|
||||
wxID_TOOLBAR_EDIT,
|
||||
wxID_TOOLBAR_COMPOSE,
|
||||
wxID_TOOLBAR_TRANSFORM,
|
||||
wxID_PANEL_CHRGRPS,
|
||||
wxID_HELP_INSTRUCTIONS,
|
||||
wxID_HELP_SHORTCUTS,
|
||||
@@ -85,10 +87,10 @@ class wxZRColaFrameBase : public wxFrame
|
||||
wxAuiToolBarItem* m_toolEditCut;
|
||||
wxAuiToolBarItem* m_toolEditCopy;
|
||||
wxAuiToolBarItem* m_toolEditPaste;
|
||||
wxAuiToolBar* m_toolbarCompose;
|
||||
wxAuiToolBar* m_toolbarTransform;
|
||||
wxAuiToolBarItem* m_toolCharSelect;
|
||||
wxAuiToolBarItem* m_toolSendComposed;
|
||||
wxAuiToolBarItem* m_toolSendDecomposed;
|
||||
wxAuiToolBarItem* m_toolSendDestination;
|
||||
wxAuiToolBarItem* m_toolSendSource;
|
||||
wxZRColaCharacterCatalogPanel* m_panelChrCat;
|
||||
wxStatusBar* m_statusBar;
|
||||
|
||||
@@ -121,43 +123,43 @@ class wxZRColaComposerPanelBase : public wxPanel
|
||||
wxID_TIMER_SAVE = 1000
|
||||
};
|
||||
|
||||
wxSplitterWindow* m_splitterDecomposed;
|
||||
wxPanel* m_panelDecomposedEdit;
|
||||
wxPanel* m_panelDecomposedHex;
|
||||
wxTextCtrl* m_decomposedHex;
|
||||
wxSplitterWindow* m_splitterComposed;
|
||||
wxPanel* m_panelComposedEdit;
|
||||
wxPanel* m_panelComposedHex;
|
||||
wxTextCtrl* m_composedHex;
|
||||
wxSplitterWindow* m_splitterSource;
|
||||
wxPanel* m_panelSourceEdit;
|
||||
wxPanel* m_panelSourceHex;
|
||||
wxTextCtrl* m_sourceHex;
|
||||
wxSplitterWindow* m_splitterDestination;
|
||||
wxPanel* m_panelDestinationEdit;
|
||||
wxPanel* m_panelDestinationHex;
|
||||
wxTextCtrl* m_destinationHex;
|
||||
wxTimer m_timerSave;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnDecomposedPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnDecomposedText( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnDecomposedHexPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnComposedPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnComposedText( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnComposedHexPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnSourcePaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnSourceText( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnSourceHexPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnDestinationPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnDestinationText( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnDestinationHexPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void OnSaveTimer( wxTimerEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
wxTextCtrl* m_decomposed;
|
||||
wxTextCtrl* m_composed;
|
||||
wxTextCtrl* m_source;
|
||||
wxTextCtrl* m_destination;
|
||||
|
||||
wxZRColaComposerPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxT("ZRColaComposerPanel") );
|
||||
~wxZRColaComposerPanelBase();
|
||||
|
||||
void m_splitterDecomposedOnIdle( wxIdleEvent& )
|
||||
void m_splitterSourceOnIdle( wxIdleEvent& )
|
||||
{
|
||||
m_splitterDecomposed->SetSashPosition( -5 );
|
||||
m_splitterDecomposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDecomposedOnIdle ), NULL, this );
|
||||
m_splitterSource->SetSashPosition( -5 );
|
||||
m_splitterSource->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterSourceOnIdle ), NULL, this );
|
||||
}
|
||||
|
||||
void m_splitterComposedOnIdle( wxIdleEvent& )
|
||||
void m_splitterDestinationOnIdle( wxIdleEvent& )
|
||||
{
|
||||
m_splitterComposed->SetSashPosition( -5 );
|
||||
m_splitterComposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterComposedOnIdle ), NULL, this );
|
||||
m_splitterDestination->SetSashPosition( -5 );
|
||||
m_splitterDestination->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDestinationOnIdle ), NULL, this );
|
||||
}
|
||||
|
||||
};
|
||||
@@ -262,6 +264,16 @@ class wxZRColaSettingsBase : public wxDialog
|
||||
wxRadioButton* m_langAuto;
|
||||
wxRadioButton* m_langManual;
|
||||
wxListBox* m_languages;
|
||||
wxPanel* m_panelTransformation;
|
||||
wxStaticText* m_transLabel;
|
||||
wxStaticText* m_transAvailableLabel;
|
||||
wxListBox* m_transAvailable;
|
||||
wxButton* m_transActivate;
|
||||
wxButton* m_transDeactivate;
|
||||
wxStaticText* m_transActiveLabel;
|
||||
wxListBox* m_transActive;
|
||||
wxButton* m_transActiveUp;
|
||||
wxButton* m_transActiveDown;
|
||||
wxPanel* m_panelAutoStart;
|
||||
wxStaticText* m_autoStartLabel;
|
||||
wxCheckBox* m_autoStart;
|
||||
@@ -272,8 +284,12 @@ class wxZRColaSettingsBase : public wxDialog
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
|
||||
virtual void OnLangAuto( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnLangManual( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnLanguageUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
|
||||
virtual void OnTransformationUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
|
||||
virtual void OnTransActivate( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnTransDeactivate( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnTransActiveUp( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnTransActiveDown( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnApplyButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
@@ -96,13 +96,9 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
|
||||
(e.AltDown() ? ZRCola::keyseq_db::keyseq::ALT : 0);
|
||||
m_seq.push_back(key);
|
||||
|
||||
auto n = m_seq.size();
|
||||
ZRCola::keyseq_db::keyseq *ks = (ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(ZRCola::keyseq_db::keyseq::key_t)*n];
|
||||
ks->chr = 0;
|
||||
ks->seq_len = n;
|
||||
memcpy(ks->seq, m_seq.data(), sizeof(ZRCola::keyseq_db::keyseq::key_t)*n);
|
||||
std::unique_ptr<ZRCola::keyseq_db::keyseq> ks((ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(ZRCola::keyseq_db::keyseq::key_t)*m_seq.size()]);
|
||||
ks->ZRCola::keyseq_db::keyseq::keyseq(m_seq.data(), m_seq.size());
|
||||
found = app->m_ks_db.idxKey.find(*ks, start);
|
||||
delete ks;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
@@ -116,14 +112,14 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
|
||||
wxObject *obj = event.GetEventObject();
|
||||
if (obj && obj->IsKindOf(wxCLASSINFO(wxTextCtrl))) {
|
||||
// Push text to source control.
|
||||
((wxTextCtrl*)obj)->WriteText(ks.chr);
|
||||
((wxTextCtrl*)obj)->WriteText(wxString(ks.chr(), ks.chr_len()));
|
||||
|
||||
// Event is fully processed now.
|
||||
event.StopPropagation();
|
||||
return true;
|
||||
}
|
||||
} else if (start < app->m_ks_db.idxKey.size() &&
|
||||
ZRCola::keyseq_db::keyseq::CompareSequence(m_seq.data(), m_seq.size(), app->m_ks_db.idxKey[start].seq, std::min<unsigned __int16>(app->m_ks_db.idxKey[start].seq_len, m_seq.size())) == 0)
|
||||
ZRCola::keyseq_db::keyseq::CompareSequence(m_seq.data(), m_seq.size(), app->m_ks_db.idxKey[start].seq(), std::min<size_t>(app->m_ks_db.idxKey[start].seq_len(), m_seq.size())) == 0)
|
||||
{
|
||||
// The sequence is a partial match. Continue watching.
|
||||
if (pFrame && pFrame->GetStatusBar())
|
||||
|
||||
@@ -27,17 +27,30 @@
|
||||
wxZRColaSettings::wxZRColaSettings(wxWindow* parent) :
|
||||
m_lang_auto(true),
|
||||
m_lang(ZRCola::langid_t::blank),
|
||||
m_transeq(1, 0), // By default use translation set 0 (ZRCola Decomposed >> ZRCola Composed)
|
||||
wxZRColaSettingsBase(parent)
|
||||
{
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
m_languages->Clear();
|
||||
for (size_t i = 0, n = app->m_lang_db.idxLng.size(); i < n; i++) {
|
||||
const auto &lang = app->m_lang_db.idxLng[i];
|
||||
for (size_t i = 0, n = app->m_lang_db.idxLang.size(); i < n; i++) {
|
||||
const auto &lang = app->m_lang_db.idxLang[i];
|
||||
wxString
|
||||
label(lang.name, lang.name_len),
|
||||
label(lang.name(), lang.name_len()),
|
||||
label_tran(wxGetTranslation(label, wxT("ZRCola-zrcdb")));
|
||||
m_languages->Insert(label_tran, i);
|
||||
}
|
||||
|
||||
m_transAvailable->Clear();
|
||||
for (size_t i = 0, n = app->m_ts_db.idxTranSet.size(); i < n; i++) {
|
||||
const ZRCola::transet_db::transet &ts = app->m_ts_db.idxTranSet[i];
|
||||
wxString
|
||||
src(ts.src(), ts.src_len()),
|
||||
dst(ts.dst(), ts.dst_len()),
|
||||
src_tran(wxGetTranslation(src, wxT("ZRCola-zrcdb"))),
|
||||
dst_tran(wxGetTranslation(dst, wxT("ZRCola-zrcdb"))),
|
||||
label_tran(wxString::Format(wxT("%s \x00bb %s"), src_tran.c_str(), dst_tran.c_str()));
|
||||
m_transAvailable->Append(label_tran, (void*)ts.set);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -58,22 +71,97 @@ void wxZRColaSettings::OnInitDialog(wxInitDialogEvent& event)
|
||||
(m_lang_auto ? m_langAuto : m_langManual)->SetValue(true);
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
char l[sizeof(ZRCola::language_db::language)] = {};
|
||||
((ZRCola::language_db::language*)l)->id = m_lang;
|
||||
ZRCola::language_db::indexLang::size_type start;
|
||||
m_languages->Select(app->m_lang_db.idxLng.find(*(ZRCola::language_db::language*)l, start) ? start : -1);
|
||||
m_languages->Select(app->m_lang_db.idxLang.find(ZRCola::language_db::language(m_lang), start) ? start : -1);
|
||||
|
||||
m_transActive->Clear();
|
||||
for (auto s = m_transeq.cbegin(), s_end = m_transeq.cend(); s != s_end; ++s) {
|
||||
ZRCola::transet_db::indexTranSet::size_type start;
|
||||
if (app->m_ts_db.idxTranSet.find(ZRCola::transet_db::transet(*s), start)) {
|
||||
const ZRCola::transet_db::transet &ts = app->m_ts_db.idxTranSet[start];
|
||||
wxString
|
||||
src(ts.src(), ts.src_len()),
|
||||
dst(ts.dst(), ts.dst_len()),
|
||||
src_tran(wxGetTranslation(src, wxT("ZRCola-zrcdb"))),
|
||||
dst_tran(wxGetTranslation(dst, wxT("ZRCola-zrcdb"))),
|
||||
label_tran(wxString::Format(wxT("%s \x00bb %s"), src_tran.c_str(), dst_tran.c_str()));
|
||||
m_transActive->Append(label_tran, (void*)ts.set);
|
||||
} else {
|
||||
wxString label_tran(wxString::Format(_("Unknown transformation (%u)"), (unsigned int)*s));
|
||||
m_transActive->Append(label_tran, (void*)*s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaSettings::OnLangAuto(wxCommandEvent& event)
|
||||
void wxZRColaSettings::OnLanguageUpdate(wxUpdateUIEvent& event)
|
||||
{
|
||||
m_languages->Enable(!event.IsChecked());
|
||||
m_languages->Enable(m_langManual->GetValue());
|
||||
|
||||
wxZRColaSettingsBase::OnLanguageUpdate(event);
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaSettings::OnLangManual(wxCommandEvent& event)
|
||||
void wxZRColaSettings::OnTransformationUpdate(wxUpdateUIEvent& event)
|
||||
{
|
||||
m_languages->Enable(event.IsChecked());
|
||||
m_transActivate->Enable(m_transAvailable->GetSelection() != wxNOT_FOUND);
|
||||
|
||||
int idx = m_transActive->GetSelection();
|
||||
m_transDeactivate->Enable(idx != wxNOT_FOUND);
|
||||
m_transActiveUp ->Enable(idx != wxNOT_FOUND && (unsigned int)idx > 0);
|
||||
m_transActiveDown->Enable(idx != wxNOT_FOUND && (unsigned int)idx < m_transActive->GetCount() - 1);
|
||||
|
||||
wxZRColaSettingsBase::OnTransformationUpdate(event);
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaSettings::OnTransActivate(wxCommandEvent& event)
|
||||
{
|
||||
int idx = m_transAvailable->GetSelection();
|
||||
wxASSERT_MSG(idx != wxNOT_FOUND, wxT("no available transformation selected"));
|
||||
m_transActive->Append(
|
||||
m_transAvailable->GetString(idx),
|
||||
m_transAvailable->GetClientData(idx));
|
||||
|
||||
wxZRColaSettingsBase::OnTransActivate(event);
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaSettings::OnTransDeactivate(wxCommandEvent& event)
|
||||
{
|
||||
int idx = m_transActive->GetSelection();
|
||||
wxASSERT_MSG(idx != wxNOT_FOUND, wxT("no active transformation selected"));
|
||||
m_transActive->Delete(idx);
|
||||
|
||||
wxZRColaSettingsBase::OnTransDeactivate(event);
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaSettings::OnTransActiveUp(wxCommandEvent& event)
|
||||
{
|
||||
int idx = m_transActive->GetSelection();
|
||||
wxASSERT_MSG(idx != wxNOT_FOUND && (unsigned int)idx > 0, wxT("no or first active transformation selected"));
|
||||
wxString label = m_transActive->GetString(idx);
|
||||
void *data = m_transActive->GetClientData(idx);
|
||||
m_transActive->Delete(idx);
|
||||
m_transActive->Insert(label, idx - 1, data);
|
||||
m_transActive->Select(idx - 1);
|
||||
|
||||
wxZRColaSettingsBase::OnTransActiveUp(event);
|
||||
}
|
||||
|
||||
|
||||
void wxZRColaSettings::OnTransActiveDown(wxCommandEvent& event)
|
||||
{
|
||||
int idx = m_transActive->GetSelection();
|
||||
wxASSERT_MSG(idx != wxNOT_FOUND && (unsigned int)idx < m_transActive->GetCount() - 1, wxT("no or last active transformation selected"));
|
||||
wxString label = m_transActive->GetString(idx);
|
||||
void *data = m_transActive->GetClientData(idx);
|
||||
m_transActive->Delete(idx);
|
||||
m_transActive->Insert(label, idx + 1, data);
|
||||
m_transActive->Select(idx + 1);
|
||||
|
||||
wxZRColaSettingsBase::OnTransActiveDown(event);
|
||||
}
|
||||
|
||||
|
||||
@@ -122,16 +210,20 @@ void wxZRColaSettings::OnApplyButtonClick(wxCommandEvent& event)
|
||||
m_lang_auto = false;
|
||||
|
||||
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
|
||||
const auto &lang = app->m_lang_db.idxLng[m_languages->GetSelection()];
|
||||
const auto &lang = app->m_lang_db.idxLang[m_languages->GetSelection()];
|
||||
|
||||
if (m_lang != lang.id) {
|
||||
m_lang = lang.id;
|
||||
if (m_lang != lang.lang) {
|
||||
m_lang = lang.lang;
|
||||
|
||||
// Notify composed text something changed and should re-decompose.
|
||||
// Notify destination text something changed and should re-inverse transform.
|
||||
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
|
||||
app->m_mainWnd->m_panel->m_composed->ProcessWindowEvent(event2);
|
||||
app->m_mainWnd->m_panel->m_destination->ProcessWindowEvent(event2);
|
||||
}
|
||||
}
|
||||
|
||||
m_transeq.clear();
|
||||
for (unsigned int i = 0, n = m_transActive->GetCount(); i < n; i++)
|
||||
m_transeq.push_back((ZRCola::transetid_t)m_transActive->GetClientData(i));
|
||||
}
|
||||
|
||||
|
||||
@@ -159,6 +251,12 @@ void wxPersistentZRColaSettings::Save() const
|
||||
|
||||
SaveValue(wxT("langAuto"), wnd->m_lang_auto);
|
||||
SaveValue(wxT("lang" ), wxString::FromAscii(wnd->m_lang.data, _countof(wnd->m_lang.data)));
|
||||
|
||||
wxString str;
|
||||
bool first = true;
|
||||
for (auto s = wnd->m_transeq.cbegin(), s_end = wnd->m_transeq.cend(); s != s_end; ++s, first = false)
|
||||
str += wxString::Format(first ? wxT("%u") : wxT("|%u"), *s);
|
||||
SaveValue(wxT("transeq"), str);
|
||||
}
|
||||
|
||||
|
||||
@@ -179,11 +277,28 @@ bool wxPersistentZRColaSettings::Restore()
|
||||
} else if (RestoreValue(wxT("lang"), &lang) && lang.Length() == 3) {
|
||||
// The language was read from configuration.
|
||||
wnd->m_lang = lang.c_str();
|
||||
} else if (!app->m_lang_db.idxLng.empty()) {
|
||||
const auto &lang = app->m_lang_db.idxLng[0];
|
||||
wnd->m_lang = lang.id;
|
||||
} else if (!app->m_lang_db.idxLang.empty()) {
|
||||
const auto &lang = app->m_lang_db.idxLang[0];
|
||||
wnd->m_lang = lang.lang;
|
||||
} else
|
||||
wnd->m_lang = ZRCola::langid_t::blank;
|
||||
|
||||
wxString str;
|
||||
if (RestoreValue(wxT("transeq"), &str)) {
|
||||
std::vector<ZRCola::transetid_t> transeq;
|
||||
for (wxStringTokenizer tok(str, wxT("|")); tok.HasMoreTokens(); ) {
|
||||
unsigned long val = _tcstoul(tok.GetNextToken().c_str(), NULL, 10);
|
||||
for (size_t i = 0, n = app->m_ts_db.idxTranSet.size(); i < n; i++) {
|
||||
const ZRCola::transet_db::transet &cg = app->m_ts_db.idxTranSet[i];
|
||||
if (cg.set == val) {
|
||||
transeq.push_back(val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!transeq.empty())
|
||||
wnd->m_transeq = std::move(transeq);
|
||||
}
|
||||
|
||||
return wxPersistentDialog::Restore();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,9 @@ class wxPersistentZRColaSettings;
|
||||
#pragma once
|
||||
|
||||
#include "zrcolagui.h"
|
||||
#include <zrcola/translate.h>
|
||||
#include <wxex/persist/dialog.h>
|
||||
#include <vector>
|
||||
|
||||
|
||||
///
|
||||
@@ -42,14 +44,19 @@ public:
|
||||
|
||||
protected:
|
||||
virtual void OnInitDialog(wxInitDialogEvent& event);
|
||||
virtual void OnLangAuto(wxCommandEvent& event);
|
||||
virtual void OnLangManual(wxCommandEvent& event);
|
||||
virtual void OnLanguageUpdate(wxUpdateUIEvent& event);
|
||||
virtual void OnTransformationUpdate(wxUpdateUIEvent& event);
|
||||
virtual void OnTransActivate(wxCommandEvent& event);
|
||||
virtual void OnTransDeactivate(wxCommandEvent& event);
|
||||
virtual void OnTransActiveUp(wxCommandEvent& event);
|
||||
virtual void OnTransActiveDown(wxCommandEvent& event);
|
||||
virtual void OnApplyButtonClick(wxCommandEvent& event);
|
||||
virtual void OnOKButtonClick(wxCommandEvent& event);
|
||||
|
||||
public:
|
||||
bool m_lang_auto; ///< Is language for decomposing resolved using currently selected keyboard
|
||||
ZRCola::langid_t m_lang; ///< Language for decomposing
|
||||
bool m_lang_auto; ///< Is language for inverse translation resolved using currently selected keyboard
|
||||
ZRCola::langid_t m_lang; ///< Language for inverse translation
|
||||
std::vector<ZRCola::transetid_t> m_transeq; ///< Transformation set sequence
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -28,35 +28,19 @@ using namespace winstd;
|
||||
// ZRCola::DBSource::character_bank
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ZRCola::DBSource::character_bank::character_bank() : vector<unique_ptr<ZRCola::DBSource::character> >()
|
||||
{
|
||||
resize(0x10000);
|
||||
}
|
||||
|
||||
|
||||
void ZRCola::DBSource::character_bank::build_related()
|
||||
{
|
||||
// Initialize ignore list.
|
||||
m_ignore.insert(L"letter");
|
||||
m_ignore.insert(L"modifier");
|
||||
m_ignore.insert(L"symbol");
|
||||
m_ignore.insert(L"accent");
|
||||
m_ignore.insert(L"with");
|
||||
m_ignore.insert(L"and");
|
||||
m_ignore.insert(L"capital");
|
||||
m_ignore.insert(L"small");
|
||||
m_ignore.insert(L"combining");
|
||||
|
||||
SYSTEM_INFO si;
|
||||
GetSystemInfo(&si);
|
||||
|
||||
// Launch workers.
|
||||
build_related_worker **workers = new build_related_worker*[si.dwNumberOfProcessors];
|
||||
size_type from = 0, to;
|
||||
for (DWORD i = 0; i < si.dwNumberOfProcessors; i++) {
|
||||
to = MulDiv(i + 1, 0x10000, si.dwNumberOfProcessors);
|
||||
workers[i] = new build_related_worker(this, from, to);
|
||||
from = to;
|
||||
size_type from = 0, total = size();
|
||||
iterator chr_from = begin(), chr_to;
|
||||
for (DWORD i = 0; i < si.dwNumberOfProcessors; i++, chr_from = chr_to) {
|
||||
size_type to = MulDiv(i + 1, total, si.dwNumberOfProcessors);
|
||||
for (chr_to = chr_from; from < to; from++, ++chr_to);
|
||||
workers[i] = new build_related_worker(this, chr_from, chr_to);
|
||||
}
|
||||
|
||||
// Wait for workers.
|
||||
@@ -71,7 +55,7 @@ void ZRCola::DBSource::character_bank::build_related()
|
||||
}
|
||||
|
||||
|
||||
ZRCola::DBSource::character_bank::build_related_worker::build_related_worker(_In_ const character_bank *cb, _In_ size_type from, _In_ size_type to) :
|
||||
ZRCola::DBSource::character_bank::build_related_worker::build_related_worker(_In_ const character_bank *cb, _In_ iterator from, _In_ iterator to) :
|
||||
win_handle((HANDLE)_beginthreadex(NULL, 0, process, this, CREATE_SUSPENDED, NULL)),
|
||||
m_heap(HeapCreate(0, 0, 0)),
|
||||
m_cb(cb),
|
||||
@@ -86,40 +70,39 @@ ZRCola::DBSource::character_bank::build_related_worker::build_related_worker(_In
|
||||
unsigned int ZRCola::DBSource::character_bank::build_related_worker::process()
|
||||
{
|
||||
heap_allocator<wchar_t> al(m_heap);
|
||||
basic_string<wchar_t, char_traits<wchar_t>, heap_allocator<wchar_t> > rel(al);
|
||||
vector<wchar_t, heap_allocator<wchar_t> > rel(al);
|
||||
set<wstring, less<wstring>, heap_allocator<wstring> > matching(less<wstring>(), al);
|
||||
|
||||
for (size_type i = m_from; i < m_to; i++) {
|
||||
auto &chr = *(m_cb->at(i).get());
|
||||
if (&chr == NULL) continue;
|
||||
|
||||
for (auto c = m_from; c != m_to; c++) {
|
||||
rel.clear();
|
||||
|
||||
// Remove all unexisting, inactive, or self related characters.
|
||||
for (auto j = chr.rel.length(); j--;) {
|
||||
wchar_t c = chr.rel[j];
|
||||
if (m_cb->at(c) && (wchar_t)j != c)
|
||||
rel += c;
|
||||
// Skip all unexisting, or self related characters.
|
||||
auto m_cb_end = m_cb->cend();
|
||||
for (std::vector<wchar_t>::const_pointer c_rel = c->second.rel.data(), c_rel_end = c_rel + c->second.rel.size(), c_rel_next = c_rel_end; c_rel < c_rel_end; c_rel = c_rel_next) {
|
||||
c_rel_next = c_rel + wcsnlen(c_rel, c_rel_end - c_rel) + 1;
|
||||
if (m_cb->find(c_rel) != m_cb_end && c->first.compare(c_rel) != 0)
|
||||
rel.insert(rel.end(), c_rel, c_rel_next);
|
||||
}
|
||||
|
||||
// Add all characters that share enought keywords.
|
||||
for (size_type j = 0, j_end = m_cb->size(); j < j_end; j++) {
|
||||
if (i == j || rel.find((wchar_t)j) != wstring::npos)
|
||||
// Add all characters that share enough keywords.
|
||||
for (auto c2 = m_cb->cbegin(), c2_end = m_cb->cend(); c2 != c2_end; ++c2) {
|
||||
if (c == c2)
|
||||
continue;
|
||||
const auto &chr2 = *(m_cb->at(j).get());
|
||||
if (&chr2 == NULL)
|
||||
bool already_present = false;
|
||||
for (std::vector<wchar_t>::const_pointer c_rel = rel.data(), c_rel_end = c_rel + rel.size(), c_rel_next = c_rel_end; c_rel < c_rel_end; c_rel = c_rel_next) {
|
||||
c_rel_next = c_rel + wcsnlen(c_rel, c_rel_end - c_rel) + 1;
|
||||
if (c2->first.compare(c_rel) == 0) {
|
||||
already_present = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (already_present)
|
||||
continue;
|
||||
|
||||
set<wstring>::size_type comparisons = 0;
|
||||
matching.clear();
|
||||
for (auto term = chr.terms.cbegin(), term_end = chr.terms.cend(); term != term_end; ++term) {
|
||||
// Test for ignored word(s).
|
||||
if (m_cb->m_ignore.find(*term) != m_cb->m_ignore.cend())
|
||||
continue;
|
||||
for (auto term2 = chr2.terms.cbegin(), term2_end = chr2.terms.cend(); term2 != term2_end; ++term2) {
|
||||
// Test for ignored word(s).
|
||||
if (m_cb->m_ignore.find(*term2) != m_cb->m_ignore.cend())
|
||||
continue;
|
||||
for (auto term = c->second.terms_rel.cbegin(), term_end = c->second.terms_rel.cend(); term != term_end; ++term) {
|
||||
for (auto term2 = c2->second.terms_rel.cbegin(), term2_end = c2->second.terms_rel.cend(); term2 != term2_end; ++term2) {
|
||||
comparisons++;
|
||||
if (*term == *term2)
|
||||
matching.insert(*term);
|
||||
@@ -130,11 +113,11 @@ unsigned int ZRCola::DBSource::character_bank::build_related_worker::process()
|
||||
// If 1/2 terms match, assume related.
|
||||
auto hits = matching.size();
|
||||
if (hits*hits*2 >= comparisons)
|
||||
rel += chr2.chr;
|
||||
rel.insert(rel.end(), c2->first.data(), c2->first.data() + c2->first.length() + 1);
|
||||
}
|
||||
}
|
||||
|
||||
chr.rel.assign(rel.c_str(), rel.length());
|
||||
c->second.rel.assign(rel.cbegin(), rel.cend());
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -197,7 +180,7 @@ void ZRCola::DBSource::character_desc_idx::parse_keywords(const wchar_t *str, se
|
||||
}
|
||||
|
||||
|
||||
void ZRCola::DBSource::character_desc_idx::add_keywords(const set<wstring> &terms, wchar_t chr, size_t sub)
|
||||
void ZRCola::DBSource::character_desc_idx::add_keywords(const set<wstring> &terms, const wstring &chr, size_t sub)
|
||||
{
|
||||
for (auto term = terms.cbegin(), term_end = terms.cend(); term != term_end; ++term) {
|
||||
if (sub) {
|
||||
@@ -250,12 +233,24 @@ void ZRCola::DBSource::character_desc_idx::save(ZRCola::textindex<wchar_t, wchar
|
||||
|
||||
ZRCola::DBSource::DBSource()
|
||||
{
|
||||
// Initialize ignore list.
|
||||
m_terms_ignore.insert(L"letter");
|
||||
m_terms_ignore.insert(L"modifier");
|
||||
m_terms_ignore.insert(L"symbol");
|
||||
m_terms_ignore.insert(L"accent");
|
||||
m_terms_ignore.insert(L"with");
|
||||
m_terms_ignore.insert(L"and");
|
||||
m_terms_ignore.insert(L"capital");
|
||||
m_terms_ignore.insert(L"small");
|
||||
m_terms_ignore.insert(L"combining");
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
|
||||
@@ -286,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<ADOParameters> params;
|
||||
@@ -302,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<ADOParameters> 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);
|
||||
@@ -434,29 +449,31 @@ bool ZRCola::DBSource::GetUnicodeString(const com_obj<ADOField>& f, wstring& str
|
||||
|
||||
variant v;
|
||||
wxVERIFY(SUCCEEDED(f->get_Value(&v)));
|
||||
wxCHECK(SUCCEEDED(v.change_type(VT_BSTR)), false);
|
||||
|
||||
// Parse the field. Must be "xxxx+xxxx+xxxx..." sequence.
|
||||
str.clear();
|
||||
for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) {
|
||||
// Parse Unicode code.
|
||||
UINT j = 0;
|
||||
wchar_t c = 0;
|
||||
for (; i < n && V_BSTR(&v)[i]; i++, j++) {
|
||||
if (L'0' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'9') c = c*0x10 + (V_BSTR(&v)[i] - L'0');
|
||||
else if (L'A' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'F') c = c*0x10 + (V_BSTR(&v)[i] - L'A' + 10);
|
||||
else if (L'a' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'f') c = c*0x10 + (V_BSTR(&v)[i] - L'a' + 10);
|
||||
else break;
|
||||
}
|
||||
if (j <= 0 || 4 < j) {
|
||||
bstr fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname)));
|
||||
_ftprintf(stderr, wxT("%s: error ZCC0020: Syntax error in \"%.*ls\" field (\"%.*ls\"). Unicode code must be one to four hexadecimal characters long.\n"), m_filename.c_str(), fieldname.length(), (BSTR)fieldname, n, V_BSTR(&v));
|
||||
return false;
|
||||
}
|
||||
str += c;
|
||||
if (V_VT(&v) != VT_NULL) {
|
||||
wxCHECK(SUCCEEDED(v.change_type(VT_BSTR)), false);
|
||||
|
||||
// Skip delimiter(s) and whitespace.
|
||||
for (; i < n && V_BSTR(&v)[i] && (V_BSTR(&v)[i] == L'+' || _iswspace_l(V_BSTR(&v)[i], m_locale)); i++);
|
||||
// Parse the field. Must be "xxxx+xxxx+xxxx..." sequence.
|
||||
for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) {
|
||||
// Parse Unicode code.
|
||||
UINT j = 0;
|
||||
wchar_t c = 0;
|
||||
for (; i < n && V_BSTR(&v)[i]; i++, j++) {
|
||||
if (L'0' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'9') c = c*0x10 + (V_BSTR(&v)[i] - L'0');
|
||||
else if (L'A' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'F') c = c*0x10 + (V_BSTR(&v)[i] - L'A' + 10);
|
||||
else if (L'a' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'f') c = c*0x10 + (V_BSTR(&v)[i] - L'a' + 10);
|
||||
else break;
|
||||
}
|
||||
if (j <= 0 || 4 < j) {
|
||||
bstr fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname)));
|
||||
_ftprintf(stderr, wxT("%s: error ZCC0020: Syntax error in \"%.*ls\" field (\"%.*ls\"). Unicode code must be one to four hexadecimal characters long.\n"), m_filename.c_str(), fieldname.length(), (BSTR)fieldname, n, V_BSTR(&v));
|
||||
return false;
|
||||
}
|
||||
str += c;
|
||||
|
||||
// Skip delimiter(s) and whitespace.
|
||||
for (; i < n && V_BSTR(&v)[i] && (V_BSTR(&v)[i] == L'+' || _iswspace_l(V_BSTR(&v)[i], m_locale)); i++);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -591,12 +608,33 @@ bool ZRCola::DBSource::SelectTranslations(com_obj<ADORecordset> &rs) const
|
||||
|
||||
// Open it.
|
||||
if (FAILED(rs->Open(variant(
|
||||
L"SELECT [komb], [znak], [rang_znak] "
|
||||
L"SELECT [komb], [rang_komb], [znak], [rang_znak] "
|
||||
L"FROM [VRS_ReplChar] "
|
||||
L"WHERE [rang_komb]=1 "
|
||||
L"ORDER BY [znak], [rang_znak], [komb]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText)))
|
||||
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<ADORecordset>& 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;
|
||||
}
|
||||
@@ -615,19 +653,75 @@ bool ZRCola::DBSource::GetTranslation(const com_obj<ADORecordset>& rs, ZRCola::D
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"komb"), &f)));
|
||||
wxCHECK(GetUnicodeString(f, t.decomp.str), false);
|
||||
wxCHECK(GetUnicodeString(f, t.src.str), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, t.chr), false);
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"rang_komb"), &f)));
|
||||
wxCHECK(GetValue(f, t.src.rank), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"rang_znak"), &f)));
|
||||
wxCHECK(GetValue(f, t.decomp.rank), false);
|
||||
wxCHECK(GetValue(f, t.dst.rank), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
|
||||
wxCHECK(GetUnicodeString(f, t.dst.str), false);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool ZRCola::DBSource::SelectTranlationSets(com_obj<ADORecordset> &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<ADORecordset>& rs, ZRCola::DBSource::transet& ts) const
|
||||
{
|
||||
wxASSERT_MSG(rs, wxT("recordset is empty"));
|
||||
|
||||
com_obj<ADOFields> flds;
|
||||
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"entCode"), &f)));
|
||||
wxCHECK(GetValue(f, ts.set), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Src_En"), &f)));
|
||||
wxCHECK(GetValue(f, ts.src), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Dst_En"), &f)));
|
||||
wxCHECK(GetValue(f, ts.dst), false);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -665,7 +759,7 @@ bool ZRCola::DBSource::GetKeySequence(const com_obj<ADORecordset>& rs, ZRCola::D
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Znak"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, ks.chr), false);
|
||||
wxCHECK(GetUnicodeString(f, ks.chr), false);
|
||||
}
|
||||
|
||||
int modifiers;
|
||||
@@ -753,7 +847,7 @@ bool ZRCola::DBSource::GetLanguage(const com_obj<ADORecordset>& rs, ZRCola::DBSo
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"entCode"), &f)));
|
||||
wxCHECK(GetLanguage(f, lang.id), false);
|
||||
wxCHECK(GetLanguage(f, lang.lang), false);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -797,7 +891,7 @@ bool ZRCola::DBSource::GetLanguageCharacter(const com_obj<ADORecordset>& rs, ZRC
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, lc.chr), false);
|
||||
wxCHECK(GetUnicodeString(f, lc.chr), false);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -837,18 +931,18 @@ bool ZRCola::DBSource::GetCharacterGroup(const com_obj<ADORecordset>& rs, chrgrp
|
||||
|
||||
com_obj<ADOFields> flds;
|
||||
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
|
||||
wstring id;
|
||||
wstring grp;
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"id"), &f)));
|
||||
wxCHECK(GetValue(f, cg.id), false);
|
||||
wxCHECK(GetValue(f, cg.grp), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Skupina"), &f)));
|
||||
wxCHECK(GetValue(f, id), false);
|
||||
wxCHECK(GetValue(f, grp), false);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -864,7 +958,7 @@ bool ZRCola::DBSource::GetCharacterGroup(const com_obj<ADORecordset>& rs, chrgrp
|
||||
}
|
||||
|
||||
// Read character list from database.
|
||||
wxVERIFY(SUCCEEDED(m_pCharacterGroup1->put_Value(variant(id.c_str()))));
|
||||
wxVERIFY(SUCCEEDED(m_pCharacterGroup1->put_Value(variant(grp.c_str()))));
|
||||
com_obj<ADORecordset> rs_chars;
|
||||
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs_chars)));
|
||||
wxVERIFY(SUCCEEDED(rs_chars->put_CursorLocation(adUseClient)));
|
||||
@@ -884,11 +978,11 @@ bool ZRCola::DBSource::GetCharacterGroup(const com_obj<ADORecordset>& rs, chrgrp
|
||||
com_obj<ADOField> f_char, f_show;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Znak" ), &f_char)));
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"pogost"), &f_show)));
|
||||
for (VARIANT_BOOL eof = VARIANT_TRUE; SUCCEEDED(rs_chars->get_EOF(&eof)) && !eof; rs_chars->MoveNext()) {
|
||||
wchar_t c;
|
||||
wxCHECK(GetUnicodeCharacter(f_char, c), false);
|
||||
size_t n = cg.chars.length();
|
||||
cg.chars += c;
|
||||
size_t n = 0;
|
||||
for (VARIANT_BOOL eof = VARIANT_TRUE; SUCCEEDED(rs_chars->get_EOF(&eof)) && !eof; rs_chars->MoveNext(), n++) {
|
||||
wstring c;
|
||||
wxCHECK(GetUnicodeString(f_char, c), false);
|
||||
cg.chars.insert(cg.chars.end(), c.data(), c.data() + c.length() + 1);
|
||||
bool show;
|
||||
wxCHECK(GetValue(f_show, show), false);
|
||||
if ((n % 16) == 0)
|
||||
@@ -932,42 +1026,49 @@ bool ZRCola::DBSource::GetCharacter(const com_obj<ADORecordset>& rs, character&
|
||||
|
||||
com_obj<ADOFields> flds;
|
||||
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
|
||||
wchar_t c;
|
||||
chr.rel.clear();
|
||||
wstring c;
|
||||
chr.second.terms.clear();
|
||||
chr.second.terms_rel.clear();
|
||||
chr.second.rel.clear();
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, chr.chr), false);
|
||||
wxCHECK(GetUnicodeString(f, chr.first), false);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak_v"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, c), false);
|
||||
if (c && c != chr.chr)
|
||||
chr.rel += c;
|
||||
wxCHECK(GetUnicodeString(f, c), false);
|
||||
if (!c.empty() && c != chr.first)
|
||||
chr.second.rel.insert(chr.second.rel.end(), c.data(), c.data() + c.length() + 1);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak_m"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, c), false);
|
||||
if (c && c != chr.chr)
|
||||
chr.rel += c;
|
||||
wxCHECK(GetUnicodeString(f, c), false);
|
||||
if (!c.empty() && c != chr.first)
|
||||
chr.second.rel.insert(chr.second.rel.end(), c.data(), c.data() + c.length() + 1);
|
||||
}
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"opis_en"), &f)));
|
||||
wxCHECK(GetValue(f, chr.desc), false);
|
||||
wxCHECK(GetValue(f, chr.second.desc), false);
|
||||
ZRCola::DBSource::character_desc_idx::parse_keywords(chr.second.desc.c_str(), chr.second.terms);
|
||||
for (auto term = chr.second.terms.cbegin(), term_end = chr.second.terms.cend(); term != term_end; ++term) {
|
||||
if (m_terms_ignore.find(*term) != m_terms_ignore.cend())
|
||||
continue;
|
||||
chr.second.terms_rel.insert(*term);
|
||||
}
|
||||
}
|
||||
ZRCola::DBSource::character_desc_idx::parse_keywords(chr.desc.c_str(), chr.terms);
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"kat"), &f)));
|
||||
wxCHECK(GetChrCat(f, chr.cat), false);
|
||||
wxCHECK(GetChrCat(f, chr.second.cat), false);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1002,12 +1103,11 @@ bool ZRCola::DBSource::GetCharacterCategory(const com_obj<ADORecordset>& rs, chr
|
||||
|
||||
com_obj<ADOFields> flds;
|
||||
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
|
||||
wstring id;
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"kat"), &f)));
|
||||
wxCHECK(GetChrCat(f, cc.id), false);
|
||||
wxCHECK(GetChrCat(f, cc.cat), false);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -1053,12 +1153,11 @@ bool ZRCola::DBSource::GetCharacterTag(const winstd::com_obj<ADORecordset>& rs,
|
||||
|
||||
com_obj<ADOFields> flds;
|
||||
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
|
||||
wstring id;
|
||||
|
||||
{
|
||||
com_obj<ADOField> f;
|
||||
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
|
||||
wxCHECK(GetUnicodeCharacter(f, ct.chr), false);
|
||||
wxCHECK(GetUnicodeString(f, ct.chr), false);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -1098,7 +1197,6 @@ bool ZRCola::DBSource::GetTagName(const winstd::com_obj<ADORecordset>& rs, tagna
|
||||
|
||||
com_obj<ADOFields> flds;
|
||||
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
|
||||
wstring id;
|
||||
tn.names.clear();
|
||||
|
||||
{
|
||||
|
||||
@@ -21,10 +21,18 @@
|
||||
|
||||
#include <zrcola/character.h>
|
||||
#include <zrcola/common.h>
|
||||
#include <zrcola/language.h>
|
||||
#include <zrcola/tag.h>
|
||||
#include <zrcola/translate.h>
|
||||
|
||||
#include <zrcolaui/chargroup.h>
|
||||
#include <zrcolaui/keyboard.h>
|
||||
|
||||
#include <WinStd/COM.h>
|
||||
#include <WinStd/Win.h>
|
||||
|
||||
#include <wx/debug.h>
|
||||
|
||||
#include <adoint.h>
|
||||
#include <list>
|
||||
#include <map>
|
||||
@@ -58,19 +66,6 @@ namespace ZRCola {
|
||||
str (_str)
|
||||
{
|
||||
}
|
||||
|
||||
///
|
||||
/// Functor to compare two sequences by `rank`, and `str` members respectively
|
||||
///
|
||||
struct less_rank_str {
|
||||
inline bool operator()(_In_ const charseq& a, _In_ const charseq& b) const
|
||||
{
|
||||
if (a.rank < b.rank) return true;
|
||||
else if (a.rank > b.rank) return false;
|
||||
else if (a.str < b.str ) return true;
|
||||
else return false;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -79,8 +74,20 @@ namespace ZRCola {
|
||||
///
|
||||
class translation {
|
||||
public:
|
||||
wchar_t chr; ///< Composed character
|
||||
charseq decomp; ///< Decomposed sequence
|
||||
int set; ///< Translation set ID
|
||||
charseq src; ///< Source sequence
|
||||
charseq dst; ///< Destination sequence
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Translation set
|
||||
///
|
||||
class transet {
|
||||
public:
|
||||
int set; ///< ID
|
||||
std::wstring src; ///< Source name
|
||||
std::wstring dst; ///< Destination name
|
||||
};
|
||||
|
||||
|
||||
@@ -114,7 +121,7 @@ namespace ZRCola {
|
||||
};
|
||||
|
||||
public:
|
||||
wchar_t chr; ///< Character
|
||||
std::wstring chr; ///< Character
|
||||
std::vector<keycode> seq; ///< Key sequence
|
||||
};
|
||||
|
||||
@@ -124,8 +131,8 @@ namespace ZRCola {
|
||||
///
|
||||
class language {
|
||||
public:
|
||||
ZRCola::langid_t id; ///< Language ID
|
||||
std::wstring name; ///< Language name
|
||||
ZRCola::langid_t lang; ///< Language ID
|
||||
std::wstring name; ///< Name
|
||||
};
|
||||
|
||||
|
||||
@@ -134,7 +141,7 @@ namespace ZRCola {
|
||||
///
|
||||
class langchar {
|
||||
public:
|
||||
wchar_t chr; ///> Character
|
||||
std::wstring chr; ///> Character
|
||||
ZRCola::langid_t lang; ///< Language ID
|
||||
};
|
||||
|
||||
@@ -144,72 +151,61 @@ namespace ZRCola {
|
||||
///
|
||||
class chrgrp {
|
||||
public:
|
||||
int id; ///< Character group ID
|
||||
int rank; ///< Character group rank
|
||||
std::wstring name; ///< Character group name
|
||||
std::wstring chars; ///< Character group characters
|
||||
std::vector<unsigned __int16> show; ///< Bit vector if particular character is displayed initially
|
||||
int grp; ///< Character group ID
|
||||
int rank; ///< Rank
|
||||
std::wstring name; ///< Name
|
||||
std::vector<wchar_t> chars; ///< Characters (zero-delimited)
|
||||
std::vector<unsigned __int16> show; ///< Bit vector if particular character from \c chars is displayed initially
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Character data
|
||||
///
|
||||
class character_data {
|
||||
public:
|
||||
inline character_data()
|
||||
{
|
||||
cat.data[0] = 0;
|
||||
cat.data[1] = 0;
|
||||
}
|
||||
|
||||
inline character_data(_In_ const character_data &othr) :
|
||||
cat (othr.cat),
|
||||
desc (othr.desc),
|
||||
terms (othr.terms),
|
||||
terms_rel(othr.terms_rel),
|
||||
rel (othr.rel)
|
||||
{
|
||||
}
|
||||
|
||||
ZRCola::chrcatid_t cat; ///< Category ID
|
||||
std::wstring desc; ///< Character description
|
||||
std::set<std::wstring> terms; ///< Search terms
|
||||
std::set<std::wstring> terms_rel; ///< Relevant terms for relating characters
|
||||
std::vector<wchar_t> rel; ///< Related characters (zero-delimited)
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Character
|
||||
///
|
||||
class character {
|
||||
public:
|
||||
inline character()
|
||||
{
|
||||
chr = 0;
|
||||
cat.data[0] = 0;
|
||||
cat.data[1] = 0;
|
||||
}
|
||||
|
||||
inline character(_In_ const character &othr) :
|
||||
chr (othr.chr),
|
||||
cat (othr.cat),
|
||||
desc (othr.desc),
|
||||
terms(othr.terms),
|
||||
rel (othr.rel)
|
||||
{
|
||||
}
|
||||
|
||||
inline bool operator==(_In_ const character &othr) const
|
||||
{
|
||||
return
|
||||
chr == othr.chr &&
|
||||
cat == othr.cat &&
|
||||
desc == othr.desc &&
|
||||
terms == othr.terms &&
|
||||
rel == othr.rel;
|
||||
}
|
||||
|
||||
inline bool operator!=(_In_ const character &othr) const
|
||||
{
|
||||
return !operator==(othr);
|
||||
}
|
||||
|
||||
wchar_t chr; ///< Character
|
||||
ZRCola::chrcatid_t cat; ///< Category ID
|
||||
std::wstring desc; ///< Character description
|
||||
std::set<std::wstring> terms; ///< Search terms
|
||||
std::wstring rel; ///< Related characters
|
||||
};
|
||||
typedef std::pair<std::wstring, character_data> character;
|
||||
|
||||
|
||||
///
|
||||
/// Character bank
|
||||
///
|
||||
class character_bank : public std::vector<std::unique_ptr<character> >
|
||||
class character_bank : public std::map<std::wstring, character_data>
|
||||
{
|
||||
public:
|
||||
character_bank();
|
||||
void build_related();
|
||||
|
||||
protected:
|
||||
class build_related_worker : public winstd::win_handle
|
||||
{
|
||||
public:
|
||||
build_related_worker(_In_ const character_bank *cb, _In_ size_type from, _In_ size_type to);
|
||||
build_related_worker(_In_ const character_bank *cb, _In_ iterator from, _In_ iterator to);
|
||||
|
||||
inline void join()
|
||||
{
|
||||
@@ -230,12 +226,9 @@ namespace ZRCola {
|
||||
|
||||
protected:
|
||||
const character_bank *m_cb;
|
||||
size_type m_from, m_to;
|
||||
iterator m_from, m_to;
|
||||
winstd::heap m_heap;
|
||||
};
|
||||
|
||||
protected:
|
||||
std::set<std::wstring> m_ignore;
|
||||
};
|
||||
|
||||
|
||||
@@ -266,8 +259,8 @@ namespace ZRCola {
|
||||
{
|
||||
public:
|
||||
static void parse_keywords(const wchar_t *str, std::set<std::wstring> &terms);
|
||||
void add_keywords(const std::set<std::wstring> &terms, wchar_t chr, size_t sub = 0);
|
||||
inline void add_keywords(const wchar_t *str, wchar_t chr, size_t sub = 0)
|
||||
void add_keywords(const std::set<std::wstring> &terms, const std::wstring &chr, size_t sub = 0);
|
||||
inline void add_keywords(const wchar_t *str, const std::wstring &chr, size_t sub = 0)
|
||||
{
|
||||
std::set<std::wstring> terms;
|
||||
parse_keywords(str, terms);
|
||||
@@ -277,21 +270,21 @@ namespace ZRCola {
|
||||
void save(ZRCola::textindex<wchar_t, wchar_t, unsigned __int32> &idx) const;
|
||||
|
||||
protected:
|
||||
inline void add_keyword(const std::wstring &term, wchar_t chr)
|
||||
inline void add_keyword(const std::wstring &term, const std::wstring &chr)
|
||||
{
|
||||
iterator idx = find(term);
|
||||
if (idx == end()) {
|
||||
// New keyword.
|
||||
insert(std::make_pair(term, std::vector<wchar_t>(1, chr)));
|
||||
insert(std::make_pair(term, mapped_type(chr.data(), chr.data() + chr.length() + 1)));
|
||||
} else {
|
||||
// Append to existing keyword.
|
||||
std::vector<wchar_t> &val = idx->second;
|
||||
for (auto i = val.cbegin(), i_end = val.cend(); ; ++i) {
|
||||
if (i == i_end) {
|
||||
auto &val = idx->second;
|
||||
for (mapped_type::size_type i = 0, n = val.size(); ; i += wcsnlen(val.data() + i, n - i) + 1) {
|
||||
if (i >= n) {
|
||||
// End-of-values reached. Append character.
|
||||
val.push_back(chr);
|
||||
val.insert(val.end(), chr.data(), chr.data() + chr.length() + 1);
|
||||
break;
|
||||
} else if (*i == chr) {
|
||||
} else if (chr.compare(val.data() + i) == 0) {
|
||||
// Character already among the values.
|
||||
break;
|
||||
}
|
||||
@@ -306,9 +299,9 @@ namespace ZRCola {
|
||||
///
|
||||
class chrcat {
|
||||
public:
|
||||
ZRCola::chrcatid_t id; ///> Category ID
|
||||
int rank; ///< Character category rank
|
||||
std::wstring name; ///< Character category name
|
||||
ZRCola::chrcatid_t cat; ///> Category ID
|
||||
int rank; ///< Rank
|
||||
std::wstring name; ///< Name
|
||||
};
|
||||
|
||||
|
||||
@@ -317,7 +310,7 @@ namespace ZRCola {
|
||||
///
|
||||
class chrtag {
|
||||
public:
|
||||
wchar_t chr; ///> Character
|
||||
std::wstring chr; ///> Character
|
||||
int tag; ///< Tag ID
|
||||
};
|
||||
|
||||
@@ -499,6 +492,18 @@ namespace ZRCola {
|
||||
///
|
||||
bool SelectTranslations(winstd::com_obj<ADORecordset>& 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<ADORecordset>& rs) const;
|
||||
|
||||
///
|
||||
/// Returns translation data
|
||||
///
|
||||
@@ -511,6 +516,29 @@ namespace ZRCola {
|
||||
///
|
||||
bool GetTranslation(const winstd::com_obj<ADORecordset>& 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<ADORecordset>& 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<ADORecordset>& rs, transet& ts) const;
|
||||
|
||||
///
|
||||
/// Returns key sequences
|
||||
///
|
||||
@@ -697,10 +725,212 @@ namespace ZRCola {
|
||||
|
||||
protected:
|
||||
std::basic_string<TCHAR> m_filename; ///< Database filename
|
||||
winstd::com_obj<ADOConnection> m_db; ///< Database
|
||||
winstd::com_obj<ADOConnection> m_db; ///< Database
|
||||
_locale_t m_locale; ///< Database locale
|
||||
|
||||
winstd::com_obj<ADOCommand> m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery
|
||||
winstd::com_obj<ADOParameter> m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter
|
||||
winstd::com_obj<ADOCommand> m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery
|
||||
winstd::com_obj<ADOParameter> m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter
|
||||
|
||||
winstd::com_obj<ADOCommand> m_comTranslation; ///< ADO Command for SelectTranslations subquery
|
||||
winstd::com_obj<ADOParameter> m_pTranslation1; ///< \c m_comTranslations parameter
|
||||
|
||||
std::set<std::wstring> m_terms_ignore; ///< Terms to ignore when comparing characters
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
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 index 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);
|
||||
wxASSERT_MSG((int)0xffff8000 <= rec.src.rank && rec.src.rank <= (int)0x00007fff, wxT("source character rank out of bounds"));
|
||||
db.data.push_back((unsigned __int16)rec.src.rank);
|
||||
std::wstring::size_type n = rec.dst.str.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("destination overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
n += rec.src.str.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("source overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.dst.str.cbegin(), rec.dst.str.cend());
|
||||
db.data.insert(db.data.end(), rec.src.str.cbegin(), rec.src.str.cend());
|
||||
db.idxSrc.push_back(idx);
|
||||
db.idxDst.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
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 index 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"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
n += rec.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(), rec.src.cbegin(), rec.src.cend());
|
||||
db.data.insert(db.data.end(), rec.dst.cbegin(), rec.dst.cend());
|
||||
db.idxTranSet.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::keyseq_db& operator<<(_Inout_ ZRCola::keyseq_db &db, _In_ const ZRCola::DBSource::keyseq &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
std::wstring::size_type n = rec.chr.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
n += rec.seq.size() * sizeof(ZRCola::keyseq_db::keyseq::key_t) / sizeof(wchar_t);
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("key sequence overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
|
||||
for (auto kc = rec.seq.cbegin(), kc_end = rec.seq.cend(); kc != kc_end; ++kc) {
|
||||
db.data.push_back(kc->key);
|
||||
db.data.push_back(
|
||||
(kc->shift ? ZRCola::keyseq_db::keyseq::SHIFT : 0) |
|
||||
(kc->ctrl ? ZRCola::keyseq_db::keyseq::CTRL : 0) |
|
||||
(kc->alt ? ZRCola::keyseq_db::keyseq::ALT : 0));
|
||||
}
|
||||
db.idxChr.push_back(idx);
|
||||
db.idxKey.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::language_db& operator<<(_Inout_ ZRCola::language_db &db, _In_ const ZRCola::DBSource::language &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.insert(db.data.end(), reinterpret_cast<const unsigned __int16*>(&rec.lang), reinterpret_cast<const unsigned __int16*>(&rec.lang + 1));
|
||||
std::wstring::size_type n = rec.name.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("language name overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.name.cbegin(), rec.name.cend());
|
||||
db.idxLang.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::langchar_db& operator<<(_Inout_ ZRCola::langchar_db &db, _In_ const ZRCola::DBSource::langchar &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.insert(db.data.end(), reinterpret_cast<const unsigned __int16*>(&rec.lang), reinterpret_cast<const unsigned __int16*>(&rec.lang + 1));
|
||||
std::wstring::size_type n = rec.chr.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
|
||||
db.idxChr .push_back(idx);
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
db.idxLang.push_back(idx);
|
||||
#endif
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::chrgrp_db& operator<<(_Inout_ ZRCola::chrgrp_db &db, _In_ const ZRCola::DBSource::chrgrp &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
wxASSERT_MSG((int)0xffff8000 <= rec.grp && rec.grp <= (int)0x00007fff, wxT("character group ID out of bounds"));
|
||||
db.data.push_back((unsigned __int16)rec.grp);
|
||||
wxASSERT_MSG((int)0xffff8000 <= rec.rank && rec.rank <= (int)0x00007fff, wxT("character group rank out of bounds"));
|
||||
db.data.push_back((unsigned __int16)rec.rank);
|
||||
std::wstring::size_type n = rec.name.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character group name overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
n += rec.chars.size();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character group characters overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.name .cbegin(), rec.name .cend());
|
||||
db.data.insert(db.data.end(), rec.chars.cbegin(), rec.chars.cend());
|
||||
db.data.insert(db.data.end(), rec.show .cbegin(), rec.show .cend());
|
||||
db.idxRank.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::character_db& operator<<(_Inout_ ZRCola::character_db &db, _In_ const ZRCola::DBSource::character &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.insert(db.data.end(), reinterpret_cast<const unsigned __int16*>(&rec.second.cat), reinterpret_cast<const unsigned __int16*>(&rec.second.cat + 1));
|
||||
std::wstring::size_type n = rec.first.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
n += rec.second.desc.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character description overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
n += rec.second.rel.size();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("related characters overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.first .cbegin(), rec.first .cend());
|
||||
db.data.insert(db.data.end(), rec.second.desc.cbegin(), rec.second.desc.cend());
|
||||
db.data.insert(db.data.end(), rec.second.rel .cbegin(), rec.second.rel .cend());
|
||||
db.idxChr.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::chrcat_db& operator<<(_Inout_ ZRCola::chrcat_db &db, _In_ const ZRCola::DBSource::chrcat &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.insert(db.data.end(), reinterpret_cast<const unsigned __int16*>(&rec.cat), reinterpret_cast<const unsigned __int16*>(&rec.cat + 1));
|
||||
wxASSERT_MSG((int)0xffff8000 <= rec.rank && rec.rank <= (int)0x00007fff, wxT("character category rank out of bounds"));
|
||||
db.data.push_back((unsigned __int16)rec.rank);
|
||||
std::wstring::size_type n = rec.name.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character category name overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.name.cbegin(), rec.name.cend());
|
||||
db.idxChrCat.push_back(idx);
|
||||
db.idxRank .push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::chrtag_db& operator<<(_Inout_ ZRCola::chrtag_db &db, _In_ const ZRCola::DBSource::chrtag &rec)
|
||||
{
|
||||
unsigned __int32 idx = db.data.size();
|
||||
wxASSERT_MSG((int)0xffff8000 <= rec.tag && rec.tag <= (int)0x00007fff, wxT("tag out of bounds"));
|
||||
db.data.push_back((unsigned __int16)rec.tag);
|
||||
std::wstring::size_type n = rec.chr.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
|
||||
db.idxChr.push_back(idx);
|
||||
db.idxTag.push_back(idx);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
|
||||
inline ZRCola::tagname_db& operator<<(_Inout_ ZRCola::tagname_db &db, _In_ const ZRCola::DBSource::tagname &rec)
|
||||
{
|
||||
for (auto ln = rec.names.cbegin(), ln_end = rec.names.cend(); ln != ln_end; ++ln) {
|
||||
for (auto nm = ln->second.cbegin(), nm_end = ln->second.cend(); nm != nm_end; ++nm) {
|
||||
unsigned __int32 idx = db.data.size();
|
||||
wxASSERT_MSG((int)0xffff8000 <= rec.tag && rec.tag <= (int)0x00007fff, wxT("tag out of bounds"));
|
||||
db.data.push_back((unsigned __int16)rec.tag);
|
||||
db.data.push_back(LOWORD(ln->first));
|
||||
db.data.push_back(HIWORD(ln->first));
|
||||
std::wstring::size_type n = nm->length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("tag name overflow"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
db.data.insert(db.data.end(), nm->cbegin(), nm->cend());
|
||||
db.idxName.push_back(idx);
|
||||
db.idxTag .push_back(idx);
|
||||
}
|
||||
}
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
@@ -24,48 +24,71 @@ using namespace stdex;
|
||||
using namespace winstd;
|
||||
|
||||
|
||||
typedef map<wchar_t, set<ZRCola::DBSource::charseq, ZRCola::DBSource::charseq::less_rank_str> > translation_db;
|
||||
///
|
||||
/// (destination character rank, (source character rank, source character)) data holder
|
||||
///
|
||||
typedef pair<int, ZRCola::DBSource::charseq> com_translation;
|
||||
|
||||
|
||||
static set<wstring> decompose(_In_ const translation_db &db, _In_z_ const wchar_t *str, _Inout_ set<wchar_t> &path)
|
||||
///
|
||||
/// Functor to compare two translations
|
||||
///
|
||||
struct translation_set_less {
|
||||
inline bool operator()(_In_ const com_translation& a, _In_ const com_translation& b) const
|
||||
{
|
||||
if (a.first < b.first ) return true;
|
||||
else if (a.first > b.first ) return false;
|
||||
else if (a.second.rank < b.second.rank) return true;
|
||||
else if (a.second.rank > b.second.rank) return false;
|
||||
else if (a.second.str < b.second.str ) return true;
|
||||
else return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
typedef map<wstring, set<com_translation, translation_set_less> > translation_db;
|
||||
|
||||
|
||||
static set<wstring> translate_inv(_In_ const translation_db &db, _In_z_ const wchar_t *str, _Inout_ set<translation_db::key_type> &path)
|
||||
{
|
||||
set<wstring> res;
|
||||
|
||||
if (*str) {
|
||||
// Decompose remainder first.
|
||||
auto rem = decompose(db, str + 1, path);
|
||||
// Inverse translate remainder first.
|
||||
auto rem = translate_inv(db, str + 1, path);
|
||||
if (rem.empty())
|
||||
return res;
|
||||
|
||||
auto const t = db.find(*str);
|
||||
translation_db::key_type _str(1, *str);
|
||||
auto const t = db.find(_str);
|
||||
if (t != db.end()) {
|
||||
// Current characted decomposed. Iterate all possible decompositions and combine them with the remainder.
|
||||
auto p = path.insert(*str);
|
||||
// Current characted inverse translated. Iterate all possible inverse translations and combine them with the remainder.
|
||||
auto p = path.insert(_str);
|
||||
if (!p.second) {
|
||||
// Path already contains this character: Cycle detected!
|
||||
return res;
|
||||
}
|
||||
for (auto d = t->second.cbegin(), d_end = t->second.cend(); d != d_end; ++d) {
|
||||
auto dec = decompose(db, d->str.c_str(), path);
|
||||
if (!dec.empty()) {
|
||||
for (auto dd = dec.cbegin(), dd_end = dec.cend(); dd != dd_end; ++dd) {
|
||||
auto src = translate_inv(db, d->second.str.c_str(), path);
|
||||
if (!src.empty()) {
|
||||
for (auto dd = src.cbegin(), dd_end = src.cend(); dd != dd_end; ++dd) {
|
||||
for (auto r = rem.cbegin(), r_end = rem.cend(); r != r_end; ++r)
|
||||
res.insert(*dd + *r);
|
||||
}
|
||||
} else {
|
||||
// Cycle detected. Do not continue decomposition.
|
||||
// Cycle detected. Do not continue inverse translation.
|
||||
for (auto r = rem.cbegin(), r_end = rem.cend(); r != r_end; ++r)
|
||||
res.insert(wstring(1, *str) + *r);
|
||||
res.insert(_str + *r);
|
||||
}
|
||||
}
|
||||
path.erase(p.first);
|
||||
} else {
|
||||
// Current character is non-decomposable. Combine it with the remainder(s).
|
||||
// Current character is non-inverse translatable. Combine it with the remainder(s).
|
||||
for (auto r = rem.cbegin(), r_end = rem.cend(); r != r_end; ++r)
|
||||
res.insert(wstring(1, *str) + *r);
|
||||
res.insert(_str + *r);
|
||||
}
|
||||
} else {
|
||||
// Empty string results in empty decomposition.
|
||||
// Empty string results in empty inverse translation.
|
||||
res.insert(L"");
|
||||
}
|
||||
|
||||
@@ -151,6 +174,8 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
// Open file ID.
|
||||
streamoff dst_start = idrec::open<ZRCola::recordid_t, ZRCola::recordsize_t>(dst, ZRCOLA_DB_ID);
|
||||
|
||||
ZRCola::translation_db db_trans;
|
||||
|
||||
{
|
||||
// Get translations.
|
||||
com_obj<ADORecordset> rs;
|
||||
@@ -164,72 +189,59 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
ZRCola::DBSource::translation trans;
|
||||
if (src.GetTranslation(rs, trans)) {
|
||||
// Add translation to temporary database.
|
||||
auto const t = db_temp1.find(trans.chr);
|
||||
auto const t = db_temp1.find(trans.dst.str);
|
||||
if (t != db_temp1.end())
|
||||
t->second.insert(std::move(trans.decomp));
|
||||
t->second.insert(com_translation(trans.dst.rank, std::move(trans.src)));
|
||||
else {
|
||||
translation_db::mapped_type d;
|
||||
d.insert(std::move(trans.decomp));
|
||||
db_temp1.insert(std::move(pair<translation_db::key_type, translation_db::mapped_type>(trans.chr, std::move(d))));
|
||||
d.insert(com_translation(trans.dst.rank, std::move(trans.src)));
|
||||
db_temp1.insert(std::move(pair<translation_db::key_type, translation_db::mapped_type>(trans.dst.str, std::move(d))));
|
||||
}
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Decompose decompositions down to non-decomposable characters.
|
||||
// Inverse translate source sequences down to non-inverse translatable characters.
|
||||
translation_db db_temp2;
|
||||
for (auto t1 = db_temp1.cbegin(), t1_end = db_temp1.cend(); t1 != t1_end; ++t1) {
|
||||
for (auto d1 = t1->second.cbegin(), d1_end = t1->second.cend(); d1 != d1_end; ++d1) {
|
||||
set<wchar_t> path;
|
||||
set<translation_db::key_type> path;
|
||||
path.insert(t1->first);
|
||||
auto str = decompose(db_temp1, d1->str.c_str(), path);
|
||||
auto str = translate_inv(db_temp1, d1->second.str.c_str(), path);
|
||||
assert(!str.empty());
|
||||
|
||||
// Add translation to temporary database.
|
||||
auto const t2 = db_temp2.find(t1->first);
|
||||
if (t2 != db_temp2.end()) {
|
||||
for (auto s = str.cbegin(), s_end = str.cend(); s != s_end; ++s)
|
||||
t2->second.insert(std::move(ZRCola::DBSource::charseq(d1->rank, s->c_str())));
|
||||
t2->second.insert(com_translation(d1->first, std::move(ZRCola::DBSource::charseq(d1->second.rank, s->c_str()))));
|
||||
} else {
|
||||
translation_db::mapped_type d2;
|
||||
for (auto s = str.cbegin(), s_end = str.cend(); s != s_end; ++s)
|
||||
d2.insert(std::move(ZRCola::DBSource::charseq(d1->rank, s->c_str())));
|
||||
d2.insert(com_translation(d1->first, std::move(ZRCola::DBSource::charseq(d1->second.rank, s->c_str()))));
|
||||
db_temp2.insert(std::move(pair<translation_db::key_type, translation_db::mapped_type>(t1->first, std::move(d2))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ZRCola::translation_db db;
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxComp .reserve(count);
|
||||
db.idxDecomp.reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
db_trans.idxSrc.reserve(count);
|
||||
db_trans.idxDst.reserve(count);
|
||||
db_trans.data .reserve(count*5);
|
||||
|
||||
// Parse translations and build index and data.
|
||||
ZRCola::DBSource::translation trans;
|
||||
trans.set = 0;
|
||||
for (auto t = db_temp2.cbegin(), t_end = db_temp2.cend(); t != t_end; ++t) {
|
||||
// Add translation to index and data.
|
||||
trans.dst.str = std::move(t->first);
|
||||
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(t->first);
|
||||
wxASSERT_MSG((int)0xffff8000 <= d->rank && d->rank <= (int)0x00007fff, wxT("transformation rank out of bounds"));
|
||||
db.data.push_back((unsigned __int16)d->rank);
|
||||
wstring::size_type n = d->str.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("transformation string too long"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
for (wstring::size_type i = 0; i < n; i++)
|
||||
db.data.push_back(d->str[i]);
|
||||
db.idxComp .push_back(idx);
|
||||
db.idxDecomp.push_back(idx);
|
||||
trans.dst.rank = d->first;
|
||||
trans.src.rank = d->second.rank;
|
||||
trans.src.str = std::move(d->second.str);
|
||||
db_trans << trans;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort indices.
|
||||
db.idxComp .sort();
|
||||
db.idxDecomp.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;
|
||||
@@ -240,6 +252,91 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
// Get translation sets.
|
||||
com_obj<ADORecordset> 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.set = 0;
|
||||
ts.src = L"ZRCola Decomposed";
|
||||
ts.dst = L"ZRCola Composed";
|
||||
db << ts;
|
||||
if (build_pot) {
|
||||
pot.insert(ts.src);
|
||||
pot.insert(ts.dst);
|
||||
}
|
||||
|
||||
// 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.
|
||||
db << ts;
|
||||
|
||||
// Get translations.
|
||||
com_obj<ADORecordset> rs_tran;
|
||||
if (src.SelectTranslations(ts.set, 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.
|
||||
ZRCola::DBSource::translation trans;
|
||||
trans.set = ts.set;
|
||||
for (; !ZRCola::DBSource::IsEOF(rs_tran); rs_tran->MoveNext()) {
|
||||
// Read translation from the database.
|
||||
if (src.GetTranslation(rs_tran, trans)) {
|
||||
// Add translation to index and data.
|
||||
db_trans << trans;
|
||||
} 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<ADORecordset> rs;
|
||||
@@ -259,21 +356,7 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
// Read key sequence from the database.
|
||||
if (src.GetKeySequence(rs, ks)) {
|
||||
// Add key sequence to index and data.
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.push_back(ks.chr);
|
||||
vector<ZRCola::DBSource::keyseq::keycode>::size_type n = ks.seq.size();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("key sequence too long"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
for (vector<ZRCola::DBSource::keyseq::keycode>::size_type i = 0; i < n; i++) {
|
||||
const ZRCola::DBSource::keyseq::keycode &kc = ks.seq[i];
|
||||
db.data.push_back(kc.key);
|
||||
db.data.push_back(
|
||||
(kc.shift ? ZRCola::keyseq_db::keyseq::SHIFT : 0) |
|
||||
(kc.ctrl ? ZRCola::keyseq_db::keyseq::CTRL : 0) |
|
||||
(kc.alt ? ZRCola::keyseq_db::keyseq::ALT : 0));
|
||||
}
|
||||
db.idxChr.push_back(idx);
|
||||
db.idxKey.push_back(idx);
|
||||
db << ks;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
@@ -288,10 +371,14 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
&ks1 = db.idxKey[i - 1],
|
||||
&ks2 = db.idxKey[i ];
|
||||
|
||||
if (ZRCola::keyseq_db::keyseq::CompareSequence(ks1.seq, ks1.seq_len, ks2.seq, ks2.seq_len) == 0) {
|
||||
if (ZRCola::keyseq_db::keyseq::CompareSequence(ks1.seq(), ks1.seq_len(), ks2.seq(), ks2.seq_len()) == 0) {
|
||||
wxString seq_str;
|
||||
ZRCola::keyseq_db::GetSequenceAsText(ks1.seq, ks1.seq_len, seq_str);
|
||||
_ftprintf(stderr, wxT("%s: warning ZCC0007: Duplicate key sequence (%ls => %04X or %04X). The keyboard behaviour will be unpredictable.\n"), (LPCTSTR)filenameIn.c_str(), seq_str.c_str(), ks1.chr, ks2.chr);
|
||||
ZRCola::keyseq_db::GetSequenceAsText(ks1.seq(), ks1.seq_len(), seq_str);
|
||||
_ftprintf(stderr, wxT("%s: warning ZCC0007: Duplicate key sequence (%ls => %s or %s). The keyboard behaviour will be unpredictable.\n"),
|
||||
(LPCTSTR)filenameIn.c_str(),
|
||||
seq_str.c_str(),
|
||||
ZRCola::GetUnicodeDump(ks1.chr(), ks1.chr_len()).c_str(),
|
||||
ZRCola::GetUnicodeDump(ks2.chr(), ks2.chr_len()).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -317,8 +404,8 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
ZRCola::language_db db;
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxLng.reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
db.idxLang.reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
|
||||
// Parse languages and build index and data.
|
||||
for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) {
|
||||
@@ -328,21 +415,13 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
pot.insert(lang.name);
|
||||
|
||||
// Add language to index and data.
|
||||
unsigned __int32 idx = db.data.size();
|
||||
for (wstring::size_type i = 0; i < sizeof(ZRCola::langid_t)/sizeof(unsigned __int16); i++)
|
||||
db.data.push_back(((const unsigned __int16*)lang.id.data)[i]);
|
||||
wstring::size_type n = lang.name.length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("language name too long"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
for (wstring::size_type i = 0; i < n; i++)
|
||||
db.data.push_back(lang.name[i]);
|
||||
db.idxLng.push_back(idx);
|
||||
db << lang;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Sort indices.
|
||||
db.idxLng.sort();
|
||||
db.idxLang.sort();
|
||||
|
||||
// Write languages to file.
|
||||
dst << ZRCola::language_rec(db);
|
||||
@@ -366,25 +445,18 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
ZRCola::langchar_db db;
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxChr.reserve(count);
|
||||
db.idxChr .reserve(count);
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
db.idxLng.reserve(count);
|
||||
db.idxLang.reserve(count);
|
||||
#endif
|
||||
db.data .reserve(count*4);
|
||||
db.data .reserve(count*4);
|
||||
|
||||
// Parse language characters and build index and data.
|
||||
for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) {
|
||||
// Read language characters from the database.
|
||||
if (src.GetLanguageCharacter(rs, lc)) {
|
||||
// Add language characters to index and data.
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.push_back(lc.chr);
|
||||
for (wstring::size_type i = 0; i < sizeof(ZRCola::langid_t)/sizeof(unsigned __int16); i++)
|
||||
db.data.push_back(((const unsigned __int16*)lc.lang.data)[i]);
|
||||
db.idxChr.push_back(idx);
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
db.idxLng.push_back(idx);
|
||||
#endif
|
||||
db << lc;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
@@ -392,7 +464,7 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
// Sort indices.
|
||||
db.idxChr .sort();
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
db.idxLng.sort();
|
||||
db.idxLang.sort();
|
||||
#endif
|
||||
|
||||
// Write language characters to file.
|
||||
@@ -417,8 +489,8 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
ZRCola::chrgrp_db db;
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxRnk.reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
db.idxRank.reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
|
||||
// Parse character groups and build index and data.
|
||||
for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) {
|
||||
@@ -433,30 +505,13 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
}
|
||||
|
||||
// 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);
|
||||
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);
|
||||
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 (wstring::size_type i = 0; i < n_name; i++)
|
||||
db.data.push_back(cg.name[i]);
|
||||
for (wstring::size_type i = 0; i < n_char; i++)
|
||||
db.data.push_back(cg.chars[i]);
|
||||
for (std::vector<unsigned __int16>::size_type i = 0, n = cg.show.size(); i < n; i++)
|
||||
db.data.push_back(cg.show[i]);
|
||||
db.idxRnk.push_back(idx);
|
||||
db << cg;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Sort indices.
|
||||
db.idxRnk.sort();
|
||||
db.idxRank.sort();
|
||||
|
||||
// Write character groups to file.
|
||||
dst << ZRCola::chrgrp_rec(db);
|
||||
@@ -481,15 +536,14 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
ZRCola::DBSource::character_desc_idx idxChrDsc, idxChrDscSub;
|
||||
|
||||
ZRCola::DBSource::character_bank chrs;
|
||||
ZRCola::DBSource::character chr;
|
||||
|
||||
// Phase 1: Parse characters and build indexes.
|
||||
for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) {
|
||||
// Read character from the database.
|
||||
unique_ptr<ZRCola::DBSource::character> c(new ZRCola::DBSource::character);
|
||||
if (src.GetCharacter(rs, *c)) {
|
||||
const auto &chr = *c.get();
|
||||
chrs[chr.chr].swap(c);
|
||||
} else
|
||||
if (src.GetCharacter(rs, chr))
|
||||
chrs[chr.first] = std::move(chr.second);
|
||||
else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
@@ -503,33 +557,16 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
db.data .reserve(count*4);
|
||||
|
||||
// Phase 3: Parse characters and build index and data.
|
||||
for (size_t i = 0, i_end = chrs.size(); i < i_end; i++) {
|
||||
const auto &chr = *(chrs[i].get());
|
||||
if (&chr == NULL) continue;
|
||||
|
||||
for (auto chr = chrs.cbegin(), chr_end = chrs.cend(); chr != chr_end; ++chr) {
|
||||
// Add character to index and data.
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.push_back((unsigned __int16)chr.chr);
|
||||
for (wstring::size_type i = 0; i < sizeof(ZRCola::chrcatid_t)/sizeof(unsigned __int16); i++)
|
||||
db.data.push_back(((const unsigned __int16*)chr.cat.data)[i]);
|
||||
wstring::size_type n_desc = chr.desc.length();
|
||||
wxASSERT_MSG(n_desc <= 0xffff, wxT("character description too long"));
|
||||
db.data.push_back((unsigned __int16)n_desc);
|
||||
wstring::size_type n_rel = chr.rel.length();
|
||||
wxASSERT_MSG(n_rel <= 0xffff, wxT("too many related characters"));
|
||||
db.data.push_back((unsigned __int16)n_rel);
|
||||
for (wstring::size_type i = 0; i < n_desc; i++)
|
||||
db.data.push_back(chr.desc[i]);
|
||||
for (wstring::size_type i = 0; i < n_rel; i++)
|
||||
db.data.push_back(chr.rel[i]);
|
||||
db.idxChr.push_back(idx);
|
||||
db << *chr;
|
||||
|
||||
// Add description (and keywords) to index.
|
||||
idxChrDsc .add_keywords(chr.terms, chr.chr, 0);
|
||||
idxChrDscSub.add_keywords(chr.terms, chr.chr, 3);
|
||||
idxChrDsc .add_keywords(chr->second.terms, chr->first, 0);
|
||||
idxChrDscSub.add_keywords(chr->second.terms, chr->first, 3);
|
||||
|
||||
// Mark category used.
|
||||
categories_used.insert(chr.cat);
|
||||
categories_used.insert(chr->second.cat);
|
||||
}
|
||||
|
||||
// Sort indices.
|
||||
@@ -562,7 +599,7 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxChrCat.reserve(count);
|
||||
db.idxRnk .reserve(count);
|
||||
db.idxRank .reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
|
||||
// Parse character categories and build index and data.
|
||||
@@ -572,31 +609,20 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
if (build_pot)
|
||||
pot.insert(cc.name);
|
||||
|
||||
if (categories_used.find(cc.id) == categories_used.end()) {
|
||||
if (categories_used.find(cc.cat) == categories_used.end()) {
|
||||
// Skip empty character categories.
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add character category to index and data.
|
||||
unsigned __int32 idx = db.data.size();
|
||||
for (wstring::size_type i = 0; i < sizeof(ZRCola::chrcatid_t)/sizeof(unsigned __int16); i++)
|
||||
db.data.push_back(((const unsigned __int16*)cc.id.data)[i]);
|
||||
wxASSERT_MSG((int)0xffff8000 <= cc.rank && cc.rank <= (int)0x00007fff, wxT("character category rank out of bounds"));
|
||||
db.data.push_back((unsigned __int16)cc.rank);
|
||||
wstring::size_type n_name = cc.name.length();
|
||||
wxASSERT_MSG(n_name <= 0xffff, wxT("character category name too long"));
|
||||
db.data.push_back((unsigned __int16)n_name);
|
||||
for (wstring::size_type i = 0; i < n_name; i++)
|
||||
db.data.push_back(cc.name[i]);
|
||||
db.idxChrCat.push_back(idx);
|
||||
db.idxRnk .push_back(idx);
|
||||
db << cc;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Sort indices.
|
||||
db.idxChrCat.sort();
|
||||
db.idxRnk .sort();
|
||||
db.idxRank .sort();
|
||||
|
||||
// Write character categories to file.
|
||||
dst << ZRCola::chrcat_rec(db);
|
||||
@@ -629,18 +655,13 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
// Read characters tags from the database.
|
||||
if (src.GetCharacterTag(rs, ct)) {
|
||||
// Add characters tags to index and data.
|
||||
unsigned __int32 idx = db.data.size();
|
||||
db.data.push_back(ct.chr);
|
||||
wxASSERT_MSG((int)0xffff8000 <= ct.tag && ct.tag <= (int)0x00007fff, wxT("tag out of bounds"));
|
||||
db.data.push_back((unsigned __int16)ct.tag);
|
||||
db.idxChr.push_back(idx);
|
||||
db.idxTag.push_back(idx);
|
||||
db << ct;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Sort indices.
|
||||
db.idxChr .sort();
|
||||
db.idxChr.sort();
|
||||
db.idxTag.sort();
|
||||
|
||||
// Write characters tags to file.
|
||||
@@ -674,22 +695,7 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
// Read tag name from the database.
|
||||
if (src.GetTagName(rs, tn)) {
|
||||
// Add tag name to index and data.
|
||||
for (auto ln = tn.names.cbegin(), ln_end = tn.names.cend(); ln != ln_end; ++ln) {
|
||||
for (auto nm = ln->second.cbegin(), nm_end = ln->second.cend(); nm != nm_end; ++nm) {
|
||||
unsigned __int32 idx = db.data.size();
|
||||
wxASSERT_MSG((int)0xffff8000 <= tn.tag && tn.tag <= (int)0x00007fff, wxT("tag out of bounds"));
|
||||
db.data.push_back((unsigned __int16)tn.tag);
|
||||
db.data.push_back(LOWORD(ln->first));
|
||||
db.data.push_back(HIWORD(ln->first));
|
||||
wstring::size_type n = nm->length();
|
||||
wxASSERT_MSG(n <= 0xffff, wxT("tag name too long"));
|
||||
db.data.push_back((unsigned __int16)n);
|
||||
for (wstring::size_type i = 0; i < n; i++)
|
||||
db.data.push_back(nm->at(i));
|
||||
db.idxName.push_back(idx);
|
||||
db.idxTag .push_back(idx);
|
||||
}
|
||||
}
|
||||
db << tn;
|
||||
} else
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
@@ -22,12 +22,6 @@
|
||||
#include "../include/version.h"
|
||||
#include "dbsource.h"
|
||||
|
||||
#include <zrcola/language.h>
|
||||
#include <zrcola/translate.h>
|
||||
#include <zrcola/tag.h>
|
||||
#include <zrcolaui/chargroup.h>
|
||||
#include <zrcolaui/keyboard.h>
|
||||
|
||||
#include <wx/app.h>
|
||||
#include <wx/cmdline.h>
|
||||
#include <wx/config.h>
|
||||
|
||||
@@ -26,30 +26,10 @@
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<Optimization>Full</Optimization>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
// Product version as a single DWORD
|
||||
// Note: Used for version comparison within C/C++ code.
|
||||
//
|
||||
#define PRODUCT_VERSION 0x02000000
|
||||
#define PRODUCT_VERSION 0x02000100
|
||||
|
||||
//
|
||||
// Product version by components
|
||||
@@ -33,26 +33,26 @@
|
||||
//
|
||||
#define PRODUCT_VERSION_MAJ 2
|
||||
#define PRODUCT_VERSION_MIN 0
|
||||
#define PRODUCT_VERSION_REV 0
|
||||
#define PRODUCT_VERSION_REV 1
|
||||
#define PRODUCT_VERSION_BUILD 0
|
||||
|
||||
//
|
||||
// Human readable product version and build year for UI
|
||||
//
|
||||
#define PRODUCT_VERSION_STR "2.0"
|
||||
#define PRODUCT_BUILD_YEAR_STR "2016"
|
||||
#define PRODUCT_VERSION_STR "2.1-beta1"
|
||||
#define PRODUCT_BUILD_YEAR_STR "2017"
|
||||
|
||||
//
|
||||
// Numerical version presentation for ProductVersion propery in
|
||||
// MSI packages (syntax: N.N[.N[.N]])
|
||||
//
|
||||
#define PRODUCT_VERSION_INST "2.0"
|
||||
#define PRODUCT_VERSION_INST "2.0.1"
|
||||
|
||||
//
|
||||
// The product code for ProductCode property in MSI packages
|
||||
// Replace with new on every version change, regardless how minor it is.
|
||||
//
|
||||
#define PRODUCT_VERSION_GUID "{59833018-A0F9-4C90-B4F3-8B88908BB89A}"
|
||||
#define PRODUCT_VERSION_GUID "{8ABE00FD-2325-4FD1-ADDE-FCF996B31636}"
|
||||
|
||||
//
|
||||
// The product vendor and application name for configuration keeping.
|
||||
|
||||
Submodule lib/WinStd updated: cea06e8f48...feea0fdf2a
@@ -41,6 +41,8 @@ namespace ZRCola {
|
||||
///
|
||||
typedef double charrank_t;
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(2)
|
||||
///
|
||||
/// Character category ID type
|
||||
/// Two letter abbreviation, non-terminated
|
||||
@@ -66,6 +68,7 @@ namespace ZRCola {
|
||||
///
|
||||
static const chrcatid_t blank;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
|
||||
///
|
||||
@@ -180,18 +183,73 @@ namespace ZRCola {
|
||||
/// Character data
|
||||
///
|
||||
struct character {
|
||||
wchar_t chr; ///> Character
|
||||
chrcatid_t cat; ///> Category ID
|
||||
unsigned __int16 desc_len; ///< Character description length in \c data
|
||||
unsigned __int16 rel_len; ///< Related character count in \c data
|
||||
wchar_t data[]; ///< Character description and list of related characters
|
||||
public:
|
||||
chrcatid_t cat; ///> Character category ID
|
||||
|
||||
protected:
|
||||
unsigned __int16 chr_to; ///< Character end in \c data
|
||||
unsigned __int16 desc_to; ///< Character description end in \c data
|
||||
unsigned __int16 rel_to; ///< Related characters end in \c data
|
||||
wchar_t data[]; ///< Character, character description
|
||||
|
||||
private:
|
||||
inline character(_In_ const character &other);
|
||||
inline character& operator=(_In_ const character &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the character
|
||||
///
|
||||
/// \param[in] chr Character
|
||||
/// \param[in] chr_len Number of UTF-16 characters in \p chr
|
||||
/// \param[in] cat Category
|
||||
/// \param[in] desc Description
|
||||
/// \param[in] desc_len Number of UTF-16 characters in \p desc
|
||||
/// \param[in] rel Related characters list (zero delimited)
|
||||
/// \param[in] rel_len Number of UTF-16 characters in \p rel (including zero delimiters)
|
||||
///
|
||||
inline character(
|
||||
_In_opt_z_count_(chr_len) const wchar_t *chr = NULL,
|
||||
_In_opt_ size_t chr_len = 0,
|
||||
_In_opt_ chrcatid_t cat = chrcatid_t::blank,
|
||||
_In_opt_z_count_(desc_len) const wchar_t *desc = NULL,
|
||||
_In_opt_ size_t desc_len = 0,
|
||||
_In_opt_z_count_(rel_len) const wchar_t *rel = NULL,
|
||||
_In_opt_ size_t rel_len = 0)
|
||||
{
|
||||
this->cat = cat;
|
||||
this->chr_to = static_cast<unsigned __int16>(chr_len);
|
||||
if (chr_len) memcpy(this->data, chr, sizeof(wchar_t)*chr_len);
|
||||
this->desc_to = static_cast<unsigned __int16>(this->chr_to + desc_len);
|
||||
if (desc_len) memcpy(this->data + this->chr_to, desc, sizeof(wchar_t)*desc_len);
|
||||
this->rel_to = static_cast<unsigned __int16>(this->desc_to + rel_len);
|
||||
if (rel_len) memcpy(this->data + this->desc_to, rel, sizeof(wchar_t)*rel_len);
|
||||
}
|
||||
|
||||
inline const wchar_t* chr () const { return data; };
|
||||
inline wchar_t* chr () { return data; };
|
||||
inline const wchar_t* chr_end() const { return data + chr_to; };
|
||||
inline wchar_t* chr_end() { return data + chr_to; };
|
||||
inline unsigned __int16 chr_len() const { return chr_to; };
|
||||
|
||||
inline const wchar_t* desc () const { return data + chr_to; };
|
||||
inline wchar_t* desc () { return data + chr_to; };
|
||||
inline const wchar_t* desc_end() const { return data + desc_to; };
|
||||
inline wchar_t* desc_end() { return data + desc_to; };
|
||||
inline unsigned __int16 desc_len() const { return desc_to - chr_to; };
|
||||
|
||||
inline const wchar_t* rel () const { return data + desc_to; };
|
||||
inline wchar_t* rel () { return data + desc_to; };
|
||||
inline const wchar_t* rel_end() const { return data + rel_to; };
|
||||
inline wchar_t* rel_end() { return data + rel_to; };
|
||||
inline unsigned __int16 rel_len() const { return rel_to - desc_to; };
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
///
|
||||
/// Character index
|
||||
///
|
||||
class indexChar : public index<unsigned __int16, unsigned __int32, character>
|
||||
class indexChr : public index<unsigned __int16, unsigned __int32, character>
|
||||
{
|
||||
public:
|
||||
///
|
||||
@@ -199,7 +257,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexChar(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, character>(h) {}
|
||||
indexChr(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, character>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two characters by ID (for searching)
|
||||
@@ -214,8 +272,8 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const character &a, _In_ const character &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -252,23 +310,25 @@ namespace ZRCola {
|
||||
/// \param[in ] fn_abort Pointer to function to periodically test for search cancellation
|
||||
/// \param[in ] cookie Cookie for \p fn_abort call
|
||||
///
|
||||
bool Search(_In_z_ const wchar_t *str, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<wchar_t, charrank_t> &hits, _Inout_ std::map<wchar_t, charrank_t> &hits_sub, _In_opt_ bool (__cdecl *fn_abort)(void *cookie) = NULL, _In_opt_ void *cookie = NULL) const;
|
||||
bool Search(_In_z_ const wchar_t *str, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<std::wstring, charrank_t> &hits, _Inout_ std::map<std::wstring, charrank_t> &hits_sub, _In_opt_ bool (__cdecl *fn_abort)(void *cookie) = NULL, _In_opt_ void *cookie = NULL) const;
|
||||
|
||||
///
|
||||
/// Get character category
|
||||
///
|
||||
/// \param[in] c Character
|
||||
/// \param[in] chr Character
|
||||
/// \param[in] len Number of UTF-16 characters in \p chr
|
||||
///
|
||||
/// \returns
|
||||
/// - Character category if character found
|
||||
/// - `ZRCola::chrcatid_t::blank` otherwise
|
||||
///
|
||||
inline chrcatid_t GetCharCat(wchar_t c) const
|
||||
inline chrcatid_t GetCharCat(_In_z_count_(len) const wchar_t *chr, _In_ const size_t len) const
|
||||
{
|
||||
char _chr[sizeof(character)];
|
||||
((character *)_chr)->chr = c;
|
||||
indexChar::size_type start;
|
||||
return idxChr.find(*((character *)_chr), start) ? idxChr[start].cat : chrcatid_t::blank;
|
||||
assert(len <= 0xffff);
|
||||
std::unique_ptr<character> c((character*)new char[sizeof(character) + sizeof(wchar_t)*len]);
|
||||
c->character::character(chr, len);
|
||||
indexChr::size_type start;
|
||||
return idxChr.find(*c, start) ? idxChr[start].cat : chrcatid_t::blank;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -287,10 +347,44 @@ namespace ZRCola {
|
||||
/// Character category data
|
||||
///
|
||||
struct chrcat {
|
||||
chrcatid_t id; ///< Character category ID
|
||||
unsigned __int16 rank; ///< Character category rank
|
||||
unsigned __int16 name_len; ///< \c name length (in characters)
|
||||
wchar_t name[]; ///< Character category name
|
||||
public:
|
||||
chrcatid_t cat; ///< Character category ID
|
||||
unsigned __int16 rank; ///< Character category rank
|
||||
|
||||
protected:
|
||||
unsigned __int16 name_to; ///< Character category name end in \c data
|
||||
wchar_t data[]; ///< Character category name
|
||||
|
||||
private:
|
||||
inline chrcat(_In_ const chrcat &other);
|
||||
inline chrcat& operator=(_In_ const chrcat &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the character category
|
||||
///
|
||||
/// \param[in] cat Character category ID
|
||||
/// \param[in] rank Character category rank
|
||||
/// \param[in] name Character category name
|
||||
/// \param[in] name_len Number of UTF-16 characters in \p name
|
||||
///
|
||||
inline chrcat(
|
||||
_In_opt_ chrcatid_t cat = chrcatid_t::blank,
|
||||
_In_opt_ unsigned __int16 rank = 0,
|
||||
_In_opt_z_count_(name_len) const wchar_t *name = NULL,
|
||||
_In_opt_ size_t name_len = 0)
|
||||
{
|
||||
this->cat = cat;
|
||||
this->rank = rank;
|
||||
this->name_to = static_cast<unsigned __int16>(name_len);
|
||||
if (name_len) memcpy(this->data, name, sizeof(wchar_t)*name_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; };
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
@@ -320,11 +414,12 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const chrcat &a, _In_ const chrcat &b) const
|
||||
{
|
||||
if (a.id < b.id) return -1;
|
||||
else if (a.id > b.id) return 1;
|
||||
else return 0;
|
||||
if (a.cat < b.cat) return -1;
|
||||
else if (a.cat > b.cat) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxChrCat; ///< Character category index
|
||||
} idxChrCat; ///< Character category index
|
||||
|
||||
///
|
||||
/// Rank index
|
||||
@@ -374,14 +469,17 @@ namespace ZRCola {
|
||||
if (a.rank < b.rank) return -1;
|
||||
else if (a.rank > b.rank) return +1;
|
||||
|
||||
int r = _wcsncoll(a.name, b.name, std::min<unsigned __int16>(a.name_len, b.name_len));
|
||||
unsigned __int16
|
||||
a_name_len = a.name_len(),
|
||||
b_name_len = b.name_len();
|
||||
int r = _wcsncoll(a.name(), b.name(), 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;
|
||||
if (a_name_len < b_name_len) return -1;
|
||||
else if (a_name_len > b_name_len) return +1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxRnk; ///< Rank index
|
||||
} idxRank; ///< Rank index
|
||||
|
||||
std::vector<unsigned __int16> data; ///< Character category data
|
||||
|
||||
@@ -389,7 +487,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// Constructs the database
|
||||
///
|
||||
inline chrcat_db() : idxChrCat(data), idxRnk(data) {}
|
||||
inline chrcat_db() : idxChrCat(data), idxRank(data) {}
|
||||
|
||||
///
|
||||
/// Clears the database
|
||||
@@ -397,7 +495,7 @@ namespace ZRCola {
|
||||
inline void clear()
|
||||
{
|
||||
idxChrCat.clear();
|
||||
idxRnk .clear();
|
||||
idxRank .clear();
|
||||
data .clear();
|
||||
}
|
||||
};
|
||||
@@ -407,8 +505,8 @@ namespace ZRCola {
|
||||
};
|
||||
|
||||
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::character_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"CHR";
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::chrcat_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"CCT";
|
||||
const ZRCola::recordid_t ZRCola::character_rec::id = *(ZRCola::recordid_t*)"CHR";
|
||||
const ZRCola::recordid_t ZRCola::chrcat_rec ::id = *(ZRCola::recordid_t*)"CCT";
|
||||
|
||||
|
||||
///
|
||||
@@ -508,7 +606,7 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::c
|
||||
|
||||
// Write rank index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxRnk;
|
||||
stream << db.idxRank;
|
||||
|
||||
// Write data count.
|
||||
auto data_count = db.data.size();
|
||||
@@ -546,7 +644,7 @@ inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::chrcat
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read rank index.
|
||||
stream >> db.idxRnk;
|
||||
stream >> db.idxRank;
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read data count.
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <sal.h>
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <utility>
|
||||
@@ -58,11 +59,11 @@ namespace ZRCola {
|
||||
typedef unsigned __int32 recordsize_t;
|
||||
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(2)
|
||||
///
|
||||
/// Key-value index pair for mappings
|
||||
///
|
||||
#pragma pack(push)
|
||||
#pragma pack(2)
|
||||
template <class T>
|
||||
struct mappair_t
|
||||
{
|
||||
@@ -72,6 +73,8 @@ namespace ZRCola {
|
||||
#pragma pack(pop)
|
||||
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(2)
|
||||
///
|
||||
/// Language ID type
|
||||
/// Three letter abbreviation, zero terminated
|
||||
@@ -105,6 +108,7 @@ namespace ZRCola {
|
||||
///
|
||||
static const langid_t blank;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
|
||||
///
|
||||
@@ -228,11 +232,11 @@ namespace ZRCola {
|
||||
///
|
||||
/// Memory index
|
||||
///
|
||||
template <class T, class T_idx = unsigned __int32, class T_data = T>
|
||||
template <class T_data, class T_idx = unsigned __int32, class T_el = T_data>
|
||||
class index : public std::vector<T_idx>
|
||||
{
|
||||
protected:
|
||||
std::vector<T> &host; ///< Reference to host data
|
||||
std::vector<T_data> &host; ///< Reference to host data
|
||||
|
||||
public:
|
||||
///
|
||||
@@ -240,7 +244,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
index(_In_ std::vector<T> &h) : host(h) {}
|
||||
index(_In_ std::vector<T_data> &h) : host(h) {}
|
||||
|
||||
|
||||
///
|
||||
@@ -250,9 +254,9 @@ namespace ZRCola {
|
||||
///
|
||||
/// \returns Data reference
|
||||
///
|
||||
inline const T_data& at(size_type pos) const
|
||||
inline const T_el& at(size_type pos) const
|
||||
{
|
||||
return (const T_data&)host.at(std::vector<T_idx>::at(pos));
|
||||
return *reinterpret_cast<const T_el*>(&host[std::vector<T_idx>::at(pos)]);
|
||||
}
|
||||
|
||||
|
||||
@@ -263,9 +267,9 @@ namespace ZRCola {
|
||||
///
|
||||
/// \returns Data reference
|
||||
///
|
||||
inline T_data& at(size_type pos)
|
||||
inline T_el& at(size_type pos)
|
||||
{
|
||||
return (T_data&)host.at(std::vector<T_idx>::at(pos));
|
||||
return *reinterpret_cast<T_el*>(&host[std::vector<T_idx>::at(pos)]);
|
||||
}
|
||||
|
||||
|
||||
@@ -276,9 +280,9 @@ namespace ZRCola {
|
||||
///
|
||||
/// \returns Data reference
|
||||
///
|
||||
inline const T_data& operator[](size_type pos) const
|
||||
inline const T_el& operator[](size_type pos) const
|
||||
{
|
||||
return (const T_data&)host[std::vector<T_idx>::at(pos)];
|
||||
return *reinterpret_cast<const T_el*>(&host[std::vector<T_idx>::operator[](pos)]);
|
||||
}
|
||||
|
||||
|
||||
@@ -289,9 +293,9 @@ namespace ZRCola {
|
||||
///
|
||||
/// \returns Data reference
|
||||
///
|
||||
inline T_data& operator[](size_type pos)
|
||||
inline T_el& operator[](size_type pos)
|
||||
{
|
||||
return (T_data&)host[std::vector<T_idx>::at(pos)];
|
||||
return *reinterpret_cast<T_el*>(&host[std::vector<T_idx>::operator[](pos)]);
|
||||
}
|
||||
|
||||
|
||||
@@ -315,7 +319,7 @@ namespace ZRCola {
|
||||
/// - =0 when a == b
|
||||
/// - >0 when a > b
|
||||
///
|
||||
virtual int compare(_In_ const T_data &a, _In_ const T_data &b) const = 0;
|
||||
virtual int compare(_In_ const T_el &a, _In_ const T_el &b) const = 0;
|
||||
|
||||
|
||||
///
|
||||
@@ -329,7 +333,7 @@ namespace ZRCola {
|
||||
/// - =0 when a == b
|
||||
/// - >0 when a > b
|
||||
///
|
||||
virtual int compare_sort(_In_ const T_data &a, _In_ const T_data &b) const
|
||||
virtual int compare_sort(_In_ const T_el &a, _In_ const T_el &b) const
|
||||
{
|
||||
// Revert to `compare()` by default.
|
||||
return compare(a, b);
|
||||
@@ -348,7 +352,7 @@ namespace ZRCola {
|
||||
/// - \c true if found
|
||||
/// - \c false otherwise
|
||||
///
|
||||
bool find(_In_ const T_data &el, _Out_ size_type &start, _Out_ size_type &end) const
|
||||
bool find(_In_ const T_el &el, _Out_ size_type &start, _Out_ size_type &end) const
|
||||
{
|
||||
// Start with the full search area.
|
||||
for (start = 0, end = size(); start < end; ) {
|
||||
@@ -388,7 +392,7 @@ namespace ZRCola {
|
||||
/// - \c true if found
|
||||
/// - \c false otherwise
|
||||
///
|
||||
bool find(_In_ const T_data &el, _Out_ size_type &start) const
|
||||
bool find(_In_ const T_el &el, _Out_ size_type &start) const
|
||||
{
|
||||
// Start with the full search area.
|
||||
size_t end;
|
||||
@@ -415,8 +419,11 @@ namespace ZRCola {
|
||||
private:
|
||||
static int __cdecl compare_s(void *p, const void *a, const void *b)
|
||||
{
|
||||
const index<T, T_idx, T_data> *t = (const index<T, T_idx, T_data>*)p;
|
||||
return t->compare_sort((const T_data&)t->host[*(const T_idx*)a], (const T_data&)t->host[*(const T_idx*)b]);
|
||||
const index<T_data, T_idx, T_el> *_this = reinterpret_cast<const index<T_data, T_idx, T_el>*>(p);
|
||||
const T_data *data = _this->host.data();
|
||||
return _this->compare_sort(
|
||||
*reinterpret_cast<const T_el*>(data + *reinterpret_cast<const T_idx*>(a)),
|
||||
*reinterpret_cast<const T_el*>(data + *reinterpret_cast<const T_idx*>(b)));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -521,7 +528,7 @@ namespace ZRCola {
|
||||
|
||||
|
||||
///
|
||||
/// A vector for composed-decomposed index transformation mapping
|
||||
/// A vector for destination-source index transformation mapping
|
||||
///
|
||||
class ZRCOLA_API mapping_vector : public std::vector<mapping> {
|
||||
public:
|
||||
@@ -552,6 +559,86 @@ namespace ZRCola {
|
||||
i->invert();
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// Binary compares two strings
|
||||
///
|
||||
/// \param[in] str_a First string
|
||||
/// \param[in] count_a Number of characters in string \p str_a
|
||||
/// \param[in] str_b Second string
|
||||
/// \param[in] count_b Number of characters in string \p str_b
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when str_a < str_b
|
||||
/// - =0 when str_a == str_b
|
||||
/// - >0 when str_a > str_b
|
||||
///
|
||||
/// \note
|
||||
/// The function does not treat \\0 characters as terminators for performance reasons.
|
||||
/// Therefore \p count_a and \p count_b must represent exact string lengths.
|
||||
///
|
||||
inline int CompareString(_In_ const wchar_t *str_a, _In_ size_t count_a, _In_ const wchar_t *str_b, _In_ size_t count_b)
|
||||
{
|
||||
for (size_t i = 0; ; i++) {
|
||||
if (i >= count_a && i >= count_b) return 0;
|
||||
else if (i >= count_a && i < count_b) return -1;
|
||||
else if (i < count_a && i >= count_b) return +1;
|
||||
else if (str_a[i] < str_b[i]) return -1;
|
||||
else if (str_a[i] > str_b[i]) return +1;
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
/// Generates and returns Unicode representation of the string using hexadecimal codes.
|
||||
///
|
||||
/// \param[in] str Unicode string
|
||||
/// \param[in] count Number of characters in string \p str
|
||||
/// \param[in] sep Separator
|
||||
///
|
||||
inline std::string GetUnicodeDumpA(_In_ const wchar_t *str, _In_ size_t count, _In_opt_z_ const char *sep = "+")
|
||||
{
|
||||
std::string out;
|
||||
size_t dump_len_max = strlen(sep) + 4 + 1;
|
||||
char *dump;
|
||||
std::unique_ptr<char> dump_obj(dump = new char[dump_len_max]);
|
||||
if (count && str[0]) {
|
||||
size_t i = 0;
|
||||
out.insert(out.end(), dump, dump + _snprintf(dump, dump_len_max, "%04X", str[i++]));
|
||||
while (i < count && str[i])
|
||||
out.insert(out.end(), dump, dump + _snprintf(dump, dump_len_max, "%s%04X", sep, str[i++]));
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
///
|
||||
/// Generates and returns Unicode representation of the string using hexadecimal codes.
|
||||
///
|
||||
/// \param[in] str Unicode string
|
||||
/// \param[in] count Number of characters in string \p str
|
||||
/// \param[in] sep Separator
|
||||
///
|
||||
inline std::wstring GetUnicodeDumpW(_In_ const wchar_t *str, _In_ size_t count, _In_opt_z_ const wchar_t *sep = L"+")
|
||||
{
|
||||
std::wstring out;
|
||||
size_t dump_len_max = wcslen(sep) + 4 + 1;
|
||||
wchar_t *dump;
|
||||
std::unique_ptr<wchar_t> dump_obj(dump = new wchar_t[dump_len_max]);
|
||||
if (count && str[0]) {
|
||||
size_t i = 0;
|
||||
out.insert(out.end(), dump, dump + _snwprintf(dump, dump_len_max, L"%04X", str[i++]));
|
||||
while (i < count && str[i])
|
||||
out.insert(out.end(), dump, dump + _snwprintf(dump, dump_len_max, L"%s%04X", sep, str[i++]));
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
#ifdef _UNICODE
|
||||
#define GetUnicodeDump GetUnicodeDumpW
|
||||
#else
|
||||
#define GetUnicodeDump GetUnicodeDumpA
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -563,8 +650,8 @@ namespace ZRCola {
|
||||
///
|
||||
/// \returns The stream \p stream
|
||||
///
|
||||
template <class T, class T_idx, class T_data>
|
||||
inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::index<T, T_idx, T_data> &idx)
|
||||
template <class T_data, class T_idx, class T_el>
|
||||
inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::index<T_data, T_idx, T_el> &idx)
|
||||
{
|
||||
// Write index count.
|
||||
auto idx_count = idx.size();
|
||||
@@ -595,8 +682,8 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::i
|
||||
///
|
||||
/// \returns The stream \p stream
|
||||
///
|
||||
template <class T, class T_idx, class T_data>
|
||||
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::index<T, T_idx, T_data> &idx)
|
||||
template <class T_data, class T_idx, class T_el>
|
||||
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::index<T_data, T_idx, T_el> &idx)
|
||||
{
|
||||
unsigned __int32 count;
|
||||
|
||||
|
||||
@@ -45,15 +45,47 @@ namespace ZRCola {
|
||||
/// Character data
|
||||
///
|
||||
struct langchar {
|
||||
wchar_t chr; ///> Character
|
||||
public:
|
||||
langid_t lang; ///< Language ID
|
||||
|
||||
protected:
|
||||
unsigned __int16 chr_to; ///< Character end in \c data
|
||||
wchar_t data[]; ///< Character
|
||||
|
||||
private:
|
||||
inline langchar(_In_ const langchar &other);
|
||||
inline langchar& operator=(_In_ const langchar &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the language character
|
||||
///
|
||||
/// \param[in] lang Character language
|
||||
/// \param[in] chr Character
|
||||
/// \param[in] chr_len Number of UTF-16 characters in \p chr
|
||||
///
|
||||
inline langchar(
|
||||
_In_opt_ langid_t lang = langid_t::blank,
|
||||
_In_opt_z_count_(chr_len) const wchar_t *chr = NULL,
|
||||
_In_opt_ size_t chr_len = 0)
|
||||
{
|
||||
this->lang = lang;
|
||||
this->chr_to = static_cast<unsigned __int16>(chr_len);
|
||||
if (chr_len) memcpy(this->data, chr, sizeof(wchar_t)*chr_len);
|
||||
}
|
||||
|
||||
inline const wchar_t* chr () const { return data; };
|
||||
inline wchar_t* chr () { return data; };
|
||||
inline const wchar_t* chr_end() const { return data + chr_to; };
|
||||
inline wchar_t* chr_end() { return data + chr_to; };
|
||||
inline unsigned __int16 chr_len() const { return chr_to; };
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
///
|
||||
/// Character index
|
||||
///
|
||||
class indexChar : public index<unsigned __int16, unsigned __int32, langchar>
|
||||
class indexChr : public index<unsigned __int16, unsigned __int32, langchar>
|
||||
{
|
||||
public:
|
||||
///
|
||||
@@ -61,7 +93,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexChar(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, langchar>(h) {}
|
||||
indexChr(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, langchar>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two characters by ID (for searching)
|
||||
@@ -76,27 +108,8 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const langchar &a, _In_ const langchar &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///
|
||||
/// Compares two characters by ID (for sorting)
|
||||
///
|
||||
/// \param[in] a Pointer to first element
|
||||
/// \param[in] b Pointer to second element
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when a < b
|
||||
/// - =0 when a == b
|
||||
/// - >0 when a > b
|
||||
///
|
||||
virtual int compare_sort(_In_ const langchar &a, _In_ const langchar &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
if (a.lang < b.lang) return -1;
|
||||
else if (a.lang > b.lang) return 1;
|
||||
@@ -108,9 +121,9 @@ namespace ZRCola {
|
||||
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
///
|
||||
/// Character Language Index
|
||||
/// Language Index
|
||||
///
|
||||
class indexCharLang : public index<unsigned __int16, unsigned __int32, langchar>
|
||||
class indexLang : public index<unsigned __int16, unsigned __int32, langchar>
|
||||
{
|
||||
public:
|
||||
///
|
||||
@@ -118,7 +131,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexCharLang(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, langchar>(h) {}
|
||||
indexLang(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, langchar>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two languages by ID (for searching)
|
||||
@@ -133,34 +146,15 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const langchar &a, _In_ const langchar &b) const
|
||||
{
|
||||
int r = memcmp(a.lang, b.lang, sizeof(langid_t));
|
||||
if (a.lang < b.lang) return -1;
|
||||
else if (a.lang > b.lang) return 1;
|
||||
|
||||
int r = ZRCola::CompareString(a.chr, a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///
|
||||
/// Compares two languages by ID (for sorting)
|
||||
///
|
||||
/// \param[in] a Pointer to first element
|
||||
/// \param[in] b Pointer to second element
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when a < b
|
||||
/// - =0 when a == b
|
||||
/// - >0 when a > b
|
||||
///
|
||||
virtual int compare_sort(_In_ const langchar &a, _In_ const langchar &b) const
|
||||
{
|
||||
int r = memcmp(a.lang, b.lang, sizeof(langid_t));
|
||||
if (r != 0) return r;
|
||||
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxLng; ///< Character language index
|
||||
} idxLang; ///< Language index
|
||||
#endif
|
||||
|
||||
std::vector<unsigned __int16> data; ///< Character data
|
||||
@@ -171,7 +165,7 @@ namespace ZRCola {
|
||||
///
|
||||
inline langchar_db() : idxChr(data)
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
, idxLng(data)
|
||||
, idxLang(data)
|
||||
#endif
|
||||
{}
|
||||
|
||||
@@ -180,23 +174,24 @@ namespace ZRCola {
|
||||
///
|
||||
inline void clear()
|
||||
{
|
||||
idxChr.clear();
|
||||
idxChr .clear();
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
idxLng.clear();
|
||||
idxLang.clear();
|
||||
#endif
|
||||
data .clear();
|
||||
data .clear();
|
||||
}
|
||||
|
||||
///
|
||||
/// Tests presence of character in the given language
|
||||
///
|
||||
/// \param[in] chr Character (UTF-16)
|
||||
/// \param[in] lang Language
|
||||
/// \param[in] chr Pointer to character
|
||||
/// \param[in] chr_end Pointer to character end
|
||||
/// \param[in] lang Language
|
||||
///
|
||||
/// \returns
|
||||
/// - \c true when character is used in language
|
||||
/// - \c false otherwise
|
||||
bool IsLocalCharacter(_In_ wchar_t chr, _In_ langid_t lang) const;
|
||||
bool IsLocalCharacter(_In_ const wchar_t *chr, _In_ const wchar_t *chr_end, _In_ langid_t lang) const;
|
||||
};
|
||||
|
||||
|
||||
@@ -214,9 +209,40 @@ namespace ZRCola {
|
||||
/// Language data
|
||||
///
|
||||
struct language {
|
||||
langid_t id; ///< Language ID
|
||||
unsigned __int16 name_len; ///< \c name length (in characters)
|
||||
wchar_t name[]; ///< Language name
|
||||
public:
|
||||
langid_t lang; ///< Language ID
|
||||
|
||||
protected:
|
||||
unsigned __int16 name_to; ///< Language name end in \c data
|
||||
wchar_t data[]; ///< Language name
|
||||
|
||||
private:
|
||||
inline language(_In_ const language &other);
|
||||
inline language& operator=(_In_ const language &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the language
|
||||
///
|
||||
/// \param[in] lang Language ID
|
||||
/// \param[in] name Language name
|
||||
/// \param[in] name_len Number of UTF-16 characters in \p name
|
||||
///
|
||||
inline language(
|
||||
_In_opt_ langid_t lang = langid_t::blank,
|
||||
_In_opt_z_count_(name_len) const wchar_t *name = NULL,
|
||||
_In_opt_ size_t name_len = 0)
|
||||
{
|
||||
this->lang = lang;
|
||||
this->name_to = static_cast<unsigned __int16>(name_len);
|
||||
if (name_len) memcpy(this->data, name, sizeof(wchar_t)*name_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; };
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
@@ -246,12 +272,12 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const language &a, _In_ const language &b) const
|
||||
{
|
||||
if (a.id < b.id) return -1;
|
||||
else if (a.id > b.id) return 1;
|
||||
if (a.lang < b.lang) return -1;
|
||||
else if (a.lang > b.lang) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxLng; ///< Language index
|
||||
} idxLang; ///< Language index
|
||||
|
||||
std::vector<unsigned __int16> data; ///< Language data
|
||||
|
||||
@@ -259,15 +285,15 @@ namespace ZRCola {
|
||||
///
|
||||
/// Constructs the database
|
||||
///
|
||||
inline language_db() : idxLng(data) {}
|
||||
inline language_db() : idxLang(data) {}
|
||||
|
||||
///
|
||||
/// Clears the database
|
||||
///
|
||||
inline void clear()
|
||||
{
|
||||
idxLng.clear();
|
||||
data .clear();
|
||||
idxLang.clear();
|
||||
data .clear();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -276,8 +302,8 @@ namespace ZRCola {
|
||||
};
|
||||
|
||||
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::langchar_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"L-C";
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::language_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"LNG";
|
||||
const ZRCola::recordid_t ZRCola::langchar_rec::id = *(ZRCola::recordid_t*)"L-C";
|
||||
const ZRCola::recordid_t ZRCola::language_rec::id = *(ZRCola::recordid_t*)"LNG";
|
||||
|
||||
|
||||
///
|
||||
@@ -297,7 +323,7 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::l
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
// Write language index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxLng;
|
||||
stream << db.idxLang;
|
||||
#endif
|
||||
|
||||
// Write data count.
|
||||
@@ -337,7 +363,7 @@ inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::langch
|
||||
|
||||
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
|
||||
// Read language index.
|
||||
stream >> db.idxLng;
|
||||
stream >> db.idxLang;
|
||||
if (!stream.good()) return stream;
|
||||
#endif
|
||||
|
||||
@@ -369,7 +395,7 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::l
|
||||
{
|
||||
// Write language index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxLng;
|
||||
stream << db.idxLang;
|
||||
|
||||
// Write data count.
|
||||
auto data_count = db.data.size();
|
||||
@@ -403,7 +429,7 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::l
|
||||
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::language_db &db)
|
||||
{
|
||||
// Read language index.
|
||||
stream >> db.idxLng;
|
||||
stream >> db.idxLang;
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read data count.
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
namespace ZRCola {
|
||||
///
|
||||
/// Normalizes a decomposed string
|
||||
/// Normalizes a source string
|
||||
///
|
||||
/// \param[in] input Input string (UTF-16)
|
||||
/// \param[in] inputMax Length of the input string in characters. Can be (size_t)-1 if \p input is zero terminated.
|
||||
|
||||
@@ -47,15 +47,47 @@ namespace ZRCola {
|
||||
/// Character tag data
|
||||
///
|
||||
struct chrtag {
|
||||
wchar_t chr; ///> Character
|
||||
public:
|
||||
tagid_t tag; ///< Tag ID
|
||||
|
||||
protected:
|
||||
unsigned __int16 chr_to; ///< Character end in \c data
|
||||
wchar_t data[]; ///< Character
|
||||
|
||||
private:
|
||||
inline chrtag(_In_ const chrtag &other);
|
||||
inline chrtag& operator=(_In_ const chrtag &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the character tag
|
||||
///
|
||||
/// \param[in] chr Character
|
||||
/// \param[in] chr_len Number of UTF-16 characters in \p chr
|
||||
/// \param[in] tag Tag
|
||||
///
|
||||
inline chrtag(
|
||||
_In_opt_z_count_(chr_len) const wchar_t *chr = NULL,
|
||||
_In_opt_ size_t chr_len = 0,
|
||||
_In_opt_ tagid_t tag = 0)
|
||||
{
|
||||
this->tag = tag;
|
||||
this->chr_to = static_cast<unsigned __int16>(chr_len);
|
||||
if (chr_len) memcpy(this->data, chr, sizeof(wchar_t)*chr_len);
|
||||
}
|
||||
|
||||
inline const wchar_t* chr () const { return data; };
|
||||
inline wchar_t* chr () { return data; };
|
||||
inline const wchar_t* chr_end() const { return data + chr_to; };
|
||||
inline wchar_t* chr_end() { return data + chr_to; };
|
||||
inline unsigned __int16 chr_len() const { return chr_to; };
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
///
|
||||
/// Character Index
|
||||
///
|
||||
class indexChar : public index<unsigned __int16, unsigned __int32, chrtag>
|
||||
class indexChr : public index<unsigned __int16, unsigned __int32, chrtag>
|
||||
{
|
||||
public:
|
||||
///
|
||||
@@ -63,7 +95,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexChar(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, chrtag>(h) {}
|
||||
indexChr(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, chrtag>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two character tags by character (for searching)
|
||||
@@ -78,8 +110,8 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const chrtag &a, _In_ const chrtag &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -97,8 +129,8 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare_sort(_In_ const chrtag &a, _In_ const chrtag &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
if (a.tag < b.tag) return -1;
|
||||
else if (a.tag > b.tag) return 1;
|
||||
@@ -156,8 +188,8 @@ namespace ZRCola {
|
||||
if (a.tag < b.tag) return -1;
|
||||
else if (a.tag > b.tag) return 1;
|
||||
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return 1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -191,7 +223,7 @@ namespace ZRCola {
|
||||
/// \param[in ] fn_abort Pointer to function to periodically test for search cancellation
|
||||
/// \param[in ] cookie Cookie for \p fn_abort call
|
||||
///
|
||||
bool Search(_In_ const std::map<tagid_t, unsigned __int16> &tags, _In_ const character_db &ch_db, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<wchar_t, charrank_t> &hits, _In_opt_ bool (__cdecl *fn_abort)(void *cookie) = NULL, _In_opt_ void *cookie = NULL) const;
|
||||
bool Search(_In_ const std::map<tagid_t, unsigned __int16> &tags, _In_ const character_db &ch_db, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<std::wstring, charrank_t> &hits, _In_opt_ bool (__cdecl *fn_abort)(void *cookie) = NULL, _In_opt_ void *cookie = NULL) const;
|
||||
};
|
||||
|
||||
|
||||
@@ -209,19 +241,53 @@ namespace ZRCola {
|
||||
/// Tag name data
|
||||
///
|
||||
struct tagname {
|
||||
public:
|
||||
tagid_t tag; ///< Tag ID
|
||||
LCID locale; ///< Locale ID
|
||||
unsigned __int16 name_len; ///< \c name length (in characters)
|
||||
wchar_t name[]; ///< Tag localized name
|
||||
|
||||
protected:
|
||||
unsigned __int16 name_to; ///< Tag name end in \c data
|
||||
wchar_t data[]; ///< Tag name
|
||||
|
||||
private:
|
||||
inline tagname(_In_ const tagname &other);
|
||||
inline tagname& operator=(_In_ const tagname &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the localized tag name
|
||||
///
|
||||
/// \param[in] tag Tag
|
||||
/// \param[in] locale Locale
|
||||
/// \param[in] name Tag name
|
||||
/// \param[in] name_len Number of UTF-16 characters in \p name
|
||||
///
|
||||
inline tagname(
|
||||
_In_opt_ tagid_t tag = 0,
|
||||
_In_opt_ LCID locale = MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT),
|
||||
_In_opt_z_count_(name_len) const wchar_t *name = NULL,
|
||||
_In_opt_ size_t name_len = 0)
|
||||
{
|
||||
this->tag = tag;
|
||||
this->locale = locale;
|
||||
this->name_to = static_cast<unsigned __int16>(name_len);
|
||||
if (name_len) memcpy(this->data, name, sizeof(wchar_t)*name_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; };
|
||||
|
||||
///
|
||||
/// Compares two names
|
||||
///
|
||||
/// \param[in] locale Locale ID to use for compare
|
||||
/// \param[in] str_a First name
|
||||
/// \param[in] count_a Number of characters in string \p str_a
|
||||
/// \param[in] count_a Number of UTF-16 characters in \p str_a
|
||||
/// \param[in] str_b Second name
|
||||
/// \param[in] count_b Number of characters in string \p str_b
|
||||
/// \param[in] count_b Number of UTF-16 characters in \p str_b
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when str_a < str_b
|
||||
@@ -234,7 +300,7 @@ namespace ZRCola {
|
||||
///
|
||||
static inline int CompareName(LCID locale, const wchar_t *str_a, unsigned __int16 count_a, const wchar_t *str_b, unsigned __int16 count_b)
|
||||
{
|
||||
switch (CompareString(locale, SORT_STRINGSORT | NORM_IGNORECASE, str_a, count_a, str_b, count_b)) {
|
||||
switch (::CompareString(locale, SORT_STRINGSORT | NORM_IGNORECASE, str_a, count_a, str_b, count_b)) {
|
||||
case CSTR_LESS_THAN : return -1;
|
||||
case CSTR_EQUAL : return 0;
|
||||
case CSTR_GREATER_THAN: return 1;
|
||||
@@ -259,7 +325,7 @@ namespace ZRCola {
|
||||
indexName(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, tagname>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two tag names by name (for searching)
|
||||
/// Compares two tag names by locale and name (for searching)
|
||||
///
|
||||
/// \param[in] a Pointer to first element
|
||||
/// \param[in] b Pointer to second element
|
||||
@@ -274,14 +340,14 @@ namespace ZRCola {
|
||||
if (a.locale < b.locale) return -1;
|
||||
else if (a.locale > b.locale) return 1;
|
||||
|
||||
int r = tagname::CompareName(a.locale, a.name, a.name_len, b.name, b.name_len);
|
||||
int r = tagname::CompareName(a.locale, a.name(), a.name_len(), b.name(), b.name_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///
|
||||
/// Compares two tag names by name (for sorting)
|
||||
/// Compares two tag names by locale and name (for sorting)
|
||||
///
|
||||
/// \param[in] a Pointer to first element
|
||||
/// \param[in] b Pointer to second element
|
||||
@@ -296,7 +362,7 @@ namespace ZRCola {
|
||||
if (a.locale < b.locale) return -1;
|
||||
else if (a.locale > b.locale) return 1;
|
||||
|
||||
int r = tagname::CompareName(a.locale, a.name, a.name_len, b.name, b.name_len);
|
||||
int r = tagname::CompareName(a.locale, a.name(), a.name_len(), b.name(), b.name_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
if (a.tag < b.tag) return -1;
|
||||
@@ -378,8 +444,8 @@ namespace ZRCola {
|
||||
};
|
||||
|
||||
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::chrtag_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"C-T";
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::tagname_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"TGN";
|
||||
const ZRCola::recordid_t ZRCola::chrtag_rec ::id = *(ZRCola::recordid_t*)"C-T";
|
||||
const ZRCola::recordid_t ZRCola::tagname_rec::id = *(ZRCola::recordid_t*)"TGN";
|
||||
|
||||
|
||||
///
|
||||
|
||||
@@ -35,6 +35,11 @@
|
||||
|
||||
|
||||
namespace ZRCola {
|
||||
///
|
||||
/// Translation set ID
|
||||
///
|
||||
typedef unsigned __int16 transetid_t;
|
||||
|
||||
///
|
||||
/// Translation database
|
||||
///
|
||||
@@ -46,45 +51,79 @@ namespace ZRCola {
|
||||
/// Translation data
|
||||
///
|
||||
struct translation {
|
||||
wchar_t chr; ///< Composed character
|
||||
unsigned __int16 rank; ///< Decomposition rank
|
||||
unsigned __int16 str_len; ///< \c str length (in characters)
|
||||
wchar_t str[]; ///< Decomposed string
|
||||
public:
|
||||
transetid_t set; ///< Translation set ID
|
||||
unsigned __int16 dst_rank; ///< Destination character rank
|
||||
unsigned __int16 src_rank; ///< Source character rank
|
||||
|
||||
protected:
|
||||
unsigned __int16 dst_to; ///< Destination character end in \c data
|
||||
unsigned __int16 src_to; ///< Source string end in \c data
|
||||
wchar_t data[]; ///< Destination string and source character
|
||||
|
||||
private:
|
||||
inline translation(_In_ const translation &other);
|
||||
inline translation& operator=(_In_ const translation &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Binary compares two strings
|
||||
/// Constructs the translation
|
||||
///
|
||||
/// \param[in] str_a First string
|
||||
/// \param[in] count_a Number of characters in string \p str_a
|
||||
/// \param[in] str_b Second string
|
||||
/// \param[in] count_b Number of characters in string \p str_b
|
||||
/// \param[in] set Translation set ID
|
||||
/// \param[in] dst_rank Destination character rank
|
||||
/// \param[in] dst Destination character
|
||||
/// \param[in] dst_len Number of UTF-16 characters in \p dst
|
||||
/// \param[in] src_rank Source character rank
|
||||
/// \param[in] src Source character
|
||||
/// \param[in] src_len Number of UTF-16 characters in \p src
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when str_a < str_b
|
||||
/// - =0 when str_a == str_b
|
||||
/// - >0 when str_a > str_b
|
||||
///
|
||||
/// \note
|
||||
/// The function does not treat \\0 characters as terminators for performance reasons.
|
||||
/// Therefore \p count_a and \p count_b must represent exact string lengths.
|
||||
///
|
||||
static inline int CompareString(const wchar_t *str_a, unsigned __int16 count_a, const wchar_t *str_b, unsigned __int16 count_b)
|
||||
inline translation(
|
||||
_In_opt_ transetid_t set = 0,
|
||||
_In_opt_ unsigned __int16 dst_rank = 0,
|
||||
_In_opt_z_count_(dst_len) const wchar_t *dst = NULL,
|
||||
_In_opt_ size_t dst_len = 0,
|
||||
_In_opt_ unsigned __int16 src_rank = 0,
|
||||
_In_opt_z_count_(src_len) const wchar_t *src = NULL,
|
||||
_In_opt_ size_t src_len = 0)
|
||||
{
|
||||
for (unsigned __int16 i = 0; ; i++) {
|
||||
if (i >= count_a && i >= count_b) return 0;
|
||||
else if (i >= count_a && i < count_b) return -1;
|
||||
else if (i < count_a && i >= count_b) return +1;
|
||||
else if (str_a[i] < str_b[i]) return -1;
|
||||
else if (str_a[i] > str_b[i]) return +1;
|
||||
}
|
||||
this->set = set;
|
||||
this->dst_rank = dst_rank;
|
||||
this->src_rank = src_rank;
|
||||
this->dst_to = static_cast<unsigned __int16>(dst_len);
|
||||
if (dst_len) memcpy(this->data, dst, sizeof(wchar_t)*dst_len);
|
||||
this->src_to = static_cast<unsigned __int16>(this->dst_to + src_len);
|
||||
if (src_len) memcpy(this->data + this->dst_to, src, sizeof(wchar_t)*src_len);
|
||||
}
|
||||
|
||||
inline const wchar_t* dst () const { return data; };
|
||||
inline wchar_t* dst () { return data; };
|
||||
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; };
|
||||
|
||||
inline wchar_t dst_at(_In_ size_t i) const
|
||||
{
|
||||
return i < dst_to ? data[i] : 0;
|
||||
}
|
||||
|
||||
inline const wchar_t* src () const { return data + dst_to; };
|
||||
inline wchar_t* src () { return data + dst_to; };
|
||||
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 - dst_to; };
|
||||
|
||||
inline wchar_t src_at(_In_ size_t i) const
|
||||
{
|
||||
size_t ii = i + dst_to; // absolute index
|
||||
return ii < src_to ? data[ii] : 0;
|
||||
}
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
///
|
||||
/// Composition index
|
||||
/// Translation index
|
||||
///
|
||||
class indexComp : public index<unsigned __int16, unsigned __int32, translation>
|
||||
class indexSrc : public index<unsigned __int16, unsigned __int32, translation>
|
||||
{
|
||||
public:
|
||||
///
|
||||
@@ -92,7 +131,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexComp(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, translation>(h) {}
|
||||
indexSrc(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, translation>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two transformations by string (for searching)
|
||||
@@ -107,7 +146,10 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const translation &a, _In_ const translation &b) const
|
||||
{
|
||||
int r = translation::CompareString(a.str, a.str_len, b.str, b.str_len);
|
||||
if (a.set < b.set) return -1;
|
||||
else if (a.set > b.set) return +1;
|
||||
|
||||
int r = ZRCola::CompareString(a.src(), a.src_len(), b.src(), b.src_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
@@ -126,21 +168,27 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare_sort(_In_ const translation &a, _In_ const translation &b) const
|
||||
{
|
||||
int r = translation::CompareString(a.str, a.str_len, b.str, b.str_len);
|
||||
if (a.set < b.set) return -1;
|
||||
else if (a.set > b.set) return +1;
|
||||
|
||||
int r = ZRCola::CompareString(a.src(), a.src_len(), b.src(), b.src_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return +1;
|
||||
if (a.src_rank < b.src_rank) return -1;
|
||||
else if (a.src_rank > b.src_rank) return +1;
|
||||
|
||||
r = ZRCola::CompareString(a.dst(), a.dst_len(), b.dst(), b.dst_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxComp; ///< Composition index
|
||||
} idxSrc; ///< Translation index
|
||||
|
||||
|
||||
///
|
||||
/// Decomposition index
|
||||
/// Inverse translation index
|
||||
///
|
||||
class indexDecomp : public index<unsigned __int16, unsigned __int32, translation>
|
||||
class indexDst : public index<unsigned __int16, unsigned __int32, translation>
|
||||
{
|
||||
public:
|
||||
///
|
||||
@@ -148,7 +196,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexDecomp(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, translation>(h) {}
|
||||
indexDst(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, translation>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two transformations by character (for searching)
|
||||
@@ -163,8 +211,11 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const translation &a, _In_ const translation &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return +1;
|
||||
if (a.set < b.set) return -1;
|
||||
else if (a.set > b.set) return +1;
|
||||
|
||||
int r = ZRCola::CompareString(a.dst(), a.dst_len(), b.dst(), b.dst_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -182,18 +233,21 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare_sort(_In_ const translation &a, _In_ const translation &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return +1;
|
||||
if (a.set < b.set) return -1;
|
||||
else if (a.set > b.set) return +1;
|
||||
|
||||
if (a.rank < b.rank) return -1;
|
||||
else if (a.rank > b.rank) return +1;
|
||||
int r = ZRCola::CompareString(a.dst(), a.dst_len(), b.dst(), b.dst_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
int r = translation::CompareString(a.str, a.str_len, b.str, b.str_len);
|
||||
if (a.dst_rank < b.dst_rank) return -1;
|
||||
else if (a.dst_rank > b.dst_rank) return +1;
|
||||
|
||||
r = ZRCola::CompareString(a.src(), a.src_len(), b.src(), b.src_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxDecomp; ///< Decomposition index
|
||||
} idxDst; ///< Inverse translation index
|
||||
|
||||
|
||||
std::vector<unsigned __int16> data; ///< Transformation data
|
||||
@@ -202,44 +256,47 @@ namespace ZRCola {
|
||||
///
|
||||
/// Constructs the database
|
||||
///
|
||||
inline translation_db() : idxComp(data), idxDecomp(data) {}
|
||||
inline translation_db() : idxSrc(data), idxDst(data) {}
|
||||
|
||||
///
|
||||
/// Clears the database
|
||||
///
|
||||
inline void clear()
|
||||
{
|
||||
idxComp .clear();
|
||||
idxDecomp.clear();
|
||||
data .clear();
|
||||
idxSrc.clear();
|
||||
idxDst.clear();
|
||||
data .clear();
|
||||
}
|
||||
|
||||
///
|
||||
/// Composes string
|
||||
/// Translates string
|
||||
///
|
||||
/// \param[in] set Translation set ID
|
||||
/// \param[in] input Input string (UTF-16)
|
||||
/// \param[in] inputMax Length of the input string in characters. Can be (size_t)-1 if \p input is zero terminated.
|
||||
/// \param[out] output Output string (UTF-16)
|
||||
/// \param[out] map The vector of source to destination index mappings (optional)
|
||||
///
|
||||
void Compose(_In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map = NULL) const;
|
||||
void Translate(_In_ transetid_t set, _In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map = NULL) const;
|
||||
|
||||
///
|
||||
/// Decomposes string
|
||||
/// Inverse translates string
|
||||
///
|
||||
/// \param[in] set Translation set ID
|
||||
/// \param[in] input Input string (UTF-16)
|
||||
/// \param[in] inputMax Length of the input string in characters. Can be (size_t)-1 if \p input is zero terminated.
|
||||
/// \param[out] output Output string (UTF-16)
|
||||
/// \param[out] map The vector of source to destination index mappings (optional)
|
||||
///
|
||||
inline void Decompose(_In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map = NULL) const
|
||||
inline void TranslateInv(_In_ transetid_t set, _In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map = NULL) const
|
||||
{
|
||||
Decompose(input, inputMax, NULL, langid_t::blank, output, map);
|
||||
TranslateInv(set, input, inputMax, NULL, langid_t::blank, output, map);
|
||||
}
|
||||
|
||||
///
|
||||
/// Decomposes string according ommiting language specific characters
|
||||
/// Inverse translates string according ommiting language specific characters
|
||||
///
|
||||
/// \param[in] set Translation set ID
|
||||
/// \param[in] input Input string (UTF-16)
|
||||
/// \param[in] inputMax Length of the input string in characters. Can be (size_t)-1 if \p input is zero terminated.
|
||||
/// \param[in] lc_db Language character database
|
||||
@@ -247,15 +304,132 @@ namespace ZRCola {
|
||||
/// \param[out] output Output string (UTF-16)
|
||||
/// \param[out] map The vector of source to destination index mappings (optional)
|
||||
///
|
||||
void Decompose(_In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _In_opt_ const langchar_db *lc_db, _In_opt_ langid_t lang, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map = NULL) const;
|
||||
void TranslateInv(_In_ transetid_t set, _In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _In_opt_ const langchar_db *lc_db, _In_opt_ langid_t lang, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map = NULL) const;
|
||||
};
|
||||
|
||||
|
||||
typedef ZRCOLA_API stdex::idrec::record<translation_db, recordid_t, recordsize_t, ZRCOLA_RECORD_ALIGN> translation_rec;
|
||||
|
||||
|
||||
///
|
||||
/// Translation set database
|
||||
///
|
||||
class ZRCOLA_API transet_db {
|
||||
public:
|
||||
#pragma pack(push)
|
||||
#pragma pack(2)
|
||||
///
|
||||
/// Translation set data
|
||||
///
|
||||
struct transet {
|
||||
public:
|
||||
transetid_t set; ///< Translation set ID
|
||||
|
||||
protected:
|
||||
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);
|
||||
inline transet& operator=(_In_ const transet &other);
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the translation set
|
||||
///
|
||||
/// \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_(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->src_to = static_cast<unsigned __int16>(src_len);
|
||||
if (src_len) memcpy(this->data, src, sizeof(wchar_t)*src_len);
|
||||
this->dst_to = static_cast<unsigned __int16>(this->src_to + dst_len);
|
||||
if (dst_len) memcpy(this->data + this->src_to, dst, sizeof(wchar_t)*dst_len);
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
///
|
||||
/// Translation set index
|
||||
///
|
||||
class indexTranSet : public index<unsigned __int16, unsigned __int32, transet>
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Constructs the index
|
||||
///
|
||||
/// \param[in] h Reference to vector holding the data
|
||||
///
|
||||
indexTranSet(_In_ std::vector<unsigned __int16> &h) : index<unsigned __int16, unsigned __int32, transet>(h) {}
|
||||
|
||||
///
|
||||
/// Compares two translation sets by ID (for searching)
|
||||
///
|
||||
/// \param[in] a Pointer to first element
|
||||
/// \param[in] b Pointer to second element
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when a < b
|
||||
/// - =0 when a == b
|
||||
/// - >0 when a > b
|
||||
///
|
||||
virtual int compare(_In_ const transet &a, _In_ const transet &b) const
|
||||
{
|
||||
if (a.set < b.set) return -1;
|
||||
else if (a.set > b.set) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxTranSet; ///< Translation set index
|
||||
|
||||
std::vector<unsigned __int16> data; ///< Translation set data
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the database
|
||||
///
|
||||
inline transet_db() : idxTranSet(data) {}
|
||||
|
||||
///
|
||||
/// Clears the database
|
||||
///
|
||||
inline void clear()
|
||||
{
|
||||
idxTranSet.clear();
|
||||
data .clear();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
typedef ZRCOLA_API stdex::idrec::record<transet_db, recordid_t, recordsize_t, ZRCOLA_RECORD_ALIGN> transet_rec;
|
||||
};
|
||||
|
||||
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::translation_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"TRN";
|
||||
const ZRCola::recordid_t ZRCola::translation_rec::id = *(ZRCola::recordid_t*)"TRN";
|
||||
const ZRCola::recordid_t ZRCola::transet_rec ::id = *(ZRCola::recordid_t*)"TSE";
|
||||
|
||||
|
||||
///
|
||||
@@ -268,13 +442,13 @@ const ZRCola::recordid_t stdex::idrec::record<ZRCola::translation_db, ZRCola::re
|
||||
///
|
||||
inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::translation_db &db)
|
||||
{
|
||||
// Write composition index.
|
||||
// Write translation index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxComp;
|
||||
stream << db.idxSrc;
|
||||
|
||||
// Write decomposition index.
|
||||
// Write inverse translation index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxDecomp;
|
||||
stream << db.idxDst;
|
||||
|
||||
// Write data count.
|
||||
auto data_count = db.data.size();
|
||||
@@ -307,12 +481,77 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::t
|
||||
///
|
||||
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::translation_db &db)
|
||||
{
|
||||
// Read composition index.
|
||||
stream >> db.idxComp;
|
||||
// Read translation index.
|
||||
stream >> db.idxSrc;
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read decomposition index.
|
||||
stream >> db.idxDecomp;
|
||||
// Read inverse translation index.
|
||||
stream >> db.idxDst;
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read data count.
|
||||
unsigned __int32 count;
|
||||
stream.read((char*)&count, sizeof(count));
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
if (count) {
|
||||
// Read data.
|
||||
db.data.resize(count);
|
||||
stream.read((char*)db.data.data(), sizeof(unsigned __int16)*count);
|
||||
} else
|
||||
db.data.clear();
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
///
|
||||
/// Writes translation set database to a stream
|
||||
///
|
||||
/// \param[in] stream Output stream
|
||||
/// \param[in] db Translation set database
|
||||
///
|
||||
/// \returns The stream \p stream
|
||||
///
|
||||
inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::transet_db &db)
|
||||
{
|
||||
// Write translation set index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxTranSet;
|
||||
|
||||
// Write data count.
|
||||
auto 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;
|
||||
unsigned __int32 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;
|
||||
}
|
||||
|
||||
|
||||
///
|
||||
/// Reads translation set database from a stream
|
||||
///
|
||||
/// \param[in ] stream Input stream
|
||||
/// \param[out] db Translation set database
|
||||
///
|
||||
/// \returns The stream \p stream
|
||||
///
|
||||
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::transet_db &db)
|
||||
{
|
||||
// Read translation set index.
|
||||
stream >> db.idxTranSet;
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read data count.
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
const ZRCola::chrcatid_t ZRCola::chrcatid_t::blank = {};
|
||||
|
||||
|
||||
bool ZRCola::character_db::Search(_In_z_ const wchar_t *str, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<wchar_t, charrank_t> &hits, _Inout_ std::map<wchar_t, charrank_t> &hits_sub, _In_opt_ bool (__cdecl *fn_abort)(void *cookie), _In_opt_ void *cookie) const
|
||||
bool ZRCola::character_db::Search(_In_z_ const wchar_t *str, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<std::wstring, charrank_t> &hits, _Inout_ std::map<std::wstring, charrank_t> &hits_sub, _In_opt_ bool (__cdecl *fn_abort)(void *cookie), _In_opt_ void *cookie) const
|
||||
{
|
||||
assert(str);
|
||||
|
||||
@@ -76,14 +76,15 @@ bool ZRCola::character_db::Search(_In_z_ const wchar_t *str, _In_ const std::set
|
||||
|
||||
if (idxDsc.find(term.c_str(), term.size(), &data, &len)) {
|
||||
// The term was found.
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
for (size_t i = 0, j = 0; i < len; i += j + 1) {
|
||||
if (fn_abort && fn_abort(cookie)) return false;
|
||||
wchar_t c = data[i];
|
||||
if (cats.find(GetCharCat(c)) != cats.end()) {
|
||||
j = wcsnlen(data + i, len - i);
|
||||
if (cats.find(GetCharCat(data + i, j)) != cats.end()) {
|
||||
std::wstring c(data + i, j);
|
||||
auto idx = hits.find(c);
|
||||
if (idx == hits.end()) {
|
||||
// New character.
|
||||
hits.insert(std::make_pair(data[i], 1.0/len));
|
||||
hits.insert(std::make_pair(std::move(c), 1.0/len));
|
||||
} else {
|
||||
// Increase rating of existing character.
|
||||
idx->second += 1.0/len;
|
||||
@@ -94,14 +95,15 @@ bool ZRCola::character_db::Search(_In_z_ const wchar_t *str, _In_ const std::set
|
||||
|
||||
if (idxDscSub.find(term.c_str(), term.size(), &data, &len)) {
|
||||
// The term was found in the sub-term index.
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
for (size_t i = 0, j = 0; i < len; i += j + 1) {
|
||||
if (fn_abort && fn_abort(cookie)) return false;
|
||||
wchar_t c = data[i];
|
||||
if (cats.find(GetCharCat(c)) != cats.end()) {
|
||||
j = wcsnlen(data + i, len - i);
|
||||
if (cats.find(GetCharCat(data + i, j)) != cats.end()) {
|
||||
std::wstring c(data + i, j);
|
||||
auto idx = hits_sub.find(c);
|
||||
if (idx == hits_sub.end()) {
|
||||
// New character.
|
||||
hits_sub.insert(std::make_pair(data[i], 1.0/len));
|
||||
hits_sub.insert(std::make_pair(c, 1.0/len));
|
||||
} else {
|
||||
// Increase rating of existing character.
|
||||
idx->second += 1.0/len;
|
||||
|
||||
@@ -71,26 +71,12 @@ void ZRCola::LangConvert(_In_ LANGID lang_win, _Inout_ ZRCola::langid_t &lang)
|
||||
#endif
|
||||
|
||||
|
||||
bool ZRCola::langchar_db::IsLocalCharacter(_In_ wchar_t chr, _In_ ZRCola::langid_t lang) const
|
||||
bool ZRCola::langchar_db::IsLocalCharacter(_In_ const wchar_t *chr, _In_ const wchar_t *chr_end, _In_ ZRCola::langid_t lang) const
|
||||
{
|
||||
for (size_t l = 0, r = idxChr.size(); l < r; ) {
|
||||
// Test the character in the middle of the search area.
|
||||
size_t m = (l + r) / 2;
|
||||
const langchar &lc = idxChr[m];
|
||||
|
||||
// Do the bisection test on character.
|
||||
if (chr < lc.chr) r = m;
|
||||
else if (lc.chr < chr ) l = m + 1;
|
||||
else {
|
||||
// Do the bisection test on language.
|
||||
if (lang < lc.lang) r = m;
|
||||
else if (lang > lc.lang) l = m + 1;
|
||||
else {
|
||||
// Match found.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
size_t n = chr_end - chr;
|
||||
assert(n <= 0xffff);
|
||||
std::unique_ptr<langchar> lc((langchar*)new char[sizeof(langchar) + sizeof(wchar_t)*n]);
|
||||
lc->langchar::langchar(lang, chr, n);
|
||||
indexChr::size_type start;
|
||||
return idxChr.find(*lc, start);
|
||||
}
|
||||
|
||||
@@ -20,23 +20,24 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
bool ZRCola::chrtag_db::Search(_In_ const std::map<tagid_t, unsigned __int16> &tags, _In_ const character_db &ch_db, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<wchar_t, charrank_t> &hits, _In_opt_ bool (__cdecl *fn_abort)(void *cookie), _In_opt_ void *cookie) const
|
||||
bool ZRCola::chrtag_db::Search(_In_ const std::map<tagid_t, unsigned __int16> &tags, _In_ const character_db &ch_db, _In_ const std::set<chrcatid_t> &cats, _Inout_ std::map<std::wstring, charrank_t> &hits, _In_opt_ bool (__cdecl *fn_abort)(void *cookie), _In_opt_ void *cookie) const
|
||||
{
|
||||
for (auto tag = tags.cbegin(), tag_end = tags.cend(); tag != tag_end; ++tag) {
|
||||
if (fn_abort && fn_abort(cookie)) return false;
|
||||
|
||||
// Search for tagged characters.
|
||||
chrtag el = { 0, tag->first };
|
||||
size_t start, end;
|
||||
if (idxTag.find(el, start, end)) {
|
||||
if (idxTag.find(chrtag(NULL, 0, tag->first), start, end)) {
|
||||
for (size_t i = start; i < end; i++) {
|
||||
if (fn_abort && fn_abort(cookie)) return false;
|
||||
const chrtag &ct = idxTag[i];
|
||||
if (cats.find(ch_db.GetCharCat(ct.chr)) != cats.end()) {
|
||||
auto idx = hits.find(ct.chr);
|
||||
unsigned __int16 len = ct.chr_len();
|
||||
if (cats.find(ch_db.GetCharCat(ct.chr(), len)) != cats.end()) {
|
||||
std::wstring chr(ct.chr(), len);
|
||||
auto idx = hits.find(chr);
|
||||
if (idx == hits.end()) {
|
||||
// New character.
|
||||
hits.insert(std::make_pair(ct.chr, tag->second));
|
||||
hits.insert(std::make_pair(std::move(chr), tag->second));
|
||||
} else {
|
||||
// Increase count for existing character.
|
||||
idx->second += tag->second;
|
||||
@@ -95,8 +96,7 @@ bool ZRCola::tagname_db::Search(_In_z_ const wchar_t *str, _In_ LCID locale, _In
|
||||
|
||||
// Find the name.
|
||||
std::unique_ptr<tagname> tn(reinterpret_cast<tagname*>(new char[sizeof(tagname) + sizeof(wchar_t)*name.length()]));
|
||||
tn->locale = locale;
|
||||
memcpy(tn->name, name.data(), sizeof(wchar_t)*(tn->name_len = (unsigned __int16)name.length()));
|
||||
tn->tagname::tagname(0, locale, name.data(), name.length());
|
||||
size_t start, end;
|
||||
if (idxName.find(*tn, start, end)) {
|
||||
// The name was found.
|
||||
|
||||
@@ -20,36 +20,38 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
void ZRCola::translation_db::Compose(_In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map) const
|
||||
void ZRCola::translation_db::Translate(_In_ transetid_t set, _In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map) const
|
||||
{
|
||||
assert(input || inputMax == 0);
|
||||
|
||||
// Trim inputMax to actual length.
|
||||
inputMax = wcsnlen(input, inputMax);
|
||||
inputMax = inputMax != (size_t)-1 ? wcsnlen(input, inputMax) : wcslen(input);
|
||||
|
||||
// Clear the output string and preallocate at least inputMax chars.
|
||||
// Since composing is usually reducing the number of chars, memory reallocation is not expected later.
|
||||
// Clear the output.
|
||||
output.clear();
|
||||
output.reserve(inputMax);
|
||||
if (map)
|
||||
map->clear();
|
||||
|
||||
auto compositionsCount = idxComp.size();
|
||||
// Limit search to the given set first.
|
||||
indexSrc::size_type l_set, r_set;
|
||||
idxSrc.find(translation(set ), l_set);
|
||||
idxSrc.find(translation(set + 1), r_set);
|
||||
|
||||
for (size_t i = 0; i < inputMax;) {
|
||||
// Find the longest matching composition at i-th character.
|
||||
// Find the longest matching translation at i-th character.
|
||||
size_t l_match = (size_t)-1;
|
||||
for (size_t l = 0, r = compositionsCount, ii = i, j = 0; ii < inputMax && l < r; ii++, j++) {
|
||||
for (size_t l = l_set, r = r_set, ii = i, j = 0; ii < inputMax && l < r; ii++, j++) {
|
||||
wchar_t c = input[ii];
|
||||
while (l < r) {
|
||||
// Test the composition in the middle of the search area.
|
||||
// Test the translation in the middle of the search area.
|
||||
size_t m = (l + r) / 2;
|
||||
|
||||
// Get the j-th character of the composition.
|
||||
// All compositions that get short on characters are lexically ordered before.
|
||||
// Get the j-th character of the translation.
|
||||
// All translations that get short on characters are lexically ordered before.
|
||||
// Thus the j-th character is considered 0.
|
||||
const translation &trans = idxComp[m];
|
||||
wchar_t s = j < trans.str_len ? trans.str[j] : 0;
|
||||
const translation &trans = idxSrc[m];
|
||||
wchar_t s = trans.src_at(j);
|
||||
|
||||
// Do the bisection test.
|
||||
if (c < s) r = m;
|
||||
@@ -57,25 +59,25 @@ void ZRCola::translation_db::Compose(_In_z_count_(inputMax) const wchar_t* input
|
||||
else {
|
||||
// Character found.
|
||||
|
||||
// Narrow the search area on the left to start at the first composition in the run.
|
||||
// Narrow the search area on the left to start at the first translation in the run.
|
||||
for (size_t rr = m; l < rr;) {
|
||||
size_t m = (l + rr) / 2;
|
||||
const translation &trans = idxComp[m];
|
||||
wchar_t s = j < trans.str_len ? trans.str[j] : 0;
|
||||
const translation &trans = idxSrc[m];
|
||||
wchar_t s = trans.src_at(j);
|
||||
if (c <= s) rr = m; else l = m + 1;
|
||||
}
|
||||
|
||||
// Narrow the search area on the right to end at the first composition not in the run.
|
||||
// Narrow the search area on the right to end at the first translation not in the run.
|
||||
for (size_t ll = m + 1; ll < r;) {
|
||||
size_t m = (ll + r) / 2;
|
||||
const translation &trans = idxComp[m];
|
||||
wchar_t s = j < trans.str_len ? trans.str[j] : 0;
|
||||
const translation &trans = idxSrc[m];
|
||||
wchar_t s = trans.src_at(j);
|
||||
if (s <= c) ll = m + 1; else r = m;
|
||||
}
|
||||
|
||||
const translation &trans = idxComp[l];
|
||||
if (j + 1 == trans.str_len) {
|
||||
// The first composition of the run was a match (thus far). Save it.
|
||||
const translation &trans = idxSrc[l];
|
||||
if (j + 1 == trans.src_len()) {
|
||||
// The first translation of the run was a match (thus far). Save it.
|
||||
l_match = l;
|
||||
}
|
||||
|
||||
@@ -84,12 +86,12 @@ void ZRCola::translation_db::Compose(_In_z_count_(inputMax) const wchar_t* input
|
||||
}
|
||||
}
|
||||
|
||||
if (l_match < compositionsCount) {
|
||||
// The saved composition was an exact match.
|
||||
const translation &trans = idxComp[l_match];
|
||||
output += trans.chr;
|
||||
i += trans.str_len;
|
||||
if (trans.str_len > 1 && map) {
|
||||
if (l_match < r_set) {
|
||||
// The saved translation was an exact match.
|
||||
const translation &trans = idxSrc[l_match];
|
||||
output.append(trans.dst(), trans.dst_end());
|
||||
i += trans.src_len();
|
||||
if (trans.src_len() != trans.dst_len() && map) {
|
||||
// Mapping changed.
|
||||
map->push_back(ZRCola::mapping(i, output.length()));
|
||||
}
|
||||
@@ -102,66 +104,92 @@ void ZRCola::translation_db::Compose(_In_z_count_(inputMax) const wchar_t* input
|
||||
}
|
||||
|
||||
|
||||
void ZRCola::translation_db::Decompose(_In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _In_ const langchar_db *lc_db, _In_ langid_t lang, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map) const
|
||||
void ZRCola::translation_db::TranslateInv(_In_ transetid_t set, _In_z_count_(inputMax) const wchar_t* input, _In_ size_t inputMax, _In_ const langchar_db *lc_db, _In_ langid_t lang, _Out_ std::wstring &output, _Out_opt_ std::vector<mapping>* map) const
|
||||
{
|
||||
assert(input || inputMax == 0);
|
||||
|
||||
// Trim inputMax to actual length.
|
||||
inputMax = inputMax != (size_t)-1 ? wcsnlen(input, inputMax) : wcslen(input);
|
||||
|
||||
// Clear the output string and preallocate at least 2*inputMax chars.
|
||||
// Since decomposition expands the string, let's keep our fingers crossed to avoid reallocation later.
|
||||
// Clear the output.
|
||||
output.clear();
|
||||
output.reserve(inputMax * 2);
|
||||
output.reserve(inputMax);
|
||||
if (map)
|
||||
map->clear();
|
||||
|
||||
auto decompositionsCount = idxDecomp.size();
|
||||
// Limit search to the given set first.
|
||||
indexDst::size_type l_set, r_set;
|
||||
idxDst.find(translation(set ), l_set);
|
||||
idxDst.find(translation(set + 1), r_set);
|
||||
|
||||
for (size_t i = 0; i < inputMax;) {
|
||||
// Find whether the character can be decomposed.
|
||||
wchar_t c = input[i];
|
||||
|
||||
for (size_t l = 0, r = decompositionsCount;; ) {
|
||||
if (l < r) {
|
||||
// Find the longest matching inverse translation at i-th character.
|
||||
size_t l_match = (size_t)-1;
|
||||
for (size_t l = 0, r = r_set, ii = i, j = 0; ii < inputMax && l < r; ii++, j++) {
|
||||
wchar_t c = input[ii];
|
||||
while (l < r) {
|
||||
// Test the inverse translation in the middle of the search area.
|
||||
size_t m = (l + r) / 2;
|
||||
const translation &trans = idxDecomp[m];
|
||||
wchar_t decompSrc = trans.chr;
|
||||
if (c < decompSrc) r = m;
|
||||
else if (decompSrc < c) l = m + 1;
|
||||
|
||||
// Get the j-th character of the inverse translation.
|
||||
// All inverse translations that get short on characters are lexically ordered before.
|
||||
// Thus the j-th character is considered 0.
|
||||
const translation &trans = idxDst[m];
|
||||
wchar_t s = trans.dst_at(j);
|
||||
|
||||
// Do the bisection test.
|
||||
if (c < s) r = m;
|
||||
else if (s < c) l = m + 1;
|
||||
else {
|
||||
// Character found.
|
||||
|
||||
// Narrow the search area on the left to start at the first decomposition in the run (first by rank).
|
||||
// Narrow the search area on the left to start at the first inverse translation in the run.
|
||||
for (size_t rr = m; l < rr;) {
|
||||
size_t m = (l + rr) / 2;
|
||||
const translation &trans = idxDecomp[m];
|
||||
wchar_t decompSrc = trans.chr;
|
||||
if (c <= decompSrc) rr = m; else l = m + 1;
|
||||
const translation &trans = idxDst[m];
|
||||
wchar_t s = trans.dst_at(j);
|
||||
if (c <= s) rr = m; else l = m + 1;
|
||||
}
|
||||
|
||||
const translation &trans = idxDecomp[l];
|
||||
if (trans.str_len && trans.str[0] != L'#' && (!lc_db || !lc_db->IsLocalCharacter(c, lang))) {
|
||||
// Append decomposed sequence.
|
||||
output.append(trans.str, trans.str_len);
|
||||
i++;
|
||||
if (map) {
|
||||
// Mapping changed.
|
||||
map->push_back(ZRCola::mapping(i, output.length()));
|
||||
}
|
||||
} else {
|
||||
// Character is inhibited to decompose.
|
||||
output += c;
|
||||
i++;
|
||||
// Narrow the search area on the right to end at the first inverse translation not in the run.
|
||||
for (size_t ll = m + 1; ll < r;) {
|
||||
size_t m = (ll + r) / 2;
|
||||
const translation &trans = idxDst[m];
|
||||
wchar_t s = trans.dst_at(j);
|
||||
if (s <= c) ll = m + 1; else r = m;
|
||||
}
|
||||
|
||||
const translation &trans = idxDst[l];
|
||||
if (j + 1 == trans.dst_len()) {
|
||||
// The first inverse translation of the run was a match (thus far). Save it.
|
||||
l_match = l;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// Character not found.
|
||||
output += c;
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (l_match < r_set) {
|
||||
// The saved inverse translation was an exact match.
|
||||
const translation &trans = idxDst[l_match];
|
||||
if (trans.src_len() && trans.src()[0] != L'#' && (!lc_db || !lc_db->IsLocalCharacter(trans.dst(), trans.dst_end(), lang))) {
|
||||
// Append source sequence.
|
||||
output.append(trans.src(), trans.src_end());
|
||||
i += trans.dst_len();
|
||||
if (trans.dst_len() != trans.src_len() && map) {
|
||||
// Mapping changed.
|
||||
map->push_back(ZRCola::mapping(i, output.length()));
|
||||
}
|
||||
} else {
|
||||
// Character is inhibited to inverse translate.
|
||||
output.append(trans.dst(), trans.dst_end());
|
||||
i += trans.dst_len();
|
||||
}
|
||||
} else {
|
||||
// The match was not found.
|
||||
output += input[i];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
|
||||
|
||||
namespace ZRCola {
|
||||
///
|
||||
/// Character group ID
|
||||
///
|
||||
typedef unsigned __int16 chrgrpid_t;
|
||||
|
||||
|
||||
///
|
||||
/// Character group database
|
||||
///
|
||||
@@ -46,33 +52,64 @@ namespace ZRCola {
|
||||
/// Character group data
|
||||
///
|
||||
struct chrgrp {
|
||||
unsigned __int16 id; ///< Character group id
|
||||
public:
|
||||
chrgrpid_t grp; ///< Character group ID
|
||||
unsigned __int16 rank; ///< Character group rank
|
||||
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
|
||||
|
||||
inline const wchar_t* get_chars() const
|
||||
protected:
|
||||
unsigned __int16 name_to; ///< Character group name end in \c data
|
||||
unsigned __int16 chrlst_to; ///< Character list end in \c data
|
||||
wchar_t data[]; ///< Character group name, character list, bit vector if particular character is displayed initially
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the character group
|
||||
///
|
||||
/// \param[in] grp Character group ID
|
||||
/// \param[in] rank Character group rank
|
||||
/// \param[in] name Character group name
|
||||
/// \param[in] name_len Number of UTF-16 characters in \p name
|
||||
/// \param[in] chrlst Character list (zero delimited)
|
||||
/// \param[in] chrlst_len Number of UTF-16 characters in \p chrlst (including zero delimiters)
|
||||
/// \param[in] chrshow Binary vector which particular character is displayed initially
|
||||
///
|
||||
inline chrgrp(
|
||||
_In_opt_ chrgrpid_t grp = 0,
|
||||
_In_opt_ unsigned __int16 rank = 0,
|
||||
_In_opt_z_count_(name_len) const wchar_t *name = NULL,
|
||||
_In_opt_ size_t name_len = 0,
|
||||
_In_opt_z_count_(chrlst_len) const wchar_t *chrlst = NULL,
|
||||
_In_opt_ size_t chrlst_len = 0,
|
||||
_In_opt_count_x_((chrlst_len + 15)/16) const unsigned __int16 *chrshow = NULL)
|
||||
{
|
||||
return data + name_len;
|
||||
this->grp = grp;
|
||||
this->rank = rank;
|
||||
this->name_to = static_cast<unsigned __int16>(name_len);
|
||||
if (name_len) memcpy(this->data, name, sizeof(wchar_t)*name_len);
|
||||
this->chrlst_to = static_cast<unsigned __int16>(this->name_to + chrlst_len);
|
||||
if (chrlst_len) {
|
||||
memcpy(this->data + this->name_to, chrlst, sizeof(wchar_t)*chrlst_len);
|
||||
memcpy(this->data + this->chrlst_to, chrshow, (chrlst_len + sizeof(*data)*8 - 1)/8);
|
||||
}
|
||||
}
|
||||
|
||||
inline wchar_t get_char(size_t index) const
|
||||
{
|
||||
assert(index < char_len);
|
||||
return data[name_len + index];
|
||||
}
|
||||
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 unsigned __int16* get_char_shown() const
|
||||
{
|
||||
return (const unsigned __int16*)(data + name_len + char_len);
|
||||
}
|
||||
inline const wchar_t* chrlst () const { return data + name_to; };
|
||||
inline wchar_t* chrlst () { return data + name_to; };
|
||||
inline const wchar_t* chrlst_end() const { return data + chrlst_to; };
|
||||
inline wchar_t* chrlst_end() { return data + chrlst_to; };
|
||||
inline unsigned __int16 chrlst_len() const { return chrlst_to - name_to; };
|
||||
|
||||
inline bool is_char_shown(size_t index) const
|
||||
{
|
||||
assert(index < char_len);
|
||||
return (data[name_len + char_len + index / 16] & (1 << (index % 16))) ? true : false;
|
||||
}
|
||||
inline const unsigned __int16* chrshow () const { return reinterpret_cast<const unsigned __int16*>(data + chrlst_to ); };
|
||||
inline unsigned __int16* chrshow () { return reinterpret_cast< unsigned __int16*>(data + chrlst_to ); };
|
||||
inline const unsigned __int16* chrshow_end() const { return reinterpret_cast<const unsigned __int16*>(data + chrlst_to + chrshow_len()); };
|
||||
inline unsigned __int16* chrshow_end() { return reinterpret_cast< unsigned __int16*>(data + chrlst_to + chrshow_len()); };
|
||||
inline unsigned __int16 chrshow_len() const { return (chrlst_len() + sizeof(*data)*8 - 1)/(sizeof(*data)*8); };
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
@@ -124,14 +161,17 @@ namespace ZRCola {
|
||||
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));
|
||||
unsigned __int16
|
||||
a_name_len = a.name_len(),
|
||||
b_name_len = b.name_len();
|
||||
int r = _wcsncoll(a.name(), b.name(), 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;
|
||||
if (a_name_len < b_name_len) return -1;
|
||||
else if (a_name_len > b_name_len) return +1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} idxRnk; ///< Rank index
|
||||
} idxRank; ///< Rank index
|
||||
|
||||
std::vector<unsigned __int16> data; ///< Character groups data
|
||||
|
||||
@@ -139,7 +179,7 @@ namespace ZRCola {
|
||||
///
|
||||
/// Constructs the database
|
||||
///
|
||||
inline chrgrp_db() : idxRnk(data) {}
|
||||
inline chrgrp_db() : idxRank(data) {}
|
||||
};
|
||||
|
||||
|
||||
@@ -147,7 +187,7 @@ namespace ZRCola {
|
||||
};
|
||||
|
||||
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::chrgrp_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"CGR";
|
||||
const ZRCola::recordid_t ZRCola::chrgrp_rec::id = *(ZRCola::recordid_t*)"CGR";
|
||||
|
||||
|
||||
///
|
||||
@@ -162,7 +202,7 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::c
|
||||
{
|
||||
// Write rank index.
|
||||
if (stream.fail()) return stream;
|
||||
stream << db.idxRnk;
|
||||
stream << db.idxRank;
|
||||
|
||||
// Write data count.
|
||||
auto data_count = db.data.size();
|
||||
@@ -196,7 +236,7 @@ inline std::ostream& operator <<(_In_ std::ostream& stream, _In_ const ZRCola::c
|
||||
inline std::istream& operator >>(_In_ std::istream& stream, _Out_ ZRCola::chrgrp_db &db)
|
||||
{
|
||||
// Read rank index.
|
||||
stream >> db.idxRnk;
|
||||
stream >> db.idxRank;
|
||||
if (!stream.good()) return stream;
|
||||
|
||||
// Read data count.
|
||||
|
||||
@@ -48,39 +48,75 @@ namespace ZRCola {
|
||||
/// Key sequence data
|
||||
///
|
||||
struct keyseq {
|
||||
public:
|
||||
enum modifiers_t {
|
||||
SHIFT = 1<<0, ///< SHIFT key was pressed
|
||||
CTRL = 1<<1, ///< CTRL key was pressed
|
||||
ALT = 1<<2, ///< ALT key was pressed
|
||||
};
|
||||
|
||||
wchar_t chr; ///< Character
|
||||
unsigned __int16 seq_len; ///< \c seq length
|
||||
struct key_t {
|
||||
wchar_t key; ///< Key
|
||||
unsigned __int16 modifiers; ///< Modifiers (bitwise combination of SHIFT, CTRL and ALT)
|
||||
} seq[]; ///< Key sequence
|
||||
};
|
||||
|
||||
protected:
|
||||
unsigned __int16 chr_to; ///< Character end in \c data
|
||||
unsigned __int16 seq_to; ///< Key sequence end in \c data
|
||||
wchar_t data[]; ///< Character and key sequence
|
||||
|
||||
public:
|
||||
///
|
||||
/// Constructs the key sequence
|
||||
///
|
||||
/// \param[in] seq Key sequence
|
||||
/// \param[in] seq_count Number of UTF-16 characters in \p seq
|
||||
/// \param[in] chr Character
|
||||
/// \param[in] chr_len Number of UTF-16 characters in \p chr
|
||||
///
|
||||
inline keyseq(
|
||||
_In_opt_count_(seq_count) const key_t *seq = NULL,
|
||||
_In_opt_ size_t seq_count = 0,
|
||||
_In_opt_z_count_(chr_len) const wchar_t *chr = NULL,
|
||||
_In_opt_ size_t chr_len = 0)
|
||||
{
|
||||
this->chr_to = static_cast<unsigned __int16>(chr_len);
|
||||
if (chr_len) memcpy(this->data, chr, sizeof(wchar_t)*chr_len);
|
||||
this->seq_to = static_cast<unsigned __int16>(this->chr_to + seq_count * sizeof(key_t) / sizeof(*data));
|
||||
if (seq_count) memcpy(this->data + this->chr_to, seq, sizeof(key_t)*seq_count);
|
||||
}
|
||||
|
||||
inline const wchar_t* chr () const { return data; };
|
||||
inline wchar_t* chr () { return data; };
|
||||
inline const wchar_t* chr_end() const { return data + chr_to; };
|
||||
inline wchar_t* chr_end() { return data + chr_to; };
|
||||
inline unsigned __int16 chr_len() const { return chr_to; };
|
||||
|
||||
inline const key_t* seq () const { return reinterpret_cast<const key_t*>(data + chr_to); };
|
||||
inline key_t* seq () { return reinterpret_cast< key_t*>(data + chr_to); };
|
||||
inline const key_t* seq_end() const { return reinterpret_cast<const key_t*>(data + seq_to); };
|
||||
inline key_t* seq_end() { return reinterpret_cast< key_t*>(data + seq_to); };
|
||||
inline unsigned __int16 seq_len() const { return (seq_to - chr_to) * sizeof(*data) / sizeof(key_t); };
|
||||
|
||||
///
|
||||
/// Compares two key sequences
|
||||
///
|
||||
/// \param[in] seq_a First key sequence
|
||||
/// \param[in] count_a Number of keys in sequence \p seq_a
|
||||
/// \param[in] seq_b Second key sequence
|
||||
/// \param[in] count_b Number of keys in sequence \p seq_b
|
||||
/// \param[in] seq_a First key sequence
|
||||
/// \param[in] len_a Number of keys in sequence \p seq_a
|
||||
/// \param[in] seq_b Second key sequence
|
||||
/// \param[in] len_b Number of keys in sequence \p seq_b
|
||||
///
|
||||
/// \returns
|
||||
/// - <0 when seq_a < seq_b
|
||||
/// - =0 when seq_a == seq_b
|
||||
/// - >0 when seq_a > seq_b
|
||||
///
|
||||
static inline int CompareSequence(const key_t *seq_a, unsigned __int16 count_a, const key_t *seq_b, unsigned __int16 count_b)
|
||||
static inline int CompareSequence(_In_ const key_t *seq_a, _In_ size_t len_a, _In_ const key_t *seq_b, _In_ size_t len_b)
|
||||
{
|
||||
for (unsigned __int16 i = 0; ; i++) {
|
||||
if (i >= count_a && i >= count_b) return 0;
|
||||
else if (i >= count_a && i < count_b) return -1;
|
||||
else if (i < count_a && i >= count_b) return +1;
|
||||
for (size_t i = 0; ; i++) {
|
||||
if (i >= len_a && i >= len_b) return 0;
|
||||
else if (i >= len_a && i < len_b) return -1;
|
||||
else if (i < len_a && i >= len_b) return +1;
|
||||
else if (seq_a[i].key < seq_b[i].key ) return -1;
|
||||
else if (seq_a[i].key > seq_b[i].key ) return +1;
|
||||
else if (seq_a[i].modifiers < seq_b[i].modifiers) return -1;
|
||||
@@ -116,8 +152,8 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const keyseq &a, _In_ const keyseq &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return +1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -135,10 +171,10 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare_sort(_In_ const keyseq &a, _In_ const keyseq &b) const
|
||||
{
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return +1;
|
||||
int r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
int r = keyseq::CompareSequence(a.seq, a.seq_len, b.seq, b.seq_len);
|
||||
r = keyseq::CompareSequence(a.seq(), a.seq_len(), b.seq(), b.seq_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
@@ -172,7 +208,7 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare(_In_ const keyseq &a, _In_ const keyseq &b) const
|
||||
{
|
||||
int r = keyseq::CompareSequence(a.seq, a.seq_len, b.seq, b.seq_len);
|
||||
int r = keyseq::CompareSequence(a.seq(), a.seq_len(), b.seq(), b.seq_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
@@ -191,11 +227,11 @@ namespace ZRCola {
|
||||
///
|
||||
virtual int compare_sort(_In_ const keyseq &a, _In_ const keyseq &b) const
|
||||
{
|
||||
int r = keyseq::CompareSequence(a.seq, a.seq_len, b.seq, b.seq_len);
|
||||
int r = keyseq::CompareSequence(a.seq(), a.seq_len(), b.seq(), b.seq_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
if (a.chr < b.chr) return -1;
|
||||
else if (a.chr > b.chr) return +1;
|
||||
r = ZRCola::CompareString(a.chr(), a.chr_len(), b.chr(), b.chr_len());
|
||||
if (r != 0) return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -252,7 +288,7 @@ namespace ZRCola {
|
||||
};
|
||||
|
||||
|
||||
const ZRCola::recordid_t stdex::idrec::record<ZRCola::keyseq_db, ZRCola::recordid_t, ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>::id = *(ZRCola::recordid_t*)"KEY";
|
||||
const ZRCola::recordid_t ZRCola::keyseq_rec::id = *(ZRCola::recordid_t*)"KEY";
|
||||
|
||||
|
||||
///
|
||||
|
||||
Submodule lib/wxExtend updated: e3390f9a2f...a57c87aaaa
Binary file not shown.
@@ -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,18 @@ msgstr ""
|
||||
|
||||
msgid "Units"
|
||||
msgstr ""
|
||||
|
||||
msgid "ZRCola Composed"
|
||||
msgstr ""
|
||||
|
||||
msgid "ZRCola Decomposed"
|
||||
msgstr ""
|
||||
|
||||
msgid "l+j l|j"
|
||||
msgstr ""
|
||||
|
||||
msgid "no + |"
|
||||
msgstr ""
|
||||
|
||||
msgid "small Case"
|
||||
msgstr ""
|
||||
|
||||
@@ -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,26 @@ msgstr ""
|
||||
|
||||
msgid "Units"
|
||||
msgstr ""
|
||||
|
||||
msgid "ZRCola Composed"
|
||||
msgstr ""
|
||||
|
||||
msgid "ZRCola Decomposed"
|
||||
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)"
|
||||
|
||||
@@ -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,26 @@ msgstr "украинский"
|
||||
|
||||
msgid "Units"
|
||||
msgstr "Единицы"
|
||||
|
||||
msgid "ZRCola Composed"
|
||||
msgstr ""
|
||||
|
||||
msgid "ZRCola Decomposed"
|
||||
msgstr ""
|
||||
|
||||
msgid "l+j l|j"
|
||||
msgstr ""
|
||||
|
||||
msgid "no + |"
|
||||
msgstr ""
|
||||
|
||||
msgid "small Case"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Modified Greek"
|
||||
#~ msgstr "Изменяющие знаки"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Old Greek"
|
||||
#~ msgstr "Греческие знаки"
|
||||
|
||||
@@ -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,21 @@ msgstr "ukrajinščina"
|
||||
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"
|
||||
|
||||
msgid "no + |"
|
||||
msgstr "brez + |"
|
||||
|
||||
msgid "small Case"
|
||||
msgstr "male črke"
|
||||
|
||||
#~ msgid "Letter b"
|
||||
#~ msgstr "Črka b"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user