feat: add font customization (#973)

* action: auto clang format changes

action: clang-format

* feat: add separator tab to configure the font family for the web engine.

feat: custom fonts

feat: add custom font

i18n: update crowdin translation files

* [autofix.ci] apply automated fixes

* feat: add notice about the font customization

* feat: adjust interface layout

* i18n: update transaltion source

* fix: code smells

* feat: custom font layout adjustment

* i18n: update translation items

* feat: adjust layout of custom fonts

* i18n: new

* feat: adjust layout

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
xiaoyifang 2023-07-16 18:54:07 +08:00 committed by GitHub
parent 534d8c2e96
commit ce8b8a60bb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 752 additions and 511 deletions

View file

@ -28,7 +28,7 @@ jobs:
fetch-depth: 2 fetch-depth: 2
# format the latest commit # format the latest commit
- name: ubuntu install clang-format - name: ubuntu install clang-format
if: ${{ github.event.pull_request.head.repo.full_name == 'xiaoyifang/goldendict-ng' }} # if: ${{ github.event.pull_request.head.repo.full_name == 'xiaoyifang/goldendict-ng' }}
id: clang-format id: clang-format
run: | run: |
sudo apt-get install git lsb-release wget software-properties-common sudo apt-get install git lsb-release wget software-properties-common
@ -37,13 +37,6 @@ jobs:
sudo apt-get install -y clang-format sudo apt-get install -y clang-format
git-clang-format --style=file HEAD^ git-clang-format --style=file HEAD^
- uses: EndBug/add-and-commit@v9
if: ${{ github.event.pull_request.head.repo.full_name == 'xiaoyifang/goldendict-ng' }}
with:
default_author: github_actor
message: 🎨 apply clang-format changes
- uses: autofix-ci/action@89762f9c25dd85f6b78cd40e521232e403357ec0 - uses: autofix-ci/action@89762f9c25dd85f6b78cd40e521232e403357ec0

4
locale/.clang-format Normal file
View file

@ -0,0 +1,4 @@
---
DisableFormat: true
SortIncludes: Never
...

View file

@ -186,33 +186,33 @@
<context> <context>
<name>ArticleView</name> <name>ArticleView</name>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1928"/> <location filename="../src/ui/articleview.cc" line="1929"/>
<source>Failed to create temporary file.</source> <source>Failed to create temporary file.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1639"/> <location filename="../src/ui/articleview.cc" line="1640"/>
<source>&amp;Look up &quot;%1&quot;</source> <source>&amp;Look up &quot;%1&quot;</source>
<translation> &quot;%1&quot;(&amp;L)</translation> <translation> &quot;%1&quot;(&amp;L)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1647"/> <location filename="../src/ui/articleview.cc" line="1648"/>
<source>Look up &quot;%1&quot; in &amp;New Tab</source> <source>Look up &quot;%1&quot; in &amp;New Tab</source>
<translation> &quot;%1&quot;(&amp;N)</translation> <translation> &quot;%1&quot;(&amp;N)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1214"/> <location filename="../src/ui/articleview.cc" line="1215"/>
<location filename="../src/ui/articleview.cc" line="1391"/> <location filename="../src/ui/articleview.cc" line="1392"/>
<source>The referenced resource doesn&apos;t exist.</source> <source>The referenced resource doesn&apos;t exist.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1939"/> <location filename="../src/ui/articleview.cc" line="1940"/>
<source>Failed to auto-open resource file, try opening manually: %1.</source> <source>Failed to auto-open resource file, try opening manually: %1.</source>
<translation>%1.</translation> <translation>%1.</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1673"/> <location filename="../src/ui/articleview.cc" line="1674"/>
<source>Look up &quot;%1&quot; in %2</source> <source>Look up &quot;%1&quot; in %2</source>
<translation> %2 &quot;%1&quot;</translation> <translation> %2 &quot;%1&quot;</translation>
</message> </message>
@ -232,105 +232,105 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1681"/> <location filename="../src/ui/articleview.cc" line="1682"/>
<source>Look up &quot;%1&quot; in %2 in &amp;New Tab</source> <source>Look up &quot;%1&quot; in %2 in &amp;New Tab</source>
<translation> %2 &quot;%1&quot; 使(&amp;N)</translation> <translation> %2 &quot;%1&quot; 使(&amp;N)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1597"/> <location filename="../src/ui/articleview.cc" line="1598"/>
<source>Open Link in New &amp;Tab</source> <source>Open Link in New &amp;Tab</source>
<translation>(&amp;T)</translation> <translation>(&amp;T)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1604"/> <location filename="../src/ui/articleview.cc" line="1605"/>
<source>Open Link in &amp;External Browser</source> <source>Open Link in &amp;External Browser</source>
<translation>(&amp;E)</translation> <translation>(&amp;E)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="854"/> <location filename="../src/ui/articleview.cc" line="855"/>
<source>Resource</source> <source>Resource</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="859"/> <location filename="../src/ui/articleview.cc" line="860"/>
<source>Audio</source> <source>Audio</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="864"/> <location filename="../src/ui/articleview.cc" line="865"/>
<source>TTS Voice</source> <source>TTS Voice</source>
<translation>TTS </translation> <translation>TTS </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="869"/> <location filename="../src/ui/articleview.cc" line="870"/>
<source>Picture</source> <source>Picture</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="876"/> <location filename="../src/ui/articleview.cc" line="877"/>
<source>Video</source> <source>Video</source>
<translatorcomment>: %1</translatorcomment> <translatorcomment>: %1</translatorcomment>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="885"/> <location filename="../src/ui/articleview.cc" line="886"/>
<source>Video: %1</source> <source>Video: %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="902"/> <location filename="../src/ui/articleview.cc" line="903"/>
<source>Definition from dictionary &quot;%1&quot;: %2</source> <source>Definition from dictionary &quot;%1&quot;: %2</source>
<translation>&quot;%1&quot;: %2</translation> <translation>&quot;%1&quot;: %2</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="910"/> <location filename="../src/ui/articleview.cc" line="911"/>
<source>Definition: %1</source> <source>Definition: %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1249"/> <location filename="../src/ui/articleview.cc" line="1250"/>
<source>The referenced audio program doesn&apos;t exist.</source> <source>The referenced audio program doesn&apos;t exist.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1591"/> <location filename="../src/ui/articleview.cc" line="1592"/>
<source>Op&amp;en Link</source> <source>Op&amp;en Link</source>
<translation>(&amp;E)</translation> <translation>(&amp;E)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1692"/> <location filename="../src/ui/articleview.cc" line="1693"/>
<source>Save &amp;Bookmark &quot;%1...&quot;</source> <source>Save &amp;Bookmark &quot;%1...&quot;</source>
<translation>&amp;S%1...</translation> <translation>&amp;S%1...</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1969"/> <location filename="../src/ui/articleview.cc" line="1970"/>
<source>WARNING: Audio Player: %1</source> <source>WARNING: Audio Player: %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1139"/> <location filename="../src/ui/articleview.cc" line="1140"/>
<location filename="../src/ui/articleview.cc" line="1174"/> <location filename="../src/ui/articleview.cc" line="1175"/>
<location filename="../src/ui/articleview.cc" line="1391"/> <location filename="../src/ui/articleview.cc" line="1392"/>
<source>ERROR: %1</source> <source>ERROR: %1</source>
<translation> %1</translation> <translation> %1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1841"/> <location filename="../src/ui/articleview.cc" line="1842"/>
<source>Save sound</source> <source>Save sound</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1856"/> <location filename="../src/ui/articleview.cc" line="1857"/>
<source>Save image</source> <source>Save image</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1858"/> <location filename="../src/ui/articleview.cc" line="1859"/>
<source>Image files (*.bmp *.jpg *.png *.tif);;All files (*.*)</source> <source>Image files (*.bmp *.jpg *.png *.tif);;All files (*.*)</source>
<translation> (*.bmp *.jpg *.png *.tif);; (*.*)</translation> <translation> (*.bmp *.jpg *.png *.tif);; (*.*)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1620"/> <location filename="../src/ui/articleview.cc" line="1621"/>
<source>Save &amp;image...</source> <source>Save &amp;image...</source>
<translation>(&amp;I)...</translation> <translation>(&amp;I)...</translation>
</message> </message>
@ -345,38 +345,38 @@
<translation>%1/%2</translation> <translation>%1/%2</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1627"/> <location filename="../src/ui/articleview.cc" line="1628"/>
<source>Save s&amp;ound...</source> <source>Save s&amp;ound...</source>
<translation>(&amp;O)...</translation> <translation>(&amp;O)...</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1652"/> <location filename="../src/ui/articleview.cc" line="1653"/>
<source>Send &quot;%1&quot; to input line</source> <source>Send &quot;%1&quot; to input line</source>
<translation> &quot;%1&quot; </translation> <translation> &quot;%1&quot; </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1658"/> <location filename="../src/ui/articleview.cc" line="1659"/>
<location filename="../src/ui/articleview.cc" line="1710"/> <location filename="../src/ui/articleview.cc" line="1711"/>
<source>&amp;Add &quot;%1&quot; to history</source> <source>&amp;Add &quot;%1&quot; to history</source>
<translation> &quot;%1&quot; (&amp;A)</translation> <translation> &quot;%1&quot; (&amp;A)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1700"/> <location filename="../src/ui/articleview.cc" line="1701"/>
<source>&amp;Send Current Article to Anki</source> <source>&amp;Send Current Article to Anki</source>
<translation> Anki(&amp;S)</translation> <translation> Anki(&amp;S)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1701"/> <location filename="../src/ui/articleview.cc" line="1702"/>
<source>&amp;Send selected text to Anki</source> <source>&amp;Send selected text to Anki</source>
<translation> Anki(&amp;S)</translation> <translation> Anki(&amp;S)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1843"/> <location filename="../src/ui/articleview.cc" line="1844"/>
<source>Sound files (*.wav *.opus *.ogg *.oga *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape *.spx);;All files (*.*)</source> <source>Sound files (*.wav *.opus *.ogg *.oga *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape *.spx);;All files (*.*)</source>
<translation> (*.wav *.opus *.ogg *.oga *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape *.spx);; (*.*)</translation> <translation> (*.wav *.opus *.ogg *.oga *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape *.spx);; (*.*)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="1913"/> <location filename="../src/ui/articleview.cc" line="1914"/>
<source>Failed to play sound file: %1</source> <source>Failed to play sound file: %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
@ -813,11 +813,21 @@ between classic and school orthography in cyrillic)</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/dictinfo.cc" line="30"/> <location filename="../src/ui/dictinfo.cc" line="31"/>
<source>Edit the dictionary via command: <source>Edit the dictionary via command:
%1</source> %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message>
<location filename="../src/ui/dictinfo.ui"/>
<source>Index filename:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/dictinfo.ui"/>
<source>Open index folder</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DictListModel</name> <name>DictListModel</name>
@ -1457,12 +1467,12 @@ between classic and school orthography in cyrillic)</source>
<translation> GoldenDict-ng</translation> <translation> GoldenDict-ng</translation>
</message> </message>
<message> <message>
<location filename="../src/initializing.cc" line="19"/> <location filename="../src/initializing.cc" line="18"/>
<source>Please wait...</source> <source>Please wait...</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="../src/initializing.cc" line="28"/> <location filename="../src/initializing.cc" line="27"/>
<source>Indexing...</source> <source>Indexing...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2727,17 +2737,17 @@ between classic and school orthography in cyrillic)</source>
<translation>F4</translation> <translation>F4</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1529"/> <location filename="../src/ui/mainwindow.cc" line="1560"/>
<source>All</source> <source>All</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="200"/> <location filename="../src/ui/mainwindow.cc" line="224"/>
<source>Back</source> <source>Back</source>
<translation>退</translation> <translation>退</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1502"/> <location filename="../src/ui/mainwindow.cc" line="1533"/>
<source>%1 dictionaries, %2 articles, %3 words</source> <source>%1 dictionaries, %2 articles, %3 words</source>
<translation>%1%2%3</translation> <translation>%1%2%3</translation>
</message> </message>
@ -2763,12 +2773,12 @@ between classic and school orthography in cyrillic)</source>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.ui"/> <location filename="../src/ui/mainwindow.ui"/>
<location filename="../src/ui/mainwindow.cc" line="383"/> <location filename="../src/ui/mainwindow.cc" line="407"/>
<source>&amp;Quit</source> <source>&amp;Quit</source>
<translation>退(&amp;Q)</translation> <translation>退(&amp;Q)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3279"/> <location filename="../src/ui/mainwindow.cc" line="3305"/>
<source>Error</source> <source>Error</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2783,12 +2793,12 @@ between classic and school orthography in cyrillic)</source>
<translation>(&amp;C)</translation> <translation>(&amp;C)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3279"/> <location filename="../src/ui/mainwindow.cc" line="3305"/>
<source>Can&apos;t save article: %1</source> <source>Can&apos;t save article: %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="246"/> <location filename="../src/ui/mainwindow.cc" line="270"/>
<source>Zoom In</source> <source>Zoom In</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2818,7 +2828,7 @@ between classic and school orthography in cyrillic)</source>
<translation>(&amp;S)</translation> <translation>(&amp;S)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3262"/> <location filename="../src/ui/mainwindow.cc" line="3288"/>
<source>Save Article As</source> <source>Save Article As</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2848,17 +2858,17 @@ between classic and school orthography in cyrillic)</source>
<translation>(&amp;H)</translation> <translation>(&amp;H)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="2961"/> <location filename="../src/ui/mainwindow.cc" line="2987"/>
<source>New Release Available</source> <source>New Release Available</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="250"/> <location filename="../src/ui/mainwindow.cc" line="274"/>
<source>Zoom Out</source> <source>Zoom Out</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="376"/> <location filename="../src/ui/mainwindow.cc" line="400"/>
<source>Show &amp;Main Window</source> <source>Show &amp;Main Window</source>
<translation>(&amp;M)</translation> <translation>(&amp;M)</translation>
</message> </message>
@ -2868,27 +2878,27 @@ between classic and school orthography in cyrillic)</source>
<translation> GoldenDict-ng</translation> <translation> GoldenDict-ng</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="2968"/> <location filename="../src/ui/mainwindow.cc" line="2994"/>
<source>Download</source> <source>Download</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3157"/> <location filename="../src/ui/mainwindow.cc" line="3183"/>
<source>Page Setup</source> <source>Page Setup</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="254"/> <location filename="../src/ui/mainwindow.cc" line="278"/>
<source>Normal Size</source> <source>Normal Size</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="2811"/> <location filename="../src/ui/mainwindow.cc" line="2837"/>
<source>Failed to initialize hotkeys monitoring mechanism.&lt;br&gt;Make sure your XServer has RECORD extension turned on.</source> <source>Failed to initialize hotkeys monitoring mechanism.&lt;br&gt;Make sure your XServer has RECORD extension turned on.</source>
<translation>&lt;br&gt; XServer RECORD </translation> <translation>&lt;br&gt; XServer RECORD </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="2962"/> <location filename="../src/ui/mainwindow.cc" line="2988"/>
<source>Version &lt;b&gt;%1&lt;/b&gt; of GoldenDict is now available for download.&lt;br&gt;Click &lt;b&gt;Download&lt;/b&gt; to get to the download page.</source> <source>Version &lt;b&gt;%1&lt;/b&gt; of GoldenDict is now available for download.&lt;br&gt;Click &lt;b&gt;Download&lt;/b&gt; to get to the download page.</source>
<translation> GoldenDict &lt;b&gt;%1&lt;/b&gt;&lt;br&gt; <translation> GoldenDict &lt;b&gt;%1&lt;/b&gt;&lt;br&gt;
&lt;b&gt;&lt;/b&gt;</translation> &lt;b&gt;&lt;/b&gt;</translation>
@ -2904,12 +2914,12 @@ between classic and school orthography in cyrillic)</source>
<translation>Ctrl+F5</translation> <translation>Ctrl+F5</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="583"/> <location filename="../src/ui/mainwindow.cc" line="607"/>
<source>Loading...</source> <source>Loading...</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1688"/> <location filename="../src/ui/mainwindow.cc" line="1719"/>
<source>(untitled)</source> <source>(untitled)</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2920,12 +2930,12 @@ between classic and school orthography in cyrillic)</source>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.ui"/> <location filename="../src/ui/mainwindow.ui"/>
<location filename="../src/ui/mainwindow.cc" line="729"/> <location filename="../src/ui/mainwindow.cc" line="757"/>
<source>Welcome!</source> <source>Welcome!</source>
<translation>使</translation> <translation>使</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="233"/> <location filename="../src/ui/mainwindow.cc" line="257"/>
<source>Pronounce Word (Alt+S)</source> <source>Pronounce Word (Alt+S)</source>
<translation>(Alt+S)</translation> <translation>(Alt+S)</translation>
</message> </message>
@ -2935,22 +2945,22 @@ between classic and school orthography in cyrillic)</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="2969"/> <location filename="../src/ui/mainwindow.cc" line="2995"/>
<source>Skip This Release</source> <source>Skip This Release</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="202"/> <location filename="../src/ui/mainwindow.cc" line="226"/>
<source>Forward</source> <source>Forward</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3179"/> <location filename="../src/ui/mainwindow.cc" line="3205"/>
<source>Print Article</source> <source>Print Article</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3158"/> <location filename="../src/ui/mainwindow.cc" line="3184"/>
<source>No printer is available. Please install one first.</source> <source>No printer is available. Please install one first.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2975,42 +2985,42 @@ between classic and school orthography in cyrillic)</source>
<translation>(&amp;Z)</translation> <translation>(&amp;Z)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="364"/> <location filename="../src/ui/mainwindow.cc" line="388"/>
<source>Words Zoom In</source> <source>Words Zoom In</source>
<translation> - </translation> <translation> - </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="366"/> <location filename="../src/ui/mainwindow.cc" line="390"/>
<source>Words Zoom Out</source> <source>Words Zoom Out</source>
<translation> - </translation> <translation> - </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="368"/> <location filename="../src/ui/mainwindow.cc" line="392"/>
<source>Words Normal Size</source> <source>Words Normal Size</source>
<translation> - </translation> <translation> - </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="425"/> <location filename="../src/ui/mainwindow.cc" line="449"/>
<source>Close current tab</source> <source>Close current tab</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="433"/> <location filename="../src/ui/mainwindow.cc" line="457"/>
<source>Close all tabs</source> <source>Close all tabs</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="440"/> <location filename="../src/ui/mainwindow.cc" line="464"/>
<source>Close all tabs except current</source> <source>Close all tabs except current</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="415"/> <location filename="../src/ui/mainwindow.cc" line="439"/>
<source>Opened tabs</source> <source>Opened tabs</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="592"/> <location filename="../src/ui/mainwindow.cc" line="616"/>
<source>New Tab</source> <source>New Tab</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3025,65 +3035,65 @@ between classic and school orthography in cyrillic)</source>
<translation>(&amp;C)</translation> <translation>(&amp;C)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="123"/> <location filename="../src/ui/mainwindow.cc" line="147"/>
<source>&amp;Menubar</source> <source>&amp;Menubar</source>
<translation>(&amp;M)</translation> <translation>(&amp;M)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="340"/> <location filename="../src/ui/mainwindow.cc" line="364"/>
<source>Found in Dictionaries:</source> <source>Found in Dictionaries:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="460"/> <location filename="../src/ui/mainwindow.cc" line="484"/>
<source>Add all tabs to Favorites</source> <source>Add all tabs to Favorites</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="945"/> <location filename="../src/ui/mainwindow.cc" line="971"/>
<source>WARNING: %1</source> <source>WARNING: %1</source>
<translation type="unfinished"> %1</translation> <translation type="unfinished"> %1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1075"/> <location filename="../src/ui/mainwindow.cc" line="1101"/>
<source>String to search in dictionaries. The wildcards &apos;*&apos;, &apos;?&apos; and sets of symbols &apos;[...]&apos; are allowed. <source>String to search in dictionaries. The wildcards &apos;*&apos;, &apos;?&apos; and sets of symbols &apos;[...]&apos; are allowed.
To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &apos;\*&apos;, &apos;\?&apos;, &apos;\[&apos;, &apos;\]&apos; respectively</source> To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &apos;\*&apos;, &apos;\?&apos;, &apos;\[&apos;, &apos;\]&apos; respectively</source>
<translation>使*?[...] <translation>使*?[...]
*?[]使\*\?\[\]</translation> *?[]使\*\?\[\]</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1637"/> <location filename="../src/ui/mainwindow.cc" line="1668"/>
<source>Open Tabs List</source> <source>Open Tabs List</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1884"/> <location filename="../src/ui/mainwindow.cc" line="1915"/>
<location filename="../src/ui/mainwindow.cc" line="1953"/> <location filename="../src/ui/mainwindow.cc" line="1979"/>
<location filename="../src/ui/mainwindow.cc" line="4318"/> <location filename="../src/ui/mainwindow.cc" line="4344"/>
<location filename="../src/ui/mainwindow.cc" line="4346"/> <location filename="../src/ui/mainwindow.cc" line="4372"/>
<location filename="../src/ui/mainwindow.cc" line="4385"/> <location filename="../src/ui/mainwindow.cc" line="4411"/>
<source>Remove current tab from Favorites</source> <source>Remove current tab from Favorites</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="1908"/> <location filename="../src/ui/mainwindow.cc" line="1939"/>
<source>%1 - %2</source> <source>%1 - %2</source>
<translation>%1 - %2</translation> <translation>%1 - %2</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3063"/> <location filename="../src/ui/mainwindow.cc" line="3089"/>
<source>You have chosen to hide a menubar. Use %1 to show it back.</source> <source>You have chosen to hide a menubar. Use %1 to show it back.</source>
<translation>使 %1 </translation> <translation>使 %1 </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3065"/> <location filename="../src/ui/mainwindow.cc" line="3091"/>
<source>Ctrl+M</source> <source>Ctrl+M</source>
<translation>Ctrl+M</translation> <translation>Ctrl+M</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.ui"/> <location filename="../src/ui/mainwindow.ui"/>
<location filename="../src/ui/mainwindow.cc" line="3625"/> <location filename="../src/ui/mainwindow.cc" line="3651"/>
<location filename="../src/ui/mainwindow.cc" line="3635"/> <location filename="../src/ui/mainwindow.cc" line="3661"/>
<source>&amp;Show</source> <source>&amp;Show</source>
<translation>(&amp;S)</translation> <translation>(&amp;S)</translation>
</message> </message>
@ -3093,37 +3103,37 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
<translation>(&amp;E)</translation> <translation>(&amp;E)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3621"/> <location filename="../src/ui/mainwindow.cc" line="3647"/>
<location filename="../src/ui/mainwindow.cc" line="3632"/> <location filename="../src/ui/mainwindow.cc" line="3658"/>
<source>&amp;Hide</source> <source>&amp;Hide</source>
<translation>(&amp;H)</translation> <translation>(&amp;H)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3673"/> <location filename="../src/ui/mainwindow.cc" line="3699"/>
<source>Export history to file</source> <source>Export history to file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3675"/> <location filename="../src/ui/mainwindow.cc" line="3701"/>
<location filename="../src/ui/mainwindow.cc" line="3736"/> <location filename="../src/ui/mainwindow.cc" line="3762"/>
<location filename="../src/ui/mainwindow.cc" line="3851"/> <location filename="../src/ui/mainwindow.cc" line="3877"/>
<source>Text files (*.txt);;All files (*.*)</source> <source>Text files (*.txt);;All files (*.*)</source>
<translation> (*.txt);; (*.*)</translation> <translation> (*.txt);; (*.*)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3719"/> <location filename="../src/ui/mainwindow.cc" line="3745"/>
<source>History export complete</source> <source>History export complete</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3684"/> <location filename="../src/ui/mainwindow.cc" line="3710"/>
<location filename="../src/ui/mainwindow.cc" line="3697"/> <location filename="../src/ui/mainwindow.cc" line="3723"/>
<location filename="../src/ui/mainwindow.cc" line="3714"/> <location filename="../src/ui/mainwindow.cc" line="3740"/>
<location filename="../src/ui/mainwindow.cc" line="3820"/> <location filename="../src/ui/mainwindow.cc" line="3846"/>
<location filename="../src/ui/mainwindow.cc" line="3828"/> <location filename="../src/ui/mainwindow.cc" line="3854"/>
<location filename="../src/ui/mainwindow.cc" line="3859"/> <location filename="../src/ui/mainwindow.cc" line="3885"/>
<location filename="../src/ui/mainwindow.cc" line="3867"/> <location filename="../src/ui/mainwindow.cc" line="3893"/>
<location filename="../src/ui/mainwindow.cc" line="3877"/> <location filename="../src/ui/mainwindow.cc" line="3903"/>
<source>Export error: </source> <source>Export error: </source>
<translation></translation> <translation></translation>
</message> </message>
@ -3138,96 +3148,96 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
<translation>(&amp;I)</translation> <translation>(&amp;I)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3734"/> <location filename="../src/ui/mainwindow.cc" line="3760"/>
<source>Import history from file</source> <source>Import history from file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3783"/> <location filename="../src/ui/mainwindow.cc" line="3809"/>
<source>Import error: invalid data in file</source> <source>Import error: invalid data in file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3789"/> <location filename="../src/ui/mainwindow.cc" line="3815"/>
<source>History import complete</source> <source>History import complete</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3746"/> <location filename="../src/ui/mainwindow.cc" line="3772"/>
<location filename="../src/ui/mainwindow.cc" line="3777"/> <location filename="../src/ui/mainwindow.cc" line="3803"/>
<location filename="../src/ui/mainwindow.cc" line="3909"/> <location filename="../src/ui/mainwindow.cc" line="3935"/>
<source>Import error: </source> <source>Import error: </source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3809"/> <location filename="../src/ui/mainwindow.cc" line="3835"/>
<source>Export Favorites to file</source> <source>Export Favorites to file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3811"/> <location filename="../src/ui/mainwindow.cc" line="3837"/>
<source>XML files (*.xml);;All files (*.*)</source> <source>XML files (*.xml);;All files (*.*)</source>
<translation>XML (*.xml);; (*.*)</translation> <translation>XML (*.xml);; (*.*)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3833"/> <location filename="../src/ui/mainwindow.cc" line="3859"/>
<location filename="../src/ui/mainwindow.cc" line="3882"/> <location filename="../src/ui/mainwindow.cc" line="3908"/>
<source>Favorites export complete</source> <source>Favorites export complete</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3849"/> <location filename="../src/ui/mainwindow.cc" line="3875"/>
<source>Export Favorites to file as plain list</source> <source>Export Favorites to file as plain list</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3897"/> <location filename="../src/ui/mainwindow.cc" line="3923"/>
<source>Import Favorites from file</source> <source>Import Favorites from file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3899"/> <location filename="../src/ui/mainwindow.cc" line="3925"/>
<source>XML files (*.xml);;Txt files (*.txt);;All files (*.*)</source> <source>XML files (*.xml);;Txt files (*.txt);;All files (*.*)</source>
<translation>XML文件(*.xml);;(*.txt);;(*.*)</translation> <translation>XML文件(*.xml);;(*.txt);;(*.*)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3929"/> <location filename="../src/ui/mainwindow.cc" line="3955"/>
<source>Favorites import complete</source> <source>Favorites import complete</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3917"/> <location filename="../src/ui/mainwindow.cc" line="3943"/>
<location filename="../src/ui/mainwindow.cc" line="3923"/> <location filename="../src/ui/mainwindow.cc" line="3949"/>
<source>Data parsing error</source> <source>Data parsing error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="4136"/> <location filename="../src/ui/mainwindow.cc" line="4162"/>
<source>Dictionary info</source> <source>Dictionary info</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="4140"/> <location filename="../src/ui/mainwindow.cc" line="4166"/>
<source>Dictionary headwords</source> <source>Dictionary headwords</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="4142"/> <location filename="../src/ui/mainwindow.cc" line="4168"/>
<source>Open dictionary folder</source> <source>Open dictionary folder</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="4148"/> <location filename="../src/ui/mainwindow.cc" line="4174"/>
<source>Edit dictionary</source> <source>Edit dictionary</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="4293"/> <location filename="../src/ui/mainwindow.cc" line="4319"/>
<source>Now indexing for full-text search: </source> <source>Now indexing for full-text search: </source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="4331"/> <location filename="../src/ui/mainwindow.cc" line="4357"/>
<source>Remove headword &quot;%1&quot; from Favorites?</source> <source>Remove headword &quot;%1&quot; from Favorites?</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
@ -3278,7 +3288,7 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.ui"/> <location filename="../src/ui/mainwindow.ui"/>
<location filename="../src/ui/mainwindow.cc" line="298"/> <location filename="../src/ui/mainwindow.cc" line="322"/>
<source>Menu Button</source> <source>Menu Button</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3329,10 +3339,10 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.ui"/> <location filename="../src/ui/mainwindow.ui"/>
<location filename="../src/ui/mainwindow.cc" line="269"/> <location filename="../src/ui/mainwindow.cc" line="293"/>
<location filename="../src/ui/mainwindow.cc" line="1888"/> <location filename="../src/ui/mainwindow.cc" line="1919"/>
<location filename="../src/ui/mainwindow.cc" line="1957"/> <location filename="../src/ui/mainwindow.cc" line="1983"/>
<location filename="../src/ui/mainwindow.cc" line="4338"/> <location filename="../src/ui/mainwindow.cc" line="4364"/>
<source>Add current tab to Favorites</source> <source>Add current tab to Favorites</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3347,47 +3357,47 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="121"/> <location filename="../src/ui/mainwindow.cc" line="145"/>
<source>Show Names in Dictionary &amp;Bar</source> <source>Show Names in Dictionary &amp;Bar</source>
<translation>(&amp;B)</translation> <translation>(&amp;B)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="122"/> <location filename="../src/ui/mainwindow.cc" line="146"/>
<source>Show Small Icons in &amp;Toolbars</source> <source>Show Small Icons in &amp;Toolbars</source>
<translation>(&amp;T)</translation> <translation>(&amp;T)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="197"/> <location filename="../src/ui/mainwindow.cc" line="221"/>
<source>&amp;Navigation</source> <source>&amp;Navigation</source>
<translation>(&amp;N)</translation> <translation>(&amp;N)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="225"/> <location filename="../src/ui/mainwindow.cc" line="249"/>
<source>Enable Scanning</source> <source>Enable Scanning</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3257"/> <location filename="../src/ui/mainwindow.cc" line="3283"/>
<source>Article, Complete (*.html)</source> <source>Article, Complete (*.html)</source>
<translation>, (*.html)</translation> <translation>, (*.html)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3258"/> <location filename="../src/ui/mainwindow.cc" line="3284"/>
<source>Article, HTML Only (*.html)</source> <source>Article, HTML Only (*.html)</source>
<translation>, HTML (*.html)</translation> <translation>, HTML (*.html)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3337"/> <location filename="../src/ui/mainwindow.cc" line="3363"/>
<source>Saving article...</source> <source>Saving article...</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3350"/> <location filename="../src/ui/mainwindow.cc" line="3376"/>
<source>Save article complete</source> <source>Save article complete</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="3398"/> <location filename="../src/ui/mainwindow.cc" line="3424"/>
<source>The main window is set to be always on top.</source> <source>The main window is set to be always on top.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3397,8 +3407,8 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
<translation>(&amp;H)</translation> <translation>(&amp;H)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/mainwindow.cc" line="773"/> <location filename="../src/ui/mainwindow.cc" line="799"/>
<location filename="../src/ui/mainwindow.cc" line="852"/> <location filename="../src/ui/mainwindow.cc" line="878"/>
<source>Accessibility API is not enabled</source> <source>Accessibility API is not enabled</source>
<translation>API未启用</translation> <translation>API未启用</translation>
</message> </message>
@ -3714,7 +3724,7 @@ for all program&apos;s network requests.</source>
<translation> Ctrl</translation> <translation> Ctrl</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="111"/> <location filename="../src/ui/preferences.cc" line="133"/>
<source>Lingvo</source> <source>Lingvo</source>
<translation>Lingvo</translation> <translation>Lingvo</translation>
</message> </message>
@ -3745,7 +3755,7 @@ in the pressed state when the word selection changes.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="560"/> <location filename="../src/ui/preferences.cc" line="585"/>
<source>Restart the program to apply the language change.</source> <source>Restart the program to apply the language change.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3805,7 +3815,7 @@ download page.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="108"/> <location filename="../src/ui/preferences.cc" line="130"/>
<source>Default</source> <source>Default</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3815,7 +3825,7 @@ download page.</source>
<translation>(&amp;I)</translation> <translation>(&amp;I)</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="559"/> <location filename="../src/ui/preferences.cc" line="584"/>
<source>Changing Language</source> <source>Changing Language</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4024,16 +4034,6 @@ however, the article from the topmost dictionary is shown.</source>
<source>Automatically scroll to target article</source> <source>Automatically scroll to target article</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Dictionary Font: </source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>set the fallback font family for dictionary</source>
<translation></translation>
</message>
<message> <message>
<location filename="../src/ui/preferences.ui"/> <location filename="../src/ui/preferences.ui"/>
<source>Article Display style:</source> <source>Article Display style:</source>
@ -4348,7 +4348,7 @@ from Stardict, Babylon and GLS dictionaries</source>
<translation> Ctrl-tab 使</translation> <translation> Ctrl-tab 使</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="112"/> <location filename="../src/ui/preferences.cc" line="134"/>
<source>Babylon</source> <source>Babylon</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4413,27 +4413,27 @@ from Stardict, Babylon and GLS dictionaries</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="109"/> <location filename="../src/ui/preferences.cc" line="131"/>
<source>Classic</source> <source>Classic</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="110"/> <location filename="../src/ui/preferences.cc" line="132"/>
<source>Modern</source> <source>Modern</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="113"/> <location filename="../src/ui/preferences.cc" line="135"/>
<source>Lingoes</source> <source>Lingoes</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="114"/> <location filename="../src/ui/preferences.cc" line="136"/>
<source>Lingoes-Blue</source> <source>Lingoes-Blue</source>
<translation>-</translation> <translation>-</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/preferences.cc" line="125"/> <location filename="../src/ui/preferences.cc" line="147"/>
<source> MB</source> <source> MB</source>
<translation> MB</translation> <translation> MB</translation>
</message> </message>
@ -4447,6 +4447,41 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Enable index with positional information</source> <source>Enable index with positional information</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Standard Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Monospace Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Serif Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Sans-serif Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Appearance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/preferences.ui"/>
<source>Fallback Fonts</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProgramTypeEditor</name> <name>ProgramTypeEditor</name>
@ -4532,7 +4567,7 @@ from Stardict, Babylon and GLS dictionaries</source>
</message> </message>
<message> <message>
<location filename="../src/dict/aard.cc" line="511"/> <location filename="../src/dict/aard.cc" line="511"/>
<location filename="../src/dict/slob.cc" line="799"/> <location filename="../src/dict/slob.cc" line="800"/>
<source>Article decoding error</source> <source>Article decoding error</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4640,22 +4675,22 @@ from Stardict, Babylon and GLS dictionaries</source>
<context> <context>
<name>ResourceToSaveHandler</name> <name>ResourceToSaveHandler</name>
<message> <message>
<location filename="../src/ui/articleview.cc" line="2472"/> <location filename="../src/ui/articleview.cc" line="2474"/>
<source>ERROR: %1</source> <source>ERROR: %1</source>
<translation> %1</translation> <translation> %1</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="2472"/> <location filename="../src/ui/articleview.cc" line="2474"/>
<source>Resource saving error: </source> <source>Resource saving error: </source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="2498"/> <location filename="../src/ui/articleview.cc" line="2500"/>
<source>The referenced resource failed to download.</source> <source>The referenced resource failed to download.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/articleview.cc" line="2498"/> <location filename="../src/ui/articleview.cc" line="2500"/>
<source>WARNING: %1</source> <source>WARNING: %1</source>
<translation> %1</translation> <translation> %1</translation>
</message> </message>

View file

@ -296,17 +296,17 @@ Romaji::Romaji():
Group * Class::getGroup( unsigned id ) Group * Class::getGroup( unsigned id )
{ {
for( int x = 0; x < groups.size(); x++ ) for ( auto & group : groups )
if( groups.at( x ).id == id ) if ( group.id == id )
return &groups[ x ]; return &group;
return 0; return 0;
} }
Group const * Class::getGroup( unsigned id ) const Group const * Class::getGroup( unsigned id ) const
{ {
for( int x = 0; x < groups.size(); x++ ) for ( const auto & group : groups )
if( groups.at( x ).id == id ) if ( group.id == id )
return &groups.at( x ); return &group;
return 0; return 0;
} }
@ -437,13 +437,11 @@ MutedDictionaries loadMutedDictionaries( const QDomNode & mutedDictionaries )
void saveMutedDictionaries( QDomDocument & dd, QDomElement & muted, void saveMutedDictionaries( QDomDocument & dd, QDomElement & muted,
MutedDictionaries const & mutedDictionaries ) MutedDictionaries const & mutedDictionaries )
{ {
for( MutedDictionaries::const_iterator i = mutedDictionaries.begin(); for ( const auto & mutedDictionarie : mutedDictionaries ) {
i != mutedDictionaries.end(); ++i )
{
QDomElement dict = dd.createElement( "mutedDictionary" ); QDomElement dict = dd.createElement( "mutedDictionary" );
muted.appendChild( dict ); muted.appendChild( dict );
QDomText value = dd.createTextNode( *i ); QDomText value = dd.createTextNode( mutedDictionarie );
dict.appendChild( value ); dict.appendChild( value );
} }
} }
@ -847,8 +845,10 @@ Class load()
c.preferences.alwaysOnTop = ( preferences.namedItem( "alwaysOnTop" ).toElement().text() == "1" ); c.preferences.alwaysOnTop = ( preferences.namedItem( "alwaysOnTop" ).toElement().text() == "1" );
c.preferences.searchInDock = ( preferences.namedItem( "searchInDock" ).toElement().text() == "1" ); c.preferences.searchInDock = ( preferences.namedItem( "searchInDock" ).toElement().text() == "1" );
if ( !preferences.namedItem( "webFontFamily" ).isNull() ) if ( !preferences.namedItem( "customFonts" ).isNull() ) {
c.preferences.webFontFamily = preferences.namedItem( "webFontFamily" ).toElement().text(); CustomFonts fonts = CustomFonts::fromElement( preferences.namedItem( "customFonts" ).toElement() );
c.preferences.customFonts = fonts;
}
if ( !preferences.namedItem( "doubleClickTranslates" ).isNull() ) if ( !preferences.namedItem( "doubleClickTranslates" ).isNull() )
c.preferences.doubleClickTranslates = ( preferences.namedItem( "doubleClickTranslates" ).toElement().text() == "1" ); c.preferences.doubleClickTranslates = ( preferences.namedItem( "doubleClickTranslates" ).toElement().text() == "1" );
@ -1195,19 +1195,18 @@ void saveGroup( Group const & data, QDomElement & group )
group.setAttributeNode( shortcut ); group.setAttributeNode( shortcut );
} }
for( QVector< DictionaryRef >::const_iterator j = data.dictionaries.begin(); j != data.dictionaries.end(); ++j ) for ( const auto & dictionarie : data.dictionaries ) {
{
QDomElement dictionary = dd.createElement( "dictionary" ); QDomElement dictionary = dd.createElement( "dictionary" );
group.appendChild( dictionary ); group.appendChild( dictionary );
QDomText value = dd.createTextNode( j->id ); QDomText value = dd.createTextNode( dictionarie.id );
dictionary.appendChild( value ); dictionary.appendChild( value );
QDomAttr name = dd.createAttribute( "name" ); QDomAttr name = dd.createAttribute( "name" );
name.setValue( j->name ); name.setValue( dictionarie.name );
dictionary.setAttributeNode( name ); dictionary.setAttributeNode( name );
} }
@ -1215,23 +1214,19 @@ void saveGroup( Group const & data, QDomElement & group )
QDomElement muted = dd.createElement( "mutedDictionaries" ); QDomElement muted = dd.createElement( "mutedDictionaries" );
group.appendChild( muted ); group.appendChild( muted );
for( MutedDictionaries::const_iterator i = data.mutedDictionaries.begin(); for ( const auto & mutedDictionarie : data.mutedDictionaries ) {
i != data.mutedDictionaries.end(); ++i )
{
QDomElement dict = dd.createElement( "mutedDictionary" ); QDomElement dict = dd.createElement( "mutedDictionary" );
muted.appendChild( dict ); muted.appendChild( dict );
QDomText value = dd.createTextNode( *i ); QDomText value = dd.createTextNode( mutedDictionarie );
dict.appendChild( value ); dict.appendChild( value );
} }
for( MutedDictionaries::const_iterator i = data.popupMutedDictionaries.begin(); for ( const auto & popupMutedDictionarie : data.popupMutedDictionaries ) {
i != data.popupMutedDictionaries.end(); ++i )
{
QDomElement dict = dd.createElement( "popupMutedDictionary" ); QDomElement dict = dd.createElement( "popupMutedDictionary" );
muted.appendChild( dict ); muted.appendChild( dict );
QDomText value = dd.createTextNode( *i ); QDomText value = dd.createTextNode( popupMutedDictionarie );
dict.appendChild( value ); dict.appendChild( value );
} }
} }
@ -1254,16 +1249,15 @@ void save( Class const & c )
QDomElement paths = dd.createElement( "paths" ); QDomElement paths = dd.createElement( "paths" );
root.appendChild( paths ); root.appendChild( paths );
for( Paths::const_iterator i = c.paths.begin(); i != c.paths.end(); ++i ) for ( const auto & i : c.paths ) {
{
QDomElement path = dd.createElement( "path" ); QDomElement path = dd.createElement( "path" );
paths.appendChild( path ); paths.appendChild( path );
QDomAttr recursive = dd.createAttribute( "recursive" ); QDomAttr recursive = dd.createAttribute( "recursive" );
recursive.setValue( i->recursive ? "1" : "0" ); recursive.setValue( i.recursive ? "1" : "0" );
path.setAttributeNode( recursive ); path.setAttributeNode( recursive );
QDomText value = dd.createTextNode( i->path ); QDomText value = dd.createTextNode( i.path );
path.appendChild( value ); path.appendChild( value );
} }
@ -1273,20 +1267,19 @@ void save( Class const & c )
QDomElement soundDirs = dd.createElement( "sounddirs" ); QDomElement soundDirs = dd.createElement( "sounddirs" );
root.appendChild( soundDirs ); root.appendChild( soundDirs );
for( SoundDirs::const_iterator i = c.soundDirs.begin(); i != c.soundDirs.end(); ++i ) for ( const auto & i : c.soundDirs ) {
{
QDomElement soundDir = dd.createElement( "sounddir" ); QDomElement soundDir = dd.createElement( "sounddir" );
soundDirs.appendChild( soundDir ); soundDirs.appendChild( soundDir );
QDomAttr name = dd.createAttribute( "name" ); QDomAttr name = dd.createAttribute( "name" );
name.setValue( i->name ); name.setValue( i.name );
soundDir.setAttributeNode( name ); soundDir.setAttributeNode( name );
QDomAttr icon = dd.createAttribute( "icon" ); QDomAttr icon = dd.createAttribute( "icon" );
icon.setValue( i->iconFilename ); icon.setValue( i.iconFilename );
soundDir.setAttributeNode( icon ); soundDir.setAttributeNode( icon );
QDomText value = dd.createTextNode( i->path ); QDomText value = dd.createTextNode( i.path );
soundDir.appendChild( value ); soundDir.appendChild( value );
} }
@ -1312,12 +1305,11 @@ void save( Class const & c )
nextId.setValue( QString::number( c.groups.nextId ) ); nextId.setValue( QString::number( c.groups.nextId ) );
groups.setAttributeNode( nextId ); groups.setAttributeNode( nextId );
for( Groups::const_iterator i = c.groups.begin(); i != c.groups.end(); ++i ) for ( const auto & i : c.groups ) {
{
QDomElement group = dd.createElement( "group" ); QDomElement group = dd.createElement( "group" );
groups.appendChild( group ); groups.appendChild( group );
saveGroup( *i, group ); saveGroup( i, group );
} }
} }
@ -1328,10 +1320,9 @@ void save( Class const & c )
hunspell.setAttributeNode( path ); hunspell.setAttributeNode( path );
root.appendChild( hunspell ); root.appendChild( hunspell );
for( int x = 0; x < c.hunspell.enabledDictionaries.size(); ++x ) for ( const auto & enabledDictionarie : c.hunspell.enabledDictionaries ) {
{
QDomElement en = dd.createElement( "enabled" ); QDomElement en = dd.createElement( "enabled" );
QDomText value = dd.createTextNode( c.hunspell.enabledDictionaries.at( x ) ); QDomText value = dd.createTextNode( enabledDictionarie );
en.appendChild( value ); en.appendChild( value );
hunspell.appendChild( en ); hunspell.appendChild( en );
@ -1470,29 +1461,28 @@ void save( Class const & c )
QDomElement mws = dd.createElement( "mediawikis" ); QDomElement mws = dd.createElement( "mediawikis" );
root.appendChild( mws ); root.appendChild( mws );
for( MediaWikis::const_iterator i = c.mediawikis.begin(); i != c.mediawikis.end(); ++i ) for ( const auto & mediawiki : c.mediawikis ) {
{
QDomElement mw = dd.createElement( "mediawiki" ); QDomElement mw = dd.createElement( "mediawiki" );
mws.appendChild( mw ); mws.appendChild( mw );
QDomAttr id = dd.createAttribute( "id" ); QDomAttr id = dd.createAttribute( "id" );
id.setValue( i->id ); id.setValue( mediawiki.id );
mw.setAttributeNode( id ); mw.setAttributeNode( id );
QDomAttr name = dd.createAttribute( "name" ); QDomAttr name = dd.createAttribute( "name" );
name.setValue( i->name ); name.setValue( mediawiki.name );
mw.setAttributeNode( name ); mw.setAttributeNode( name );
QDomAttr url = dd.createAttribute( "url" ); QDomAttr url = dd.createAttribute( "url" );
url.setValue( i->url ); url.setValue( mediawiki.url );
mw.setAttributeNode( url ); mw.setAttributeNode( url );
QDomAttr enabled = dd.createAttribute( "enabled" ); QDomAttr enabled = dd.createAttribute( "enabled" );
enabled.setValue( i->enabled ? "1" : "0" ); enabled.setValue( mediawiki.enabled ? "1" : "0" );
mw.setAttributeNode( enabled ); mw.setAttributeNode( enabled );
QDomAttr icon = dd.createAttribute( "icon" ); QDomAttr icon = dd.createAttribute( "icon" );
icon.setValue( i->icon ); icon.setValue( mediawiki.icon );
mw.setAttributeNode( icon ); mw.setAttributeNode( icon );
} }
} }
@ -1501,33 +1491,32 @@ void save( Class const & c )
QDomElement wss = dd.createElement( "websites" ); QDomElement wss = dd.createElement( "websites" );
root.appendChild( wss ); root.appendChild( wss );
for( WebSites::const_iterator i = c.webSites.begin(); i != c.webSites.end(); ++i ) for ( const auto & webSite : c.webSites ) {
{
QDomElement ws = dd.createElement( "website" ); QDomElement ws = dd.createElement( "website" );
wss.appendChild( ws ); wss.appendChild( ws );
QDomAttr id = dd.createAttribute( "id" ); QDomAttr id = dd.createAttribute( "id" );
id.setValue( i->id ); id.setValue( webSite.id );
ws.setAttributeNode( id ); ws.setAttributeNode( id );
QDomAttr name = dd.createAttribute( "name" ); QDomAttr name = dd.createAttribute( "name" );
name.setValue( i->name ); name.setValue( webSite.name );
ws.setAttributeNode( name ); ws.setAttributeNode( name );
QDomAttr url = dd.createAttribute( "url" ); QDomAttr url = dd.createAttribute( "url" );
url.setValue( i->url ); url.setValue( webSite.url );
ws.setAttributeNode( url ); ws.setAttributeNode( url );
QDomAttr enabled = dd.createAttribute( "enabled" ); QDomAttr enabled = dd.createAttribute( "enabled" );
enabled.setValue( i->enabled ? "1" : "0" ); enabled.setValue( webSite.enabled ? "1" : "0" );
ws.setAttributeNode( enabled ); ws.setAttributeNode( enabled );
QDomAttr icon = dd.createAttribute( "icon" ); QDomAttr icon = dd.createAttribute( "icon" );
icon.setValue( i->iconFilename ); icon.setValue( webSite.iconFilename );
ws.setAttributeNode( icon ); ws.setAttributeNode( icon );
QDomAttr inside_iframe = dd.createAttribute( "inside_iframe" ); QDomAttr inside_iframe = dd.createAttribute( "inside_iframe" );
inside_iframe.setValue( i->inside_iframe ? "1" : "0" ); inside_iframe.setValue( webSite.inside_iframe ? "1" : "0" );
ws.setAttributeNode( inside_iframe ); ws.setAttributeNode( inside_iframe );
} }
} }
@ -1536,37 +1525,36 @@ void save( Class const & c )
QDomElement dss = dd.createElement( "dictservers" ); QDomElement dss = dd.createElement( "dictservers" );
root.appendChild( dss ); root.appendChild( dss );
for( DictServers::const_iterator i = c.dictServers.begin(); i != c.dictServers.end(); ++i ) for ( const auto & dictServer : c.dictServers ) {
{
QDomElement ds = dd.createElement( "server" ); QDomElement ds = dd.createElement( "server" );
dss.appendChild( ds ); dss.appendChild( ds );
QDomAttr id = dd.createAttribute( "id" ); QDomAttr id = dd.createAttribute( "id" );
id.setValue( i->id ); id.setValue( dictServer.id );
ds.setAttributeNode( id ); ds.setAttributeNode( id );
QDomAttr name = dd.createAttribute( "name" ); QDomAttr name = dd.createAttribute( "name" );
name.setValue( i->name ); name.setValue( dictServer.name );
ds.setAttributeNode( name ); ds.setAttributeNode( name );
QDomAttr url = dd.createAttribute( "url" ); QDomAttr url = dd.createAttribute( "url" );
url.setValue( i->url ); url.setValue( dictServer.url );
ds.setAttributeNode( url ); ds.setAttributeNode( url );
QDomAttr enabled = dd.createAttribute( "enabled" ); QDomAttr enabled = dd.createAttribute( "enabled" );
enabled.setValue( i->enabled ? "1" : "0" ); enabled.setValue( dictServer.enabled ? "1" : "0" );
ds.setAttributeNode( enabled ); ds.setAttributeNode( enabled );
QDomAttr databases = dd.createAttribute( "databases" ); QDomAttr databases = dd.createAttribute( "databases" );
databases.setValue( i->databases ); databases.setValue( dictServer.databases );
ds.setAttributeNode( databases ); ds.setAttributeNode( databases );
QDomAttr strategies = dd.createAttribute( "strategies" ); QDomAttr strategies = dd.createAttribute( "strategies" );
strategies.setValue( i->strategies ); strategies.setValue( dictServer.strategies );
ds.setAttributeNode( strategies ); ds.setAttributeNode( strategies );
QDomAttr icon = dd.createAttribute( "icon" ); QDomAttr icon = dd.createAttribute( "icon" );
icon.setValue( i->iconFilename ); icon.setValue( dictServer.iconFilename );
ds.setAttributeNode( icon ); ds.setAttributeNode( icon );
} }
} }
@ -1575,33 +1563,32 @@ void save( Class const & c )
QDomElement programs = dd.createElement( "programs" ); QDomElement programs = dd.createElement( "programs" );
root.appendChild( programs ); root.appendChild( programs );
for( Programs::const_iterator i = c.programs.begin(); i != c.programs.end(); ++i ) for ( const auto & program : c.programs ) {
{
QDomElement p = dd.createElement( "program" ); QDomElement p = dd.createElement( "program" );
programs.appendChild( p ); programs.appendChild( p );
QDomAttr id = dd.createAttribute( "id" ); QDomAttr id = dd.createAttribute( "id" );
id.setValue( i->id ); id.setValue( program.id );
p.setAttributeNode( id ); p.setAttributeNode( id );
QDomAttr name = dd.createAttribute( "name" ); QDomAttr name = dd.createAttribute( "name" );
name.setValue( i->name ); name.setValue( program.name );
p.setAttributeNode( name ); p.setAttributeNode( name );
QDomAttr commandLine = dd.createAttribute( "commandLine" ); QDomAttr commandLine = dd.createAttribute( "commandLine" );
commandLine.setValue( i->commandLine ); commandLine.setValue( program.commandLine );
p.setAttributeNode( commandLine ); p.setAttributeNode( commandLine );
QDomAttr enabled = dd.createAttribute( "enabled" ); QDomAttr enabled = dd.createAttribute( "enabled" );
enabled.setValue( i->enabled ? "1" : "0" ); enabled.setValue( program.enabled ? "1" : "0" );
p.setAttributeNode( enabled ); p.setAttributeNode( enabled );
QDomAttr type = dd.createAttribute( "type" ); QDomAttr type = dd.createAttribute( "type" );
type.setValue( QString::number( i->type ) ); type.setValue( QString::number( program.type ) );
p.setAttributeNode( type ); p.setAttributeNode( type );
QDomAttr icon = dd.createAttribute( "icon" ); QDomAttr icon = dd.createAttribute( "icon" );
icon.setValue( i->iconFilename ); icon.setValue( program.iconFilename );
p.setAttributeNode( icon ); p.setAttributeNode( icon );
} }
} }
@ -1668,9 +1655,9 @@ void save( Class const & c )
opt.appendChild( dd.createTextNode( c.preferences.interfaceLanguage ) ); opt.appendChild( dd.createTextNode( c.preferences.interfaceLanguage ) );
preferences.appendChild( opt ); preferences.appendChild( opt );
opt = dd.createElement( "webFontFamily" ); opt = dd.createElement( "customFonts" );
opt.appendChild( dd.createTextNode( c.preferences.webFontFamily ) ); auto customFont = c.preferences.customFonts.toElement( dd );
preferences.appendChild( opt ); preferences.appendChild( customFont );
opt = dd.createElement( "displayStyle" ); opt = dd.createElement( "displayStyle" );
opt.appendChild( dd.createTextNode( c.preferences.displayStyle ) ); opt.appendChild( dd.createTextNode( c.preferences.displayStyle ) );

View file

@ -13,6 +13,7 @@
#include <QSet> #include <QSet>
#include <QMetaType> #include <QMetaType>
#include "ex.hh" #include "ex.hh"
#include <QDomDocument>
#include <QLocale> #include <QLocale>
#include <optional> #include <optional>
@ -189,6 +190,56 @@ struct FullTextSearch
{} {}
}; };
struct CustomFonts
{
QString standard;
QString serif;
QString sansSerif;
QString monospace;
bool operator==( CustomFonts const & other ) const
{
return standard == other.standard && serif == other.serif && sansSerif == other.sansSerif
&& monospace == other.monospace;
}
bool operator!=( CustomFonts const & other ) const
{
return !operator==( other );
}
QDomElement toElement( QDomDocument dd ) const
{
QDomElement proxy = dd.createElement( "customFonts" );
QDomAttr standard_attr = dd.createAttribute( "standard" );
standard_attr.setValue( this->standard );
proxy.setAttributeNode( standard_attr );
QDomAttr serif_attr = dd.createAttribute( "serif" );
serif_attr.setValue( this->serif );
proxy.setAttributeNode( serif_attr );
QDomAttr sans_attr = dd.createAttribute( "sans-serif" );
sans_attr.setValue( this->sansSerif );
proxy.setAttributeNode( sans_attr );
QDomAttr mono_attr = dd.createAttribute( "monospace" );
mono_attr.setValue( this->monospace );
proxy.setAttributeNode( mono_attr );
return proxy;
}
static CustomFonts fromElement( QDomElement proxy )
{
CustomFonts c;
c.standard = proxy.attribute( "standard" );
c.serif = proxy.attribute( "serif" );
c.sansSerif = proxy.attribute( "sans-serif" );
c.monospace = proxy.attribute( "monospace" );
return c;
}
};
/// This class encapsulates supported backend preprocessor logic, /// This class encapsulates supported backend preprocessor logic,
/// discourages duplicating backend names in code, which is error-prone. /// discourages duplicating backend names in code, which is error-prone.
class InternalPlayerBackend class InternalPlayerBackend
@ -257,7 +308,7 @@ struct Preferences
{ {
QString interfaceLanguage; // Empty value corresponds to system default QString interfaceLanguage; // Empty value corresponds to system default
QString displayStyle; // Empty value corresponds to the default one QString displayStyle; // Empty value corresponds to the default one
QString webFontFamily; // Empty value corresponds to the default one CustomFonts customFonts;
bool newTabsOpenAfterCurrentOne; bool newTabsOpenAfterCurrentOne;
bool newTabsOpenInBackground; bool newTabsOpenInBackground;
bool hideSingleTab; bool hideSingleTab;

View file

@ -98,12 +98,36 @@ QString ApplicationSettingName = "GoldenDict";
void MainWindow::changeWebEngineViewFont() const void MainWindow::changeWebEngineViewFont() const
{ {
if ( cfg.preferences.webFontFamily.isEmpty() ) { if ( cfg.preferences.customFonts.standard.isEmpty() ) {
QWebEngineProfile::defaultProfile()->settings()->resetFontFamily( QWebEngineSettings::StandardFont ); QWebEngineProfile::defaultProfile()->settings()->resetFontFamily( QWebEngineSettings::StandardFont );
} }
else { else {
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::StandardFont, QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::StandardFont,
cfg.preferences.webFontFamily ); cfg.preferences.customFonts.standard );
}
if ( cfg.preferences.customFonts.serif.isEmpty() ) {
QWebEngineProfile::defaultProfile()->settings()->resetFontFamily( QWebEngineSettings::SerifFont );
}
else {
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::SerifFont,
cfg.preferences.customFonts.serif );
}
if ( cfg.preferences.customFonts.sansSerif.isEmpty() ) {
QWebEngineProfile::defaultProfile()->settings()->resetFontFamily( QWebEngineSettings::SansSerifFont );
}
else {
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::SansSerifFont,
cfg.preferences.customFonts.sansSerif );
}
if ( cfg.preferences.customFonts.monospace.isEmpty() ) {
QWebEngineProfile::defaultProfile()->settings()->resetFontFamily( QWebEngineSettings::FixedFont );
}
else {
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::FixedFont,
cfg.preferences.customFonts.monospace );
} }
} }

View file

@ -97,12 +97,34 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
} }
} }
prevWebFontFamily = p.webFontFamily; prevWebFontFamily = p.customFonts;
if(!p.webFontFamily.isEmpty()) if ( !p.customFonts.standard.isEmpty() )
ui.fontFamilies->setCurrentText( p.webFontFamily ); ui.font_standard->setCurrentText( p.customFonts.standard );
else { else {
ui.fontFamilies->setCurrentFont( QApplication::font() ); ui.font_standard->setCurrentFont(
QWebEngineProfile::defaultProfile()->settings()->fontFamily( QWebEngineSettings::StandardFont ) );
}
if ( !p.customFonts.serif.isEmpty() )
ui.font_serif->setCurrentText( p.customFonts.serif );
else {
ui.font_serif->setCurrentFont(
QWebEngineProfile::defaultProfile()->settings()->fontFamily( QWebEngineSettings::SerifFont ) );
}
if ( !p.customFonts.sansSerif.isEmpty() )
ui.font_sans->setCurrentText( p.customFonts.sansSerif );
else {
ui.font_sans->setCurrentFont(
QWebEngineProfile::defaultProfile()->settings()->fontFamily( QWebEngineSettings::SansSerifFont ) );
}
if ( !p.customFonts.monospace.isEmpty() )
ui.font_monospace->setCurrentText( p.customFonts.monospace );
else {
ui.font_monospace->setCurrentFont(
QWebEngineProfile::defaultProfile()->settings()->fontFamily( QWebEngineSettings::FixedFont ) );
} }
ui.displayStyle->addItem( QIcon( ":/icons/programicon_old.png" ), tr( "Default" ), QString() ); ui.displayStyle->addItem( QIcon( ":/icons/programicon_old.png" ), tr( "Default" ), QString() );
@ -354,11 +376,13 @@ Config::Preferences Preferences::getPreferences()
ui.interfaceLanguage->itemData( ui.interfaceLanguage->itemData(
ui.interfaceLanguage->currentIndex() ).toString(); ui.interfaceLanguage->currentIndex() ).toString();
//bypass the first default Config::CustomFonts c;
if(ui.fontFamilies->currentIndex()>0) c.standard = ui.font_standard->currentText();
p.webFontFamily = ui.fontFamilies->currentText(); c.serif = ui.font_serif->currentText();
else c.sansSerif = ui.font_sans->currentText();
p.webFontFamily = ""; c.monospace = ui.font_monospace->currentText();
p.customFonts = c;
p.displayStyle = p.displayStyle =
ui.displayStyle->itemData( ui.displayStyle->itemData(
@ -560,19 +584,16 @@ void Preferences::on_buttonBox_accepted()
QMessageBox::information( this, tr( "Changing Language" ), QMessageBox::information( this, tr( "Changing Language" ),
tr( "Restart the program to apply the language change." ) ); tr( "Restart the program to apply the language change." ) );
auto currentFontFamily = ui.fontFamilies->currentFont().family(); auto c = getPreferences();
if( prevWebFontFamily != currentFontFamily ) if ( c.customFonts != prevWebFontFamily ) {
{
//reset to default font .
if( currentFontFamily.isEmpty() )
{
QWebEngineProfile::defaultProfile()->settings()->resetFontFamily( QWebEngineSettings::StandardFont );
}
else
{
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::StandardFont, QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::StandardFont,
currentFontFamily ); c.customFonts.standard );
} QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::SerifFont,
c.customFonts.serif );
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::SansSerifFont,
c.customFonts.sansSerif );
QWebEngineProfile::defaultProfile()->settings()->setFontFamily( QWebEngineSettings::FixedFont,
c.customFonts.monospace );
} }
} }
@ -602,3 +623,4 @@ void Preferences::on_limitInputPhraseLength_toggled( bool checked )
{ {
ui.inputPhraseLengthLimit->setEnabled( checked ); ui.inputPhraseLengthLimit->setEnabled( checked );
} }

View file

@ -13,7 +13,7 @@ class Preferences: public QDialog
int prevInterfaceLanguage = 0; int prevInterfaceLanguage = 0;
QString prevWebFontFamily; Config::CustomFonts prevWebFontFamily;
Config::Class & cfg; Config::Class & cfg;
QAction helpAction; QAction helpAction;
@ -55,8 +55,6 @@ private slots:
void on_collapseBigArticles_toggled( bool checked ); void on_collapseBigArticles_toggled( bool checked );
void on_limitInputPhraseLength_toggled( bool checked ); void on_limitInputPhraseLength_toggled( bool checked );
}; };
#endif #endif

View file

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>787</width> <width>788</width>
<height>730</height> <height>730</height>
</rect> </rect>
</property> </property>
@ -53,229 +53,6 @@
<property name="topMargin"> <property name="topMargin">
<number>9</number> <number>9</number>
</property> </property>
<item row="1" column="0">
<widget class="QGroupBox" name="enableTrayIcon">
<property name="toolTip">
<string>When enabled, an icon appears in the system tray area which can be used
to open main window and perform other tasks.</string>
</property>
<property name="title">
<string>Enable system tray icon</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="flat">
<bool>false</bool>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="startToTray">
<property name="toolTip">
<string>With this on, the application starts directly to system tray without showing
its main window.</string>
</property>
<property name="text">
<string>Start to system tray</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="closeToTray">
<property name="toolTip">
<string>With this on, an attempt to close main window would hide it instead of closing
the application.</string>
</property>
<property name="text">
<string>Close to system tray</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="escKeyHidesMainWindow">
<property name="toolTip">
<string>Normally, pressing ESC key moves focus to the translation line.
With this on however, it will hide the main window.</string>
</property>
<property name="text">
<string>ESC key hides main window</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="autoScrollToTargetArticle">
<property name="toolTip">
<string>Normally, clicking on a link, double-clicking on a word or looking up
selection in an article loads the translation and almost immediately
scrolls to the article from the same dictionary. With this option off,
however, the article from the topmost dictionary is shown.</string>
</property>
<property name="text">
<string>Automatically scroll to target article</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="QLabel" name="maxDictsInContextMenuLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Adjust this value to avoid huge context menus.</string>
</property>
<property name="text">
<string>Context menu dictionaries limit:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="maxDictsInContextMenu">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_12">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Startup</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="cbAutostart">
<property name="toolTip">
<string>Automatically starts GoldenDict after operation system bootup.</string>
</property>
<property name="text">
<string>Start with system</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Interface language:</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Dictionary Font: </string>
</property>
</widget>
</item>
<item row="20" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="10" column="0" colspan="2">
<layout class="QVBoxLayout" name="verticalLayout_16">
<item>
<widget class="QCheckBox" name="darkMode">
<property name="toolTip">
<string>Turn the UI to dark.</string>
</property>
<property name="text">
<string>Dark Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="darkReaderMode">
<property name="toolTip">
<string>Turn the article display style to dark.</string>
</property>
<property name="text">
<string>Dark Reader Mode</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="selectBySingleClick">
<property name="toolTip">
<string>Turn this option on if you want to select words by single mouse click</string>
</property>
<property name="text">
<string>Select word by single click</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QComboBox" name="interfaceLanguage">
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QFontComboBox" name="fontFamilies">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>set the fallback font family for dictionary</string>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QCheckBox" name="doubleClickTranslates"> <widget class="QCheckBox" name="doubleClickTranslates">
<property name="text"> <property name="text">
@ -336,7 +113,208 @@ be the last ones.</string>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="4" column="0">
<widget class="QCheckBox" name="escKeyHidesMainWindow">
<property name="toolTip">
<string>Normally, pressing ESC key moves focus to the translation line.
With this on however, it will hide the main window.</string>
</property>
<property name="text">
<string>ESC key hides main window</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="selectBySingleClick">
<property name="toolTip">
<string>Turn this option on if you want to select words by single mouse click</string>
</property>
<property name="text">
<string>Select word by single click</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Startup</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="cbAutostart">
<property name="toolTip">
<string>Automatically starts GoldenDict after operation system bootup.</string>
</property>
<property name="text">
<string>Start with system</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="autoScrollToTargetArticle">
<property name="toolTip">
<string>Normally, clicking on a link, double-clicking on a word or looking up
selection in an article loads the translation and almost immediately
scrolls to the article from the same dictionary. With this option off,
however, the article from the topmost dictionary is shown.</string>
</property>
<property name="text">
<string>Automatically scroll to target article</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="enableTrayIcon">
<property name="toolTip">
<string>When enabled, an icon appears in the system tray area which can be used
to open main window and perform other tasks.</string>
</property>
<property name="title">
<string>Enable system tray icon</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="flat">
<bool>false</bool>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="startToTray">
<property name="toolTip">
<string>With this on, the application starts directly to system tray without showing
its main window.</string>
</property>
<property name="text">
<string>Start to system tray</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="closeToTray">
<property name="toolTip">
<string>With this on, an attempt to close main window would hide it instead of closing
the application.</string>
</property>
<property name="text">
<string>Close to system tray</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="16" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="QLabel" name="maxDictsInContextMenuLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Adjust this value to avoid huge context menus.</string>
</property>
<property name="text">
<string>Context menu dictionaries limit:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="maxDictsInContextMenu">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_12">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item row="9" column="0"> <item row="9" column="0">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Appearance</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_16">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Interface language:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="interfaceLanguage">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>153</width>
<height>0</height>
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<item> <item>
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
@ -346,8 +324,25 @@ be the last ones.</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="displayStyle"/> <widget class="QComboBox" name="displayStyle">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
</widget>
</item> </item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item> <item>
<widget class="QLabel" name="addonStylesLabel"> <widget class="QLabel" name="addonStylesLabel">
<property name="text"> <property name="text">
@ -356,10 +351,142 @@ be the last ones.</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="StylesComboBox" name="addonStyles"/> <widget class="StylesComboBox" name="addonStyles">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="QCheckBox" name="darkMode">
<property name="toolTip">
<string>Turn the UI to dark.</string>
</property>
<property name="text">
<string>Dark Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="darkReaderMode">
<property name="toolTip">
<string>Turn the article display style to dark.</string>
</property>
<property name="text">
<string>Dark Reader Mode</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="9" column="1">
<widget class="QGroupBox" name="groupBox_10">
<property name="toolTip">
<string>These fonts will be applied when the fonts specified by a dictionary are not found.</string>
</property>
<property name="title">
<string>Fallback Fonts</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
<item>
<widget class="QLabel" name="label_16">
<property name="text">
<string>Standard Font</string>
</property>
</widget>
</item>
<item>
<widget class="QFontComboBox" name="font_standard">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_21">
<property name="text">
<string>Serif Font</string>
</property>
</widget>
</item>
<item>
<widget class="QFontComboBox" name="font_serif">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_26">
<property name="text">
<string>Sans-serif Font</string>
</property>
</widget>
</item>
<item>
<widget class="QFontComboBox" name="font_sans">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_27">
<property name="text">
<string>Monospace Font</string>
</property>
</widget>
</item>
<item>
<widget class="QFontComboBox" name="font_monospace">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="fontFilters">
<set>QFontComboBox::MonospacedFonts</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_popup"> <widget class="QWidget" name="tab_popup">