fix: merge conflict

This commit is contained in:
YiFang Xiao 2023-11-07 21:24:13 +08:00
commit b4c87bbdb1
105 changed files with 1960 additions and 1873 deletions

View file

@ -39,15 +39,10 @@ Copy & paste `help` -> `about` -> `Copy version info` to here
**Additional context**
Add any other context about the problem here.
Windows:
Platform | Context
---------|----------
Windows |Upload the dmp file in the crash folder located in the configuration folder (can be opened through the menu help->configuration folder) to here
Macos | upload the crashpad crash log
Linux | gdb backtrace info
Upload the dmp file in the crash folder located in the configuration folder (can be opened through the menu help->configuration folder) to here
Macos:
upload the crashpad crash log
Linux:
gdb backtrace info.

View file

@ -34,14 +34,10 @@ assignees: ''
**额外的信息**
Windows:
_将位于配置文件夹中可以通过菜单 **help->配置文件夹** 打开crash文件夹里面的dmp文件上传到此处_
平台 | 信息
---------|----------
Windows | _将位于配置文件夹中可以通过菜单 **help->配置文件夹** 打开crash文件夹里面的dmp文件上传到此处_
Macos | 将macos自带的crashpad的log粘贴到此处
Linux | gdb crash 堆栈信息
Macos:
将macos自带的crashpad的log粘贴到此处
Linux:
gdb crash 堆栈信息

View file

@ -49,16 +49,12 @@ jobs:
- name: install deps on macos
run: |
brew install pcre2 harfbuzz freetype
brew install cmake ninja python
brew install cmake ninja
brew install automake
brew install autoconf
brew install libtool
brew install opencc
# brew install speex
# brew tap homebrew-ffmpeg/ffmpeg
# brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
brew install libao
brew install libiconv
brew install lzo bzip2
@ -69,8 +65,7 @@ jobs:
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
tar xvjf eb-4.4.3.tar.bz2
cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
#brew install qt # or use official offline installer
brew install xz lzo
# brew install xz
brew install pkg-config
brew install libiconv
brew install xapian

View file

@ -22,7 +22,7 @@ jobs:
strategy:
matrix:
os: [macos-13]
qt_ver: [ 6.5.2 ]
qt_ver: [ 6.5.2,6.6.0 ]
qt_arch: [clang_64]
env:
targetName: GoldenDict
@ -42,8 +42,7 @@ jobs:
- name: install deps on macos
run: |
brew install pcre2 harfbuzz freetype
brew install cmake ninja python
brew install cmake ninja
brew install automake
brew install autoconf
brew install libtool
@ -51,10 +50,6 @@ jobs:
brew install speex
brew install wavpack
brew install automake fdk-aac git lame libass libtool libvorbis libvpx opus sdl shtool texi2html theora wget x264 x265 xvid nasm
brew install speex
brew tap homebrew-ffmpeg/ffmpeg
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
brew install libiconv
brew install lzo bzip2
@ -105,7 +100,7 @@ jobs:
- name: compile
run: |
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian CONFIG+=use_breakpad
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian CONFIG+=use_breakpad CONFIG+=no_ffmpeg_player CONFIG+=no_tts_support
make -j8
- name: package
@ -209,8 +204,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
Linux users can use Flatpak or build from source.
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer.

View file

@ -22,7 +22,7 @@ jobs:
strategy:
matrix:
os: [macos-12,macos-13]
qt_ver: [ 6.5.2 ]
qt_ver: [ 6.5.2,6.6.0 ]
qt_arch: [clang_64]
env:
targetName: GoldenDict
@ -42,20 +42,12 @@ jobs:
- name: install deps on macos
run: |
brew install pcre2 harfbuzz freetype
brew install cmake ninja python
brew install cmake ninja
brew install automake
brew install autoconf
brew install libtool
brew install opencc
# brew install speex
brew install wavpack
brew install automake git lame libass libtool shtool texi2html theora wget xvid nasm
# brew install automake fdk-aac git lame libass libtool libvorbis libvpx opus sdl shtool texi2html theora wget x264 x265 xvid nasm
# brew tap homebrew-ffmpeg/ffmpeg
# brew options homebrew-ffmpeg/ffmpeg/ffmpeg
# brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
brew install libiconv
brew install lzo bzip2
@ -65,7 +57,7 @@ jobs:
brew install hunspell
git clone https://github.com/xiaoyifang/eb.git
cd eb && ./configure && make -j 8 && sudo make install && cd ..
brew install xz lzo
# brew install xz
brew install pkg-config
brew install create-dmg
brew install xapian
@ -77,8 +69,8 @@ jobs:
cmake -B build -DCMAKE_BUILD_TYPE=release
cmake --build build --config release
sudo make install
find /usr/local -name libzstd.1.dylib
find /usr/local -name liblzma.5.dylib
# find /usr/local -name libzstd.1.dylib
# find /usr/local -name liblzma.5.dylib
- name: version-file
shell: bash
env:
@ -217,8 +209,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
Linux users can use Flatpak or build from source.
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer.

View file

@ -3,21 +3,16 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
# workflow_run:
# workflows: [AutoTag]
# types: [completed]
workflow_dispatch:
push:
branches:
- dev
- master
# - staged
paths-ignore:
- 'docs/**'
# - ".github/**"
- "howto/**"
- "*.md"
- ".clang-format"
# push:
# branches:
# - dev
# - master
# paths-ignore:
# - 'docs/**'
# - "howto/**"
# - "*.md"
# - ".clang-format"
jobs:
build:
@ -26,7 +21,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-20.04]
qt_ver: [ 6.5.2 ]
qt_ver: [ 6.5.2,6.6.0 ]
qt_arch: [gcc_64]
env:
version: 23.09.29
@ -191,8 +186,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
Linux users can use Flatpak or build from source.
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer.

View file

@ -26,7 +26,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
qt_ver: [5.15.2,6.5.2]
qt_ver: [5.15.2,6.6.0]
qt_arch: [gcc_64]
steps:

View file

@ -4,21 +4,16 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
# workflow_run:
# workflows: [AutoTag]
# types: [completed]
workflow_dispatch:
push:
branches:
- dev
- master
# - staged
paths-ignore:
- 'docs/**'
# - ".github/**"
- "howto/**"
- "*.md"
- ".clang-format"
# push:
# branches:
# - dev
# - master
# paths-ignore:
# - 'docs/**'
# - "howto/**"
# - "*.md"
# - ".clang-format"
jobs:
build:
@ -178,8 +173,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
Linux users can use Flatpak or build from source.
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer.

View file

@ -27,7 +27,7 @@ jobs:
strategy:
matrix:
os: [windows-2019]
qt_ver: [6.5.2]
qt_ver: [6.5.2,6.6.0 ]
qt_arch: [win64_msvc2019_64]
env:
targetName: GoldenDict.exe
@ -254,8 +254,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
Linux users can use Flatpak or build from source.
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer.

View file

@ -27,7 +27,7 @@ jobs:
strategy:
matrix:
os: [windows-2019]
qt_ver: [5.15.2,6.5.2]
qt_ver: [5.15.2,6.6.0]
qt_arch: [win64_msvc2019_64]
steps:
- uses: actions/setup-python@v3

View file

@ -3,21 +3,16 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
# workflow_run:
# workflows: [AutoTag]
# types: [completed]
workflow_dispatch:
push:
branches:
- dev
- master
# - staged
paths-ignore:
- 'docs/**'
# - ".github/**"
- "howto/**"
- "*.md"
- ".clang-format"
# push:
# branches:
# - dev
# - master
# paths-ignore:
# - 'docs/**'
# - "howto/**"
# - "*.md"
# - ".clang-format"
jobs:
build:
@ -228,8 +223,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
Linux users can use Flatpak or build from source.
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer.

View file

@ -3,7 +3,7 @@
[![Crowdin](https://badges.crowdin.net/goldendict-ng/localized.svg)](https://crowdin.com/project/goldendict-ng)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=xiaoyifang_goldendict&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=xiaoyifang_goldendict)
[![Windows-6.x](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/windows-6.x.yml/badge.svg)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/windows-6.x.yml)
[![Ubuntu-6.2](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml/badge.svg?branch=staged)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml)
[![Ubuntu-6.2](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml/badge.svg?event=push)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml)
[![macos-homebrew](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/macos-homebrew.yml/badge.svg)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/macos-homebrew.yml)
The Next Generation GoldenDict. A feature-rich open-source dictionary lookup program,

BIN
icons/audio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

BIN
icons/document.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

View file

@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;التصريحات التي أدلى بها &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;، مكتبة وسائط لغوية تعاونية في ويكيميديا فرنسا. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>قم بتمكين Lingua Libre</translation>
@ -4218,6 +4222,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>قراءة النّصوص</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

File diff suppressed because it is too large Load diff

View file

@ -3767,6 +3767,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Вывад версіі і звестак дыягностыкі.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Прымусіць слова быць перакладзены ў scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Прымусова перакласці слова ў галоўным акне</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3986,10 +3994,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Вымаўленне пададзена &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, - сумесная лінгвістычная бібліятэка Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Уключыць Lingua Libre</translation>
@ -4202,6 +4206,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Сінтэз маўлення</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Вымаўленне прадстаўлена &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, сумеснай лінгвістычнай медыятэкай Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Печатна версия и информация за диагностика.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Принудете думата да бъде преведена в scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Принудете думата да бъде преведена в главния прозорец</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Лингва Либре</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Произношенията са предоставени от &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, съвместна лингвистична медийна библиотека на Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Активирайте Lingua Libre</translation>
@ -4223,6 +4227,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Синтез говор</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Произношенията са предоставени от &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, съвместна лингвистична медийна библиотека на Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3763,6 +3763,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3982,10 +3990,6 @@ GoldenDict 尚不支持此方案。</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;法国维基百科合作语言媒体图书馆 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation> Lingua Libre</translation>
@ -4197,6 +4201,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation></translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ ze Stardict, Babylon a GLS slovníků</translation>
<source>Print version and diagnosis info.</source>
<translation>Tisk verze a diagnostické informace.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Vynutit překlad slova v scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Vynutit překlad slova v hlavním okně</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ V GoldenDictu ještě není implementován.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prokázané &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, kooperativní jazyková mediální knihovna Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Povolit Lingua Libre</translation>
@ -4217,6 +4221,10 @@ na spodek vhodných skupin.</translation>
<source>Text to Speech</source>
<translation>Zvuková syntéza</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Výslovnosti poskytuje &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, kolaborativní lingvistická mediální knihovna Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3781,6 +3781,14 @@ Stardict, Babylon und GLS Wörterbüchern wünschen.</translation>
<source>Print version and diagnosis info.</source>
<translation>Version und Diagnoseinformationen drucken.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Erzwinge das Wort im ScanPopUp zu übersetzen</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Erzwinge das Wort im Hauptfenster zu übersetzen</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4001,10 +4009,6 @@ Standardisiert als ISO 3602.
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations bereitgestellt von &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, einer gemeinschaftlichen linguistischen Medienbibliothek von Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre aktivieren</translation>
@ -4219,6 +4223,10 @@ Fügen Sie entsprechende Wörterbücher am besten am Ende der passenden Gruppe e
<source>Text to Speech</source>
<translation>Sprachausgabe</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Aussprachen bereitgestellt von &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, einer kollaborativen linguistischen Medienbibliothek von Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3772,6 +3772,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Version und Diagnoseinformationen drucken.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Erzwingen Sie die Übersetzung des Wortes in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Erzwingen Sie die Übersetzung des Wortes im Hauptfenster</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3992,10 +4000,6 @@ Noch nicht in GoldenDict implementiert.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations bereitgestellt von &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, einer gemeinschaftlichen linguistischen Medienbibliothek von Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre aktivieren</translation>
@ -4213,6 +4217,10 @@ der passende Gruppe ein, um sie zu benutzen.</translation>
<source>Text to Speech</source>
<translation>Sprachausgabe</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Aussprachen bereitgestellt von &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, einer kollaborativen linguistischen Medienbibliothek von Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3782,6 +3782,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Εκτυπωμένη έκδοση και πληροφορίες διάγνωσης.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Αναγκάστε να μεταφραστεί η λέξη στο scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Αναγκάστε να μεταφραστεί η λέξη στο κύριο παράθυρο</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4001,10 +4009,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Προτάσεις που προωθούνται από &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, μια συνεργατική βιβλιοθήκη γλωσσικών μέσων της Wikimedia Γαλλίας. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Ενεργοποίηση Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Εκφώνηση κειμένου</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Οι προφορές παρέχονται από το &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, μια συνεργατική βιβλιοθήκη γλωσσικών μέσων του Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ el Stardict, Babylon kaj GLS-vortaroj</translation>
<source>Print version and diagnosis info.</source>
<translation>Presa versio kaj diagnozaj informoj.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Devigu la vorton esti tradukita en scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Devigu la vorton esti tradukita en la ĉeffenestro</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Ankoraŭ ne efektivigita en GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingvo Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provid by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, kunlabora lingva amaskomunikilaro de Vikimedia Francio. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Ebligu Lingvon Libren</translation>
@ -4220,6 +4224,10 @@ de la taŭgaj grupoj por uzi ilin.</translation>
<source>Text to Speech</source>
<translation>Parolsintezo</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prononcoj provizitaj de &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, kunlabora lingva amaskomunikilaro de Vikimedia Francio. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Todavía no está implementado en GoldenDict.</translation>
<source>Lingua Libre</source>
<translation type="unfinished">Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prounciones promocionadas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, una biblioteca colaborativa de medios de comunicación lingüísticos de Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation>
@ -4219,6 +4223,10 @@ respectivamente, %GDBIG5% para Big-5, %GDBIG5HKSCS% para Big5-HKSCS, %GDGBK% par
<source>Text to Speech</source>
<translation>Texto a Voz</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3775,6 +3775,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3994,10 +4002,6 @@ Todavía no implementado en GoldenDict.</translation>
<source>Lingua Libre</source>
<translation type="unfinished">Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prounciones promocionadas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, una biblioteca colaborativa de medios de comunicación lingüísticos de Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation>
@ -4214,6 +4218,10 @@ fondos de grupos apropriados para utilizarlos.</translation>
<source>Text to Speech</source>
<translation type="unfinished">Text to Speech</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ de diccionarios Stardict, Babylon y GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Versión impresa e información de diagnóstico.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Forzar la traducción de la palabra en scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Forzar la traducción de la palabra en la ventana principal.</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Todavía no implementado en GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prounciones promocionadas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, una biblioteca colaborativa de medios de comunicación lingüísticos de Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Habilitar Lingua Libre</translation>
@ -4217,6 +4221,10 @@ de los grupos apropiados para utilizarlos.</translation>
<source>Text to Speech</source>
<translation>Síntesis de voz</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciaciones proporcionadas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, una biblioteca colaborativa de medios lingüísticos de Wikimedia Francia. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>نسخه چاپی و اطلاعات تشخیص</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>ترجمه اجباری کلمه در scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>مجبور کنید کلمه را در پنجره اصلی ترجمه کنید</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;تلفظ های ارائه شده توسط &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;، یک کتابخانه رسانه زبانی مشترک ویکی مدیا فرانسه. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre را فعال کنید</translation>
@ -4217,6 +4221,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>متن به گفتار</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;تلفظ ها توسط &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;ارائه شده است، یک کتابخانه رسانه زبانی مشترک ویکی مدیا فرانسه. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ alkaen alkaen alkupisteestä, Babylonista ja GLS-sanakirjoista</translation>
<source>Print version and diagnosis info.</source>
<translation>Tulostusversio ja diagnoositiedot.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Pakota sana käännettäväksi scanpopupissa</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Pakota sana käännettäväksi pääikkunassa</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Ei vielä käytössä GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, Wikimedia Francen kielikirjasto. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Ota Lingua Libre Käyttöön</translation>
@ -4220,6 +4224,10 @@ niiden käyttämiseksi.</translation>
<source>Text to Speech</source>
<translation>Tekstistä puheeksi</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ääntämiset tarjoaa &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, Wikimedia Francen yhteistoiminnallinen kielellinen mediakirjasto. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3776,6 +3776,14 @@ des dictionnaires Stardict, Babylon et GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Version imprimée et informations de diagnostic.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Forcer la traduction du mot dans scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Forcer la traduction du mot dans la fenêtre principale</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3996,10 +4004,6 @@ Pas encore implémenté dans GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations fournies par &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, une bibliothèque multimédia linguistique collaborative de Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Activer Lingua Libre</translation>
@ -4214,6 +4218,10 @@ Ajoutez les dictionnaires appropriés à la fin des groupes concernés pour les
<source>Text to Speech</source>
<translation>Synthèse vocale TTS</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prononciations fournies par &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, médiathèque linguistique collaborative de Wikimédia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3764,6 +3764,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>ि ि </translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation> ि ि </translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation> ि ि ि </translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3984,10 +3992,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>ि ि</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;लिंगुआ लिबरे&lt;/span&gt;&lt;/a&gt;द्वारा प्रमाणित, विकिमीडिया फ़्रांस की एक सहयोगी भाषाई मीडिया लाइब्रेरी। &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>ि ि </translation>
@ -4197,6 +4201,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation> ि </translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;लिंगुआ लिबरे&lt;/span&gt;&lt;/a&gt;द्वारा प्रदान किया गया है, जो विकिमीडिया फ़्रांस की एक सहयोगी भाषाई मीडिया लाइब्रेरी है। &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</translation>
<source>Text to Speech</source>
<translation>Diction</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3778,6 +3778,14 @@ dai dizionari di Stardict, Babylon e GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Stampa la versione e le informazioni sulla diagnosi.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Forza la traduzione della parola in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Forza la traduzione della parola nella finestra principale</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3998,10 +4006,6 @@ Non ancora implementato.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations fornite da &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, una biblioteca di media linguistici collaborativi di Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Abilita Lingua Libre</translation>
@ -4218,6 +4222,10 @@ in fondo al gruppo linguistico appropriato.</translation>
<source>Text to Speech</source>
<translation>Testo a sintesi vocale (Text to Speech)</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunce fornite da &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, una libreria multimediale linguistica collaborativa di Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation></translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>scanpopup </translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation></translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3999,10 +4007,6 @@ GoldenDict にはまだ実装されていません。</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;フランスのウィキメディアメディアライブラリであるリンガ・リブレ&lt;/span&gt;&lt;/a&gt;によって証明された主張。 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation></translation>
@ -4213,6 +4217,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation></translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;によって提供されています。 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</translation>
<source>Lingua Libre</source>
<translation type="unfinished">Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</translation>
<source>Text to Speech</source>
<translation type="unfinished">Text to Speech</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3776,6 +3776,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation> .</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation> </translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation> .</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3996,10 +4004,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation> </translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; Wikimedia France의 &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;에서 제공합니다. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation> </translation>
@ -4221,6 +4225,10 @@ GBK와 GB18030 → %GDGBK%, Shift-JIS → %GDSHIFTJIS%</translation>
<source>Text to Speech</source>
<translation> </translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; Wikimedia France의 &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;에서 제공됩니다. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Spausdinimo versija ir diagnostikos informacija.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Priverskite žodį išversti scanpopup.</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Priverskite žodį išversti pagrindiniame lange</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Dar įtraukta į GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tarimus pateikė &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, bendradarbiaujanti Wikimedia France lingvistinė medijos biblioteka. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Įgalinti Lingua Libre</translation>
@ -4216,6 +4220,10 @@ rašybos spėjimus.
<source>Text to Speech</source>
<translation>Balso sintezavimas</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tarimus pateikė &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, bendradarbiaujanti Wikimedia France lingvistinė medijos biblioteka. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3788,6 +3788,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Информации за печатена верзија и дијагноза.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Принудете го зборот да се преведе во scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Принудете го зборот да се преведе во главниот прозорец</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4008,10 +4016,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Лингва Либре</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Изговори обезбедени од &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, заедничка лингвистичка медиумска библиотека на Викимедија Франција. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Овозможете Lingua Libre</translation>
@ -4230,6 +4234,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Текст во говор</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Изговорите се обезбедени од &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, заедничка лингвистичка медиумска библиотека на Викимедија Франција. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3776,6 +3776,14 @@ van Stardict, Babylon en GLS woordenboeken</translation>
<source>Print version and diagnosis info.</source>
<translation>Printversie en diagnose-info.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Forceer het woord om te worden vertaald in scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Forceer dat het woord in het hoofdvenster wordt vertaald</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3996,10 +4004,6 @@ Nog niet geïmplementeerd in GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncaties geleverd door &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, een gezamenlijke taalmediabibliotheek van Wikimedia Frankrijk. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre inschakelen</translation>
@ -4216,6 +4220,10 @@ groep om ze te gebruiken.</translation>
<source>Text to Speech</source>
<translation>Tekst naar spraak</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uitspraken geleverd door &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, een gezamenlijke taalkundige mediabibliotheek van Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ ze słowników Stardict, Babylon i GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Wersja do druku i informacje diagnostyczne.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Wymuś przetłumaczenie słowa w scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Wymuś przetłumaczenie słowa w oknie głównym</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Systemu tego nie zaimplementowano jeszcze w programie GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations sprowokowały &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, wspólna biblioteka mediów językowych w Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Włącz Lingua Libre</translation>
@ -4221,6 +4225,10 @@ właściwej grupy.</translation>
<source>Text to Speech</source>
<translation>Tekst na mowę</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wymowy dostarczone przez &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, wspólną bibliotekę mediów językowych Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3785,6 +3785,14 @@ dos dicionários Stardict, Babylon e GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Versão impressa e informações de diagnóstico.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Forçar a palavra a ser traduzida no scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Forçar a palavra a ser traduzida na janela principal</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4005,10 +4013,6 @@ Ainda não implementado no GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncações fornecidas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, uma biblioteca de mídia linguística colaborativa da Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Habilitar Lingua Livre</translation>
@ -4229,6 +4233,10 @@ dos grupos apropriados para usá-los.</translation>
<source>Text to Speech</source>
<translation>Texto para Fala</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronúncias fornecidas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, uma biblioteca de mídia linguística colaborativa da Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ no Stardict, Babilônia e dicionários GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Versão impressa e informações de diagnóstico.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Forçar a palavra a ser traduzida no scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Forçar a palavra a ser traduzida na janela principal</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ não implementado ainda em GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncações fornecidas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, uma biblioteca de mídia linguística colaborativa da Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Habilitar Lingua Livre</translation>
@ -4220,6 +4224,10 @@ dos grupos apropriados para usá-los.</translation>
<source>Text to Speech</source>
<translation>Texto para fala</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronúncias fornecidas por &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, uma biblioteca de mídia linguística colaborativa da Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

File diff suppressed because it is too large Load diff

View file

@ -3785,6 +3785,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Версия для печати и диагностическая информация.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Принудительно перевести слово в scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Принудительно перевести слово в главном окне</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4005,10 +4013,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Принцессы, предоставленные &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, совместная библиотека лингвистических медиа во Франции. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Включить Lingua Libre</translation>
@ -4228,6 +4232,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Синтез речи</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Произношения предоставлены &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, совместной лингвистической медиабиблиотекой Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3773,6 +3773,14 @@ zo slovníkov Stardict, Babylon a GLS.</translation>
<source>Print version and diagnosis info.</source>
<translation>Vytlačiť verziu a diagnostické informácie.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Vynútiť preklad slova v scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Vynútiť preklad slova v hlavnom okne</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3993,10 +4001,6 @@ Zatiaľ nie je implementovaný v GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Výslovnosti poskytnuté &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, kolaboratívna lingvistická mediálna knižnica Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Povoliť Lingua Libre</translation>
@ -4211,6 +4215,10 @@ vhodné slovníky dole k vhodným skupinám.</translation>
<source>Text to Speech</source>
<translation>Text na reč</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Výslovnosti poskytuje &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, kolaboratívna lingvistická mediálna knižnica Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3772,6 +3772,14 @@ nga fjalorët Stardict, Babylon dhe GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Versioni i printuar dhe informacioni i diagnozës.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Detyrojeni fjalën përkthehet scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Detyrojeni fjalën përkthehet dritaren kryesore</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3992,10 +4000,6 @@ Akoma i pafutur në GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Shqiptime ofruara nga &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, një bibliotekë mediatike gjuhësore bashkëpunuese e Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Aktivizo Lingua Libre</translation>
@ -4211,6 +4215,10 @@ të caktuara për t&apos;i përdorur.</translation>
<source>Text to Speech</source>
<translation>Tekst tinguj</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Shqiptime siguruara nga &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, një bibliotekë mediatike gjuhësore bashkëpunuese e Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3782,6 +3782,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Верзија за штампање и информације о дијагнози.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Присилите да се реч преведе у искачућем прозору</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Присилите да се реч преведе у главном прозору</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4002,10 +4010,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Лингуа Либре</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Изговоре обезбедио &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Лингуа Либре&lt;/span&gt;&lt;/a&gt;, колаборативна лингвистичка медијска библиотека Викимедије Француске. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Омогућите Лингуа Либре</translation>
@ -4224,6 +4228,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Текст у говор</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Изговоре обезбеђује &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Лингуа Либре&lt;/span&gt;&lt;/a&gt;, сарадничка лингвистичка медијска библиотека Викимедије Француске. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3782,6 +3782,14 @@ från Stardict, Babylon och GLS ordböcker</translation>
<source>Print version and diagnosis info.</source>
<translation>Utskriftsversion och diagnosinformation.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Tvinga ordet att översättas i scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Tvinga ordet att översättas i huvudfönstret</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4002,10 +4010,6 @@ Har ännu inte implementerats i GoldenDict.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prounkeringar som tillhandahålls av &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, ett språkligt mediebibliotek i Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Aktivera Lingua Libre</translation>
@ -4222,6 +4226,10 @@ använda dem.</translation>
<source>Text to Speech</source>
<translation>Text till tal</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uttal tillhandahålls av &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, ett samarbetande språkligt mediebibliotek från Wikimedia Frankrike. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Версияи чопӣ ва маълумоти ташхис.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Маҷбур кунед, ки калимаро дар scanpopup тарҷума кунед</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Маҷбур кардани калима дар равзанаи асосӣ тарҷума карда шавад</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Тарҷумаҳо аз ҷониби &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, китобхонаи муштараки лингвистии Викимедиа Фаронса. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre-ро фаъол созед</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Матн ба талаффуз</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Талаффузҳо аз ҷониби &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, китобхонаи муштараки лингвистии Викимедиа Фаронса. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ arkaly goşmaça makalalary gözlemek üçin bu opsiýany açyň</translation>
<source>Print version and diagnosis info.</source>
<translation>Wersiýa we diagnoz maglumatlary çap ediň.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Sözü skanpopupda terjime etmäge mejbur ediň</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Sözü esasy setirde terjime etmäge mejbur ediň</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3999,10 +4007,6 @@ Entek GoldenDict-de edilmedik.</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wikimedia France- bilelikdäki dil metbugat kitaphanasy &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;tarapyndan berlen bildirişler. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre-i işlediň</translation>
@ -4215,6 +4219,10 @@ Laýyk gelýän sözlükleri degişli toparlaryň aşagyna goşup ulan.</transla
<source>Text to Speech</source>
<translation>Teksti gürläp aýtdyrmak</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wikimedia France- bilelikdäki lingwistik media kitaphanasy &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;tarapyndan berlen sözler. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3778,6 +3778,14 @@ eşanlamlı listeleri aracılığıyla ekstra makale aramasını etkinleştirmek
<source>Print version and diagnosis info.</source>
<translation>Sürümü ve teşhis bilgilerini yazdırın.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Scanpopup'ta çevrilecek kelimeyi zorla</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Ana pencerede çevrilecek kelimeyi zorla</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3998,10 +4006,6 @@ Henüz GoldenDict uygulanmadı.</translation>
<source>Lingua Libre</source>
<translation>Serbest Dil</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Telaffuz &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;tarafından sağlanmıştır, Wikimedia Fransa'nın işbirliğine dayalı bir dilbilimsel ortam kitaplığı. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre'yi Etkinleştir</translation>
@ -4216,6 +4220,10 @@ uygun grupların altlarına ekleyin.</translation>
<source>Text to Speech</source>
<translation>Metinden Sese</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Telaffuzlar, Wikimedia Fransa'nın ortak dilsel medya kütüphanesi olan &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;tarafından sağlanmıştır. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3781,6 +3781,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation>Друкована версія та інформація про діагностику.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Примусово перекласти слово у вікні сканування</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Примусово перекласти слово в головному вікні</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -4001,10 +4009,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Вимова надано &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, спільною лінгвістичною медіа-бібліотекою Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Увімкнути Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation>Текст для вимови</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Вимова надана &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, спільною лінгвістичною медіа-бібліотекою Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3773,6 +3773,14 @@ từ các từ điển Stardict, Babylon và GLS</translation>
<source>Print version and diagnosis info.</source>
<translation>Phiên bản in thông tin chẩn đoán.</translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation>Buộc dịch từ đó trong scanpopup</translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation>Buộc dịch từ trong cửa sổ chính</translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3993,10 +4001,6 @@ Chưa được bổ sung trong Từ điển Vàng.</translation>
<source>Lingua Libre</source>
<translation>ngôn ngữ tự do</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations đưc cung cấp bởi &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, một thư viện phương tiện ngôn ngữ cộng tác của Wikimedia Pháp. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Kích hoạt Lingua Libre</translation>
@ -4211,6 +4215,10 @@ phù hợp để sử dụng chúng.</translation>
<source>Text to Speech</source>
<translation>chuyển văn bản thành giọng nói</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cách phát âm đưc cung cấp bởi &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, một thư viện phương tiện ngôn ngữ hợp tác của Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -3581,7 +3581,7 @@ from Stardict, Babylon and GLS dictionaries</source>
</message>
<message>
<source>Appearance</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source>
@ -3763,6 +3763,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation></translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation> scanpopup </translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation></translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3982,10 +3990,6 @@ GoldenDict 尚不支持此方案。</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;法国维基百科合作语言媒体图书馆 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation> Lingua Libre</translation>
@ -4199,6 +4203,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source>
<translation></translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;提供。 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -465,7 +465,7 @@ between classic and school orthography in cyrillic)</source>
</message>
<message>
<source>Auto group by folder failed.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>The parent directory of %1 can not be reached.</source>
@ -473,7 +473,7 @@ between classic and school orthography in cyrillic)</source>
</message>
<message>
<source>Are you sure you want to generate a set of groups based on containing folders?</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Make two-side translate group &quot;%1-%2-%1&quot;</source>
@ -661,7 +661,7 @@ between classic and school orthography in cyrillic)</source>
</message>
<message>
<source>Open index folder</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -1064,11 +1064,11 @@ between classic and school orthography in cyrillic)</source>
</message>
<message>
<source>Create folder-based groups.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Group by Folders</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Group by Metadata</source>
@ -3589,7 +3589,7 @@ from Stardict, Babylon and GLS dictionaries</source>
</message>
<message>
<source>Appearance</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source>
@ -3745,7 +3745,7 @@ from Stardict, Babylon and GLS dictionaries</source>
</message>
<message>
<source>Save debug messages to gd_log.txt in the config folder.</source>
<translation>調 gd_log.txt</translation>
<translation> config gd_log.txt</translation>
</message>
<message>
<source>Reset window state.</source>
@ -3771,6 +3771,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source>
<translation></translation>
</message>
<message>
<source>Force the word to be translated in scanpopup</source>
<translation> scanpopup </translation>
</message>
<message>
<source>Force the word to be translated in the mainwindow</source>
<translation></translation>
</message>
</context>
<context>
<name>QuickFilterLine</name>
@ -3991,10 +3999,6 @@ GoldenDict 尚不支援此方案。</translation>
<source>Lingua Libre</source>
<translation>Lingua Libre</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt; 提供,後者是法國維基媒體的協作語言媒體庫。 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Enable Lingua Libre</source>
<translation>Lingua Libre</translation>
@ -4208,6 +4212,10 @@ Big-5 使用%GDBIG5%Big5-HKSCS 使用 %GDBIG5HKSCS% GBK 和 GB18030 使用
<source>Text to Speech</source>
<translation></translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;提供。 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>StylesComboBox</name>

View file

@ -1,6 +1,8 @@
<RCC>
<qresource prefix="/">
<file>icons/add-anki-icon.svg</file>
<file>icons/document.png</file>
<file>icons/audio.png</file>
<file>version.txt</file>
<file>icons/arrow.png</file>
<file>icons/prefix.png</file>

View file

@ -156,7 +156,7 @@ body { background: #242525; }
.gdarticle { background: initial;}
.gdarticlebody img{
background: white;
background: white !important;
}
</style>
<script>
@ -246,46 +246,9 @@ std::string ArticleMaker::makeNotFoundBody( QString const & word, QString const
return result;
}
sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const & word,
unsigned groupId,
QMap< QString, QString > const & contexts,
QSet< QString > const & mutedDicts,
QStringList const & dictIDs,
bool ignoreDiacritics ) const
string ArticleMaker::makeWelcomeHtml() const
{
if ( !dictIDs.isEmpty() ) {
QStringList ids = dictIDs;
std::vector< sptr< Dictionary::Class > > ftsDicts;
// Find dictionaries by ID's
for ( unsigned x = 0; x < dictionaries.size(); x++ ) {
for ( QStringList::Iterator it = ids.begin(); it != ids.end(); ++it ) {
if ( *it == QString::fromStdString( dictionaries[ x ]->getId() ) ) {
ftsDicts.push_back( dictionaries[ x ] );
ids.erase( it );
break;
}
}
if ( ids.isEmpty() )
break;
}
string header = makeHtmlHeader( word, QString(), true );
return std::make_shared< ArticleRequest >( word,
Instances::Group{ groupId, "" },
contexts,
ftsDicts,
header,
-1,
true );
}
if ( groupId == Instances::Group::HelpGroupId ) {
// This is a special group containing internal welcome/help pages
string result = makeHtmlHeader( word, QString(), cfg.alwaysExpandOptionalParts );
if ( word == tr( "Welcome!" ) ) {
string result = makeHtmlHeader( tr( "Welcome!" ), QString(), cfg.alwaysExpandOptionalParts );
//tooltip
result += R"(<script src="qrc:///scripts/popper.min.js"></script>)";
result += R"(<script src="qrc:///scripts/tippy.min.js"></script>)";
@ -350,27 +313,68 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const &
</script>)" )
.arg( theme )
.toStdString();
result += "</body></html>";
return result;
}
sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const & word,
unsigned groupId,
QMap< QString, QString > const & contexts,
QSet< QString > const & mutedDicts,
QStringList const & dictIDs,
bool ignoreDiacritics ) const
{
if ( !dictIDs.isEmpty() ) {
QStringList ids = dictIDs;
std::vector< sptr< Dictionary::Class > > ftsDicts;
// Find dictionaries by ID's
for ( unsigned x = 0; x < dictionaries.size(); x++ ) {
for ( QStringList::Iterator it = ids.begin(); it != ids.end(); ++it ) {
if ( *it == QString::fromStdString( dictionaries[ x ]->getId() ) ) {
ftsDicts.push_back( dictionaries[ x ] );
ids.erase( it );
break;
}
}
if ( ids.isEmpty() )
break;
}
string header = makeHtmlHeader( word, QString(), true );
return std::make_shared< ArticleRequest >( word,
Instances::Group{ groupId, "" },
contexts,
ftsDicts,
header,
-1,
true );
}
if ( groupId == Instances::Group::HelpGroupId ) {
if ( word == tr( "Welcome!" ) ) {
string welcome = makeWelcomeHtml();
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
r->appendString( welcome );
return r;
}
else {
// Not found
return makeNotFoundTextFor( word, "help" );
}
result += "</body></html>";
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
r->appendString( result );
return r;
}
// Find the given group
Instances::Group const * activeGroup = 0;
for ( unsigned x = 0; x < groups.size(); ++x )
if ( groups[ x ].id == groupId ) {
activeGroup = &groups[ x ];
for ( const auto & group : groups )
if ( group.id == groupId ) {
activeGroup = &group;
break;
}
@ -426,19 +430,22 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeNotFoundTextFor( QString const
sptr< Dictionary::DataRequest > ArticleMaker::makeEmptyPage() const
{
string result = makeHtmlHeader( tr( "(untitled)" ), QString(), true ) + "</body></html>";
string result = makeUntitleHtml();
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
r->appendString( result );
return r;
}
string ArticleMaker::makeUntitleHtml() const
{
return makeHtmlHeader( tr( "(untitled)" ), QString(), true ) + "</body></html>";
}
sptr< Dictionary::DataRequest > ArticleMaker::makePicturePage( string const & url ) const
{
string result = makeHtmlHeader( tr( "(picture)" ), QString(), true )
+ R"lit(<a href="javascript: if(history.length>2) history.go(-1)">)lit" + R"(<img src=")" + url + R"(" /></a>)"
+ "</body></html>";
string const result =
makeHtmlHeader( tr( "(picture)" ), QString(), true ) + R"(<img src=")" + url + R"(" />)" + "</body></html>";
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
@ -461,6 +468,10 @@ bool ArticleMaker::adjustFilePath( QString & fileName )
}
return false;
}
string ArticleMaker::makeBlankHtml() const
{
return makeHtmlHeader( "", QString(), true ) + "</body></html>";
}
//////// ArticleRequest
@ -869,13 +880,12 @@ void ArticleRequest::stemmedSearchFinished()
continueMatching = true;
}
if ( !continueMatching )
if ( !continueMatching ) {
footer += "</body></html>";
{
appendString( footer );
}
appendString( footer );
if ( continueMatching )
update();
else
@ -891,8 +901,6 @@ void ArticleRequest::compoundSearchNextStep( bool lastSearchSucceeded )
if ( lastGoodCompoundResult.size() ) // We have something to append
{
// GD_DPRINTF( "Appending\n" );
if ( !firstCompoundWasFound ) {
// Append the beginning
footer += R"(<div class="gdstemmedsuggestion"><span class="gdstemmedsuggestion_head">)"

View file

@ -16,7 +16,8 @@
/// This class generates the article's body for the given lookup request
class ArticleMaker: public QObject
{
Q_OBJECT // We make it QObject to use tr() conveniently
Q_OBJECT
// We make it QObject to use tr() conveniently
std::vector< sptr< Dictionary::Class > > const & dictionaries;
std::vector< Instances::Group > const & groups;
@ -62,6 +63,9 @@ public:
/// Add base path to file path if it's relative and file not found
/// Return true if path successfully adjusted
static bool adjustFilePath( QString & fileName );
string makeUntitleHtml() const;
string makeWelcomeHtml() const;
string makeBlankHtml() const;
private:
std::string readCssFile( QString const & fileName, std::string type ) const;

View file

@ -62,45 +62,7 @@ AllowFrameReply::AllowFrameReply( QNetworkReply * _reply ):
void AllowFrameReply::applyMetaData()
{
// Set raw headers except X-Frame-Options
QList< QByteArray > rawHeaders = baseReply->rawHeaderList();
for ( QList< QByteArray >::iterator it = rawHeaders.begin(); it != rawHeaders.end(); ++it ) {
auto headerName = it->toLower();
if ( headerName != "x-frame-options" && headerName != "content-security-policy" )
setRawHeader( *it, baseReply->rawHeader( *it ) );
}
// Set known headers
setHeader( QNetworkRequest::ContentDispositionHeader,
baseReply->header( QNetworkRequest::ContentDispositionHeader ) );
setHeader( QNetworkRequest::ContentTypeHeader, baseReply->header( QNetworkRequest::ContentTypeHeader ) );
setHeader( QNetworkRequest::ContentLengthHeader, baseReply->header( QNetworkRequest::ContentLengthHeader ) );
setHeader( QNetworkRequest::LocationHeader, baseReply->header( QNetworkRequest::LocationHeader ) );
setHeader( QNetworkRequest::LastModifiedHeader, baseReply->header( QNetworkRequest::LastModifiedHeader ) );
setHeader( QNetworkRequest::CookieHeader, baseReply->header( QNetworkRequest::CookieHeader ) );
setHeader( QNetworkRequest::SetCookieHeader, baseReply->header( QNetworkRequest::SetCookieHeader ) );
setHeader( QNetworkRequest::UserAgentHeader, baseReply->header( QNetworkRequest::UserAgentHeader ) );
setHeader( QNetworkRequest::ServerHeader, baseReply->header( QNetworkRequest::ServerHeader ) );
// Set attributes
setAttribute( QNetworkRequest::HttpStatusCodeAttribute,
baseReply->attribute( QNetworkRequest::HttpStatusCodeAttribute ) );
setAttribute( QNetworkRequest::HttpReasonPhraseAttribute,
baseReply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ) );
setAttribute( QNetworkRequest::RedirectionTargetAttribute,
baseReply->attribute( QNetworkRequest::RedirectionTargetAttribute ) );
setAttribute( QNetworkRequest::ConnectionEncryptedAttribute,
baseReply->attribute( QNetworkRequest::ConnectionEncryptedAttribute ) );
setAttribute( QNetworkRequest::SourceIsFromCacheAttribute,
baseReply->attribute( QNetworkRequest::SourceIsFromCacheAttribute ) );
setAttribute( QNetworkRequest::HttpPipeliningWasUsedAttribute,
baseReply->attribute( QNetworkRequest::HttpPipeliningWasUsedAttribute ) );
setAttribute( QNetworkRequest::BackgroundRequestAttribute,
baseReply->attribute( QNetworkRequest::BackgroundRequestAttribute ) );
setAttribute( QNetworkRequest::Http2WasUsedAttribute,
baseReply->attribute( QNetworkRequest::Http2WasUsedAttribute ) );
emit metaDataChanged();
// The webengine does not support to customize the headers right now ,maybe until Qt6.7 there should be some api supports
}
void AllowFrameReply::setReadBufferSize( qint64 size )
@ -135,35 +97,20 @@ void AllowFrameReply::finishedSlot()
QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest const & req )
{
QUrl url;
auto op = GetOperation;
if ( req.url().scheme() == "qrcx" ) {
// We had to override the local load policy for the qrc URL scheme until QWebSecurityOrigin::addLocalScheme() was
// introduced in Qt 4.6. Hence we used a custom qrcx URL scheme and redirected it here back to qrc. Qt versions
// older than 4.6 are no longer supported, so GoldenDict itself no longer uses the qrcx scheme. However, qrcx has
// been used for many years in our built-in article styles, and so may appear in user-defined article styles.
// TODO: deprecate (print a warning or show a warning message box) and eventually remove support for the obsolete
// qrcx URL scheme. A recent commit "Add support for qrc:// URL scheme" is the first one where the qrc scheme
// works correctly. So the deprecation has to wait until older GoldenDict versions become rarely used.
QUrl newUrl( req.url() );
newUrl.setScheme( "qrc" );
newUrl.setHost( "" );
QNetworkRequest newReq( req );
newReq.setUrl( newUrl );
return QNetworkAccessManager::createRequest( op, newReq, nullptr );
// Do not support qrcx which is the custom define protocol.
return new BlockedNetworkReply( this );
}
url = req.url();
auto op = GetOperation;
QUrl url = req.url();
QMimeType mineType = db.mimeTypeForUrl( url );
QString contentType = mineType.name();
if ( req.url().scheme() == "gdlookup" ) {
QString path = url.path();
if ( !path.isEmpty() ) {
if ( path.size() > 1 ) {
url.setPath( "" );
Utils::Url::addQueryItem( url, "word", path.mid( 1 ) );
@ -171,7 +118,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
}
}
sptr< Dictionary::DataRequest > dr = getResource( url, contentType );
auto dr = getResource( url, contentType );
if ( dr.get() )
return new ArticleResourceReply( this, req, dr, contentType );
@ -182,7 +129,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
//if not external url,can be blocked from here. no need to continue execute the following code.
//such as bres://upload.wikimedia.... etc .
if ( !Utils::isExternalLink( url ) ) {
gdWarning( "Blocking element \"%s\" as built-in link ", req.url().toEncoded().data() );
gdWarning( R"(Blocking element "%s" as built-in link )", req.url().toEncoded().data() );
return new BlockedNetworkReply( this );
}
@ -197,7 +144,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
if ( !url.host().endsWith( refererUrl.host() )
&& Utils::Url::getHostBaseFromUrl( url ) != Utils::Url::getHostBaseFromUrl( refererUrl )
&& !url.scheme().startsWith( "data" ) ) {
gdWarning( "Blocking element \"%s\" due to not same domain", url.toEncoded().data() );
gdWarning( R"(Blocking element "%s" due to not same domain)", url.toEncoded().data() );
return new BlockedNetworkReply( this );
}
@ -206,7 +153,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
if ( req.url().scheme() == "file" ) {
// Check file presence and adjust path if necessary
QString fileName = req.url().toLocalFile();
if ( req.url().host().isEmpty() && articleMaker.adjustFilePath( fileName ) ) {
if ( req.url().host().isEmpty() && ArticleMaker::adjustFilePath( fileName ) ) {
QUrl newUrl( req.url() );
QUrl localUrl = QUrl::fromLocalFile( fileName );
@ -239,6 +186,20 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
return new AllowFrameReply( reply );
}
string ArticleNetworkAccessManager::getHtml( ResourceType resourceType )
{
switch ( resourceType ) {
case ResourceType::UNTITLE:
return articleMaker.makeUntitleHtml();
case ResourceType::WELCOME:
return articleMaker.makeWelcomeHtml();
case ResourceType::BLANK:
return articleMaker.makeBlankHtml();
default:
return {};
}
}
sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl const & url, QString & contentType )
{
qDebug() << "getResource:" << url.toString();
@ -275,21 +236,8 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
// Unpack contexts
QMap< QString, QString > contexts;
QString contextsEncoded = Utils::Url::queryItemValue( url, "contexts" );
if ( contextsEncoded.size() ) {
QByteArray ba = QByteArray::fromBase64( contextsEncoded.toLatin1() );
QBuffer buf( &ba );
buf.open( QBuffer::ReadOnly );
QDataStream stream( &buf );
stream >> contexts;
}
QString const contextsEncoded = Utils::Url::queryItemValue( url, "contexts" );
QMap< QString, QString > const contexts = Utils::str2map( contextsEncoded );
// See for ignore diacritics
@ -301,21 +249,22 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
if ( ( url.scheme() == "bres" || url.scheme() == "gdau" || url.scheme() == "gdvideo" || url.scheme() == "gico" )
&& url.path().size() ) {
//GD_DPRINTF( "Get %s\n", req.url().host().toLocal8Bit().data() );
//GD_DPRINTF( "Get %s\n", req.url().path().toLocal8Bit().data() );
QMimeType mineType = db.mimeTypeForUrl( url );
contentType = mineType.name();
string id = url.host().toStdString();
bool search = ( id == "search" );
if ( !search ) {
for ( unsigned x = 0; x < dictionaries.size(); ++x )
if ( dictionaries[ x ]->getId() == id ) {
for ( const auto & dictionary : dictionaries )
if ( dictionary->getId() == id ) {
if ( url.scheme() == "gico" ) {
QByteArray bytes;
QBuffer buffer( &bytes );
buffer.open( QIODevice::WriteOnly );
dictionaries[ x ]->getIcon().pixmap( 64 ).save( &buffer, "PNG" );
dictionary->getIcon().pixmap( 64 ).save( &buffer, "PNG" );
buffer.close();
sptr< Dictionary::DataRequestInstant > ico = std::make_shared< Dictionary::DataRequestInstant >( true );
ico->getData().resize( bytes.size() );
@ -323,24 +272,17 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
return ico;
}
try {
return dictionaries[ x ]->getResource( Utils::Url::path( url ).mid( 1 ).toUtf8().data() );
return dictionary->getResource( Utils::Url::path( url ).mid( 1 ).toUtf8().data() );
}
catch ( std::exception & e ) {
gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), dictionaries[ x ]->getName().c_str() );
return sptr< Dictionary::DataRequest >();
gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), dictionary->getName().c_str() );
return {};
}
}
}
}
if ( url.scheme() == "gdpicture" ) {
contentType = "text/html";
QUrl imgUrl( url );
imgUrl.setScheme( "bres" );
return articleMaker.makePicturePage( imgUrl.toEncoded().data() );
}
return sptr< Dictionary::DataRequest >();
return {};
}
ArticleResourceReply::ArticleResourceReply( QObject * parent,
@ -401,16 +343,17 @@ void ArticleResourceReply::reqFinished()
qint64 ArticleResourceReply::bytesAvailable() const
{
qint64 avail = req->dataSize();
qint64 const avail = req->dataSize();
if ( avail < 0 )
return 0;
if ( !req->isFinished() ) {
return 65536;
qint64 const availBytes = avail - alreadyRead + QNetworkReply::bytesAvailable();
if ( availBytes == 0 && !req->isFinished() ) {
return 10240;
}
return avail - alreadyRead + QNetworkReply::bytesAvailable();
return availBytes;
}
@ -426,17 +369,17 @@ qint64 ArticleResourceReply::readData( char * out, qint64 maxSize )
if ( maxSize == 0 )
return 0;
bool finished = req->isFinished();
bool const finished = req->isFinished();
qint64 avail = req->dataSize();
qint64 const avail = req->dataSize();
if ( avail < 0 )
return finished ? -1 : 0;
qint64 left = avail - alreadyRead;
qint64 const left = avail - alreadyRead;
qint64 toRead = maxSize < left ? maxSize : left;
qint64 const toRead = maxSize < left ? maxSize : left;
if ( !toRead && finished )
return -1;
GD_DPRINTF( "====reading %d of (%lld) bytes . Finished: %d", (int)toRead, avail, finished );
@ -501,15 +444,15 @@ LocalSchemeHandler::LocalSchemeHandler( ArticleNetworkAccessManager & articleNet
void LocalSchemeHandler::requestStarted( QWebEngineUrlRequestJob * requestJob )
{
QUrl url = requestJob->requestUrl();
QUrl const url = requestJob->requestUrl();
QNetworkRequest request;
request.setUrl( url );
//all the url reached here must be either gdlookup or bword scheme.
auto [ valid, word ] = Utils::Url::getQueryWord( url );
auto [ schemeValid, word ] = Utils::Url::getQueryWord( url );
// or the condition can be (!queryWord.first || word.isEmpty())
// ( queryWord.first && word.isEmpty() ) is only part of the above condition.
if ( valid && word.isEmpty() ) {
if ( schemeValid && word.isEmpty() ) {
// invalid gdlookup url.
return;
}

View file

@ -125,6 +125,11 @@ protected:
}
};
enum class ResourceType {
UNTITLE,
WELCOME,
BLANK
};
class ArticleNetworkAccessManager: public QNetworkAccessManager
{
@ -157,6 +162,7 @@ public:
sptr< Dictionary::DataRequest > getResource( QUrl const & url, QString & contentType );
virtual QNetworkReply * getArticleReply( QNetworkRequest const & req );
string getHtml( ResourceType resourceType );
};
class ArticleResourceReply: public QNetworkReply

View file

@ -36,9 +36,9 @@ bool tryPossibleZipName( std::string const & name, std::string & copyTo )
void loadFromFile( std::string const & filename, std::vector< char > & data )
{
File::Class f( filename, "rb" );
QByteArray byteArray{ f.readall() };
data.reserve( byteArray.size() );
data = std::vector< char >( byteArray.cbegin(), byteArray.cend() );
auto size = f.file().size(); // QFile::size() obtains size via statx on Linux
data.resize( size );
f.read( data.data(), size );
}
void Class::open( char const * mode )
@ -82,10 +82,9 @@ Class::Class( std::string_view filename, char const * mode )
void Class::read( void * buf, qint64 size )
{
qint64 result = f.read( static_cast< char * >( buf ), size );
if ( result != size )
if ( f.read( static_cast< char * >( buf ), size ) != size ) {
throw exReadError();
}
}
size_t Class::readRecords( void * buf, qint64 size, qint64 count )

View file

@ -13,7 +13,8 @@
#include <vector>
#include <QMutex>
/// A simple wrapper over QFile with some convenient GD specific functions
/// A wrapper over QFile with some GD specific functions
/// and exception throwing which are required for older coded to work correctly
/// Consider the wrapped QFile as private implementation in the `Pimpl Idiom`
///
/// Note: this is used *only* in code related to `Dictionary::CLass` to manage dict files.

View file

@ -18,14 +18,6 @@ GlobalBroadcaster * GlobalBroadcaster::instance()
return bdcaster;
}
void GlobalBroadcaster::insertCache( const QString & key, QByteArray * object )
{
//do not cache the item when debug dictionary.
if ( preference->dictionaryDebug )
return;
cache.insert( key, object );
}
void GlobalBroadcaster::setPreference( Config::Preferences * p )
{
preference = p;

View file

@ -41,10 +41,6 @@ public:
QMap< QString, QSet< QString > > folderFavoritesMap;
QMap< unsigned, QString > groupFolderMap;
PronounceEngine pronounce_engine;
QCache< QString, QByteArray > cache;
void insertCache( const QString &, QByteArray * );
signals:
void dictionaryChanges( ActiveDictIds ad );
void dictionaryClear( ActiveDictIds ad );

View file

@ -24,7 +24,8 @@ QRegularExpression Ftx::token( R"((".*?")|([\w\W\+\-]+))",
| QRegularExpression::CaseInsensitiveOption );
//mdx
QRegularExpression Mdx::allLinksRe( R"((?:<\s*(a(?:rea)?|img|link|script|source)(?:\s+[^>]+|\s*)>))",
//<audio src="xxx"> is also a valid url.
QRegularExpression Mdx::allLinksRe( R"((?:<\s*(a(?:rea)?|img|link|script|source|audio|video)(?:\s+[^>]+|\s*)>))",
QRegularExpression::CaseInsensitiveOption );
QRegularExpression Mdx::wordCrossLink( R"(([\s"']href\s*=)\s*(["'])entry://([^>#]*?)((?:#[^>]*?)?)\2)",
QRegularExpression::CaseInsensitiveOption );

View file

@ -7,8 +7,23 @@
#ifdef _MSC_VER
#include <stub_msvc.h>
#endif
#include <QBuffer>
using std::string;
namespace Utils {
QMap< QString, QString > str2map( const QString & contextsEncoded )
{
QMap< QString, QString > contexts;
if ( contextsEncoded.size() ) {
QByteArray ba = QByteArray::fromBase64( contextsEncoded.toLatin1() );
QBuffer buf( &ba );
buf.open( QBuffer::ReadOnly );
QDataStream stream( &buf );
stream >> contexts;
}
return contexts;
}
//some str has \0 in the middle of the string. return the string before the \0
std::string c_string( const QString & str )
{
@ -38,17 +53,16 @@ QString Utils::Url::getSchemeAndHost( QUrl const & url )
void Utils::Widget::setNoResultColor( QWidget * widget, bool noResult )
{
if ( noResult ) {
QPalette pal( widget->palette() );
// #febb7d
QRgb rgb = 0xfebb7d;
pal.setColor( QPalette::Base, QColor( rgb ) );
widget->setAutoFillBackground( true );
widget->setPalette( pal );
auto font = widget->font();
font.setItalic( true );
widget->setFont( font );
}
else {
QPalette pal( widget->style()->standardPalette() );
widget->setAutoFillBackground( true );
widget->setPalette( pal );
auto font = widget->font();
font.setItalic( false );
widget->setFont( font );
}
}

View file

@ -17,6 +17,8 @@
using std::string;
namespace Utils {
QMap< QString, QString > str2map( const QString & contextsEncoded );
inline bool isCJKChar( ushort ch )
{
if ( ( ch >= 0x3400 && ch <= 0x9FFF ) || ( ch >= 0xF900 && ch <= 0xFAFF ) || ( ch >= 0xD800 && ch <= 0xDFFF ) )

View file

@ -1013,8 +1013,6 @@ Class load()
c.preferences.removeInvalidIndexOnExit =
( preferences.namedItem( "removeInvalidIndexOnExit" ).toElement().text() == "1" );
c.preferences.dictionaryDebug = fromConfig2Preference( preferences.namedItem( "dictionaryDebug" ), "1" );
if ( !preferences.namedItem( "maxStringsInHistory" ).isNull() )
c.preferences.maxStringsInHistory = preferences.namedItem( "maxStringsInHistory" ).toElement().text().toUInt();
@ -1160,9 +1158,6 @@ Class load()
if ( !root.namedItem( "editDictionaryCommandLine" ).isNull() )
c.editDictionaryCommandLine = root.namedItem( "editDictionaryCommandLine" ).toElement().text();
if ( !root.namedItem( "maxPictureWidth" ).isNull() )
c.maxPictureWidth = root.namedItem( "maxPictureWidth" ).toElement().text().toInt();
if ( !root.namedItem( "maxHeadwordSize" ).isNull() ) {
unsigned int value = root.namedItem( "maxHeadwordSize" ).toElement().text().toUInt();
if ( value != 0 ) // 0 is invalid value for our purposes
@ -2003,10 +1998,6 @@ void save( Class const & c )
opt.appendChild( dd.createTextNode( c.preferences.removeInvalidIndexOnExit ? "1" : "0" ) );
preferences.appendChild( opt );
opt = dd.createElement( "dictionaryDebug" );
opt.appendChild( dd.createTextNode( c.preferences.dictionaryDebug ? "1" : "0" ) );
preferences.appendChild( opt );
opt = dd.createElement( "maxStringsInHistory" );
opt.appendChild( dd.createTextNode( QString::number( c.preferences.maxStringsInHistory ) ) );
preferences.appendChild( opt );
@ -2172,10 +2163,6 @@ void save( Class const & c )
opt.appendChild( dd.createTextNode( c.editDictionaryCommandLine ) );
root.appendChild( opt );
opt = dd.createElement( "maxPictureWidth" );
opt.appendChild( dd.createTextNode( QString::number( c.maxPictureWidth ) ) );
root.appendChild( opt );
opt = dd.createElement( "maxHeadwordSize" );
opt.appendChild( dd.createTextNode( QString::number( c.maxHeadwordSize ) ) );
root.appendChild( opt );

View file

@ -404,7 +404,6 @@ struct Preferences
int maxNetworkCacheSize;
bool clearNetworkCacheOnExit;
bool removeInvalidIndexOnExit = false;
bool dictionaryDebug = false;
qreal zoomFactor;
qreal helpZoomFactor;
@ -881,8 +880,6 @@ struct Class
bool usingSmallIconsInToolbars;
int maxPictureWidth; // Maximum picture width
/// Maximum size for the headwords.
/// Bigger headwords won't be indexed. For now, only in DSL.
unsigned int maxHeadwordSize;
@ -899,7 +896,6 @@ struct Class
pinPopupWindow( false ),
showingDictBarNames( false ),
usingSmallIconsInToolbars( false ),
maxPictureWidth( 0 ),
maxHeadwordSize( 256U ),
maxHeadwordsToExpand( 0 )
{

View file

@ -40,12 +40,14 @@ void Request::update()
void Request::finish()
{
if ( !Utils::AtomicInt::loadAcquire( isFinishedFlag ) ) {
isFinishedFlag.ref();
emit finished();
{
QMutexLocker _( &dataMutex );
isFinishedFlag.ref();
cond.wakeAll();
}
emit finished();
}
}
void Request::setErrorString( QString const & str )

View file

@ -403,6 +403,9 @@ public:
int getIndexingFtsProgress()
{
if ( haveFTSIndex() ) {
return 100;
}
auto total = getArticleCount();
if ( total == 0 )
return 0;

View file

@ -62,9 +62,8 @@ bool connectToServer( QTcpSocket & socket, QString const & url, QString & errorS
return false;
socket.connectToHost( serverUrl.host(), port );
if ( socket.state() != QTcpSocket::ConnectedState ) {
if ( !socket.waitForConnected( 5000 ) )
if ( !socket.waitForConnected( 2000 ) )
break;
}
@ -197,6 +196,25 @@ public:
strategies = strategies_.split( QRegularExpression( "[ ,;]" ), Qt::SkipEmptyParts );
if ( strategies.isEmpty() )
strategies.append( "prefix" );
QUrl serverUrl( url );
quint16 port = serverUrl.port( DefaultPort );
QString reply;
socket.connectToHost( serverUrl.host(), port );
connect( &socket, &QTcpSocket::connected, this, [ this ]() {
//initialize the description.
getServerDatabasesAfterConnect();
} );
connect( &socket, &QTcpSocket::stateChanged, this, []( QAbstractSocket::SocketState state ) {
qDebug() << "socket state change: " << state;
} );
connect( &socket, &QTcpSocket::errorOccurred, this, []( QAbstractSocket::SocketError error ) {
qDebug() << "socket error message: " << error;
} );
}
~DictServerDictionary() override
{
disconnectFromServer( socket );
}
string getName() noexcept override
@ -206,7 +224,7 @@ public:
map< Property, string > getProperties() noexcept override
{
return map< Property, string >();
return {};
}
unsigned long getArticleCount() noexcept override
@ -239,10 +257,9 @@ protected:
void loadIcon() noexcept override;
void getServerDatabases();
friend class DictServerWordSearchRequest;
friend class DictServerArticleRequest;
void getServerDatabasesAfterConnect();
};
void DictServerDictionary::loadIcon() noexcept
@ -262,11 +279,6 @@ void DictServerDictionary::loadIcon() noexcept
QString const & DictServerDictionary::getDescription()
{
if ( serverDatabases.isEmpty() ) {
dictionaryDescription.clear();
getServerDatabases();
}
if ( dictionaryDescription.isEmpty() ) {
dictionaryDescription = QCoreApplication::translate( "DictServer", "Url: " ) + url + "\n";
dictionaryDescription += QCoreApplication::translate( "DictServer", "Databases: " ) + databases.join( ", " ) + "\n";
@ -283,23 +295,18 @@ QString const & DictServerDictionary::getDescription()
return dictionaryDescription;
}
void DictServerDictionary::getServerDatabases()
void DictServerDictionary::getServerDatabasesAfterConnect()
{
QAtomicInt isCancelled;
QTcpSocket * socket = new QTcpSocket;
if ( !socket )
return;
if ( connectToServer( *socket, url, errorString, isCancelled ) ) {
for ( ;; ) {
QString req = QString( "SHOW DB\r\n" );
socket->write( req.toUtf8() );
socket->waitForBytesWritten( 1000 );
socket.write( req.toUtf8() );
socket.waitForBytesWritten( 1000 );
QString reply;
if ( !readLine( *socket, reply, errorString, isCancelled ) )
if ( !readLine( socket, reply, errorString, isCancelled ) )
return;
if ( reply.left( 3 ) == "110" ) {
@ -309,7 +316,7 @@ void DictServerDictionary::getServerDatabases()
// Read databases
for ( int x = 0; x < count; x++ ) {
if ( !readLine( *socket, reply, errorString, isCancelled ) )
if ( !readLine( socket, reply, errorString, isCancelled ) )
break;
if ( reply[ 0 ] == '.' )
@ -329,12 +336,6 @@ void DictServerDictionary::getServerDatabases()
break;
}
}
disconnectFromServer( *socket );
}
if ( !errorString.isEmpty() )
gdWarning( "Retrieving databases from \"%s\" fault: %s\n", getName().c_str(), errorString.toUtf8().data() );
delete socket;
}
class DictServerWordSearchRequest: public Dictionary::WordSearchRequest
@ -482,7 +483,7 @@ void DictServerWordSearchRequest::run()
if ( count ) {
QMutexLocker _( &dataMutex );
for ( int x = 0; x < count; x++ )
matches.push_back( gd::toWString( matchesList.at( x ) ) );
matches.emplace_back( gd::toWString( matchesList.at( x ) ) );
}
}
}
@ -496,6 +497,7 @@ void DictServerWordSearchRequest::run()
disconnectFromServer( *socket );
delete socket;
socket = nullptr;
if ( !Utils::AtomicInt::loadAcquire( isCancelled ) )
finish();
}
@ -503,8 +505,6 @@ void DictServerWordSearchRequest::run()
void DictServerWordSearchRequest::cancel()
{
isCancelled.ref();
QMutexLocker _( &dataMutex );
finish();
}
@ -793,6 +793,7 @@ void DictServerArticleRequest::run()
disconnectFromServer( *socket );
delete socket;
socket = nullptr;
if ( !Utils::AtomicInt::loadAcquire( isCancelled ) )
finish();
}
@ -801,12 +802,10 @@ void DictServerArticleRequest::cancel()
{
isCancelled.ref();
QMutexLocker _( &dataMutex );
finish();
}
sptr< WordSearchRequest > DictServerDictionary::prefixMatch( wstring const & word, unsigned long maxResults )
{
(void)maxResults;
if ( word.size() > 80 ) {

View file

@ -163,17 +163,13 @@ class DslDictionary: public BtreeIndexing::BtreeDictionary
int optionalPartNom;
quint8 articleNom;
int maxPictureWidth;
wstring currentHeadword;
string resourceDir1, resourceDir2;
public:
DslDictionary( string const & id,
string const & indexFile,
vector< string > const & dictionaryFiles,
int maxPictureWidth_ );
DslDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles );
void deferredInit() override;
@ -285,18 +281,14 @@ private:
friend class DslFTSResultsRequest;
};
DslDictionary::DslDictionary( string const & id,
string const & indexFile,
vector< string > const & dictionaryFiles,
int maxPictureWidth_ ):
DslDictionary::DslDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles ):
BtreeDictionary( id, dictionaryFiles ),
idx( indexFile, "rb" ),
idxHeader( idx.read< IdxHeader >() ),
dz( 0 ),
deferredInitRunnableStarted( false ),
optionalPartNom( 0 ),
articleNom( 0 ),
maxPictureWidth( maxPictureWidth_ )
articleNom( 0 )
{
ftsIdxName = indexFile + Dictionary::getFtsSuffix();
@ -840,61 +832,10 @@ string DslDictionary::nodeToHtml( ArticleDom::Node const & node )
url.setHost( QString::fromUtf8( getId().c_str() ) );
url.setPath( Utils::Url::ensureLeadingSlash( QString::fromUtf8( filename.c_str() ) ) );
vector< char > imgdata;
bool resize = false;
string maxWidthStyle = " style=\"max-width:100%;\" ";
try {
File::loadFromFile( n, imgdata );
}
catch ( File::exCantOpen & ) {
try {
n = resourceDir2 + filename;
File::loadFromFile( n, imgdata );
}
catch ( File::exCantOpen & ) {
try {
n = getContainingFolder().toStdString() + Utils::Fs::separator() + filename;
File::loadFromFile( n, imgdata );
}
catch ( File::exCantOpen & ) {
// Try reading from zip file
if ( resourceZip.isOpen() ) {
QMutexLocker _( &resourceZipMutex );
resourceZip.loadFile( Utf8::decode( filename ), imgdata );
}
}
}
}
catch ( ... ) {
}
if ( !imgdata.empty() ) {
if ( Filetype::isNameOfSvg( filename ) ) {
// We don't need to render svg file now
QSvgRenderer svg;
svg.load( QByteArray::fromRawData( imgdata.data(), imgdata.size() ) );
if ( svg.isValid() ) {
QSize imgsize = svg.defaultSize();
resize = maxPictureWidth > 0 && imgsize.width() > maxPictureWidth;
}
}
else {
QImage img = QImage::fromData( (unsigned char *)&imgdata.front(), imgdata.size() );
resize = maxPictureWidth > 0 && img.width() > maxPictureWidth;
}
}
if ( resize ) {
string link( url.toEncoded().data() );
link.replace( 0, 4, "gdpicture" );
result += string( "<a href=\"" ) + link + "\">" + "<img src=\"" + url.toEncoded().data() + "\" alt=\""
+ Html::escape( filename ) + "\"" + "width=\"" + QString::number( maxPictureWidth ).toStdString() + "\"/>"
+ "</a>";
}
else
result += string( "<img src=\"" ) + url.toEncoded().data() + "\" alt=\"" + Html::escape( filename ) + "\"/>";
result += string( "<img src=\"" ) + url.toEncoded().data() + "\" " + maxWidthStyle + " alt=\""
+ Html::escape( filename ) + "\"/>";
}
else if ( Filetype::isNameOfVideo( filename ) ) {
QUrl url;
@ -1126,14 +1067,15 @@ QString DslDictionary::getMainFilename()
void DslDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration )
{
if ( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName )
|| FtsHelpers::ftsIndexIsOldOrBad( this ) ) )
|| FtsHelpers::ftsIndexIsOldOrBad( this ) ) ) {
FTS_index_completed.ref();
}
if ( haveFTSIndex() )
return;
if ( ensureInitDone().size() )
if ( !ensureInitDone().empty() )
return;
if ( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch )
@ -1209,10 +1151,11 @@ void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword,
size_t begin = pos;
pos = articleData.find_first_of( U"\n\r", begin );
if ( pos == wstring::npos )
pos = articleData.size();
if ( articleHeadword.empty() ) {
// Process the headword
articleHeadword = wstring( articleData, begin, pos - begin );
if ( insidedCard && !articleHeadword.empty() && isDslWs( articleHeadword[ 0 ] ) ) {
@ -1254,12 +1197,12 @@ void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword,
if ( articleData[ pos ] == '\r' )
++pos;
if ( pos != articleData.size() ) {
if ( pos < articleData.size() ) {
if ( articleData[ pos ] == '\n' )
++pos;
}
if ( pos == articleData.size() ) {
if ( pos >= articleData.size() ) {
// Ok, it's end of article
break;
}
@ -1704,7 +1647,6 @@ sptr< Dictionary::DataRequest > DslDictionary::getSearchResults( QString const &
vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames,
string const & indicesDir,
Dictionary::Initializing & initializing,
int maxPictureWidth,
unsigned int maxHeadwordSize )
{
@ -2164,7 +2106,7 @@ vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & f
} // if need to rebuild
dictionaries.push_back( std::make_shared< DslDictionary >( dictId, indexFile, dictFiles, maxPictureWidth ) );
dictionaries.push_back( std::make_shared< DslDictionary >( dictId, indexFile, dictFiles ) );
}
catch ( std::exception & e ) {
gdWarning( "DSL dictionary reading failed: %s:%u, error: %s\n", fileName.c_str(), atLine, e.what() );

View file

@ -15,7 +15,6 @@ using std::string;
vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames,
string const & indicesDir,
Dictionary::Initializing &,
int maxPictureWidth,
unsigned int maxHeadwordSize );
} // namespace Dsl

View file

@ -899,7 +899,7 @@ EB_Error_Code EpwingBook::forwardText( EB_Position & startPos )
ret = eb_forward_text( &book, &appendix );
while ( ret != EB_SUCCESS ) {
if ( startPos.page >= book.subbook_current->text.end_page )
if ( ret == EB_ERR_END_OF_CONTENT || startPos.page >= book.subbook_current->text.end_page )
return EB_ERR_END_OF_CONTENT;
const auto offset = startPos.offset + 2;

View file

@ -58,7 +58,6 @@ LoadDictionaries::LoadDictionaries( Config::Class const & cfg ):
hunspell( cfg.hunspell ),
transliteration( cfg.transliteration ),
exceptionText( "Load did not finish" ), // Will be cleared upon success
maxPictureWidth( cfg.maxPictureWidth ),
maxHeadwordSize( cfg.maxHeadwordSize ),
maxHeadwordToExpand( cfg.maxHeadwordsToExpand )
{
@ -167,8 +166,7 @@ void LoadDictionaries::handlePath( Config::Path const & path )
addDicts( Bgl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( Stardict::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordToExpand ) );
addDicts( Lsa::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts(
Dsl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxPictureWidth, maxHeadwordSize ) );
addDicts( Dsl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordSize ) );
addDicts( DictdFiles::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( Xdxf::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( Sdict::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );

View file

@ -23,7 +23,6 @@ class LoadDictionaries: public QThread, public Dictionary::Initializing
Config::Transliteration const & transliteration;
std::vector< sptr< Dictionary::Class > > dictionaries;
std::string exceptionText;
int maxPictureWidth;
unsigned int maxHeadwordSize;
unsigned int maxHeadwordToExpand;

View file

@ -749,18 +749,6 @@ void MddResourceRequest::run()
const QString id = QString::fromUtf8( dict.getId().c_str() );
const QString unique_key = id + QString::fromStdString( u8ResourceName );
if ( GlobalBroadcaster::instance()->cache.contains( unique_key ) ) {
//take first ,then insert again . the object() method may become null anytime.
auto bytes = GlobalBroadcaster::instance()->cache.take( unique_key );
if ( bytes ) {
hasAnyData = true;
data.resize( bytes->size() );
memcpy( &data.front(), bytes->constData(), bytes->size() );
GlobalBroadcaster::instance()->insertCache( unique_key, bytes );
break;
}
}
dict.loadResourceFile( resourceName, data );
@ -789,8 +777,6 @@ void MddResourceRequest::run()
data.resize( bytes.size() );
memcpy( &data.front(), bytes.constData(), bytes.size() );
//cache the processed css result to avoid process again.
GlobalBroadcaster::instance()->insertCache( unique_key, new QByteArray( bytes ) );
}
if ( Filetype::isNameOfTiff( u8ResourceName ) ) {
// Convert it
@ -908,7 +894,7 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
QString linkType = allLinksMatch.captured( 1 ).toLower();
QString newLink;
if ( !linkType.isEmpty() && linkType.at( 0 ) == 'a' ) {
if ( linkType.compare( "a" ) == 0 || linkType.compare( "area" ) == 0 ) {
newLink = linkTxt;
QRegularExpressionMatch match = RX::Mdx::audioRe.match( newLink );
@ -956,12 +942,12 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
else
newLink = linkTxt.replace( RX::Mdx::stylesRe2, R"(\1"bres://)" + id + R"(/\2")" );
}
else if ( linkType.compare( "script" ) == 0 || linkType.compare( "img" ) == 0
|| linkType.compare( "source" ) == 0 ) {
else {
//linkType in ("script","img","source","audio","video")
// javascripts and images
QRegularExpressionMatch match = RX::Mdx::inlineScriptRe.match( linkTxt );
if ( linkType.at( 1 ) == 'c' // "script" tag
&& match.hasMatch() && match.capturedLength() == linkTxt.length() ) {
// "script" tag
if ( linkType.compare( "script" ) == 0 && match.hasMatch() && match.capturedLength() == linkTxt.length() ) {
// skip inline scripts
articleNewText += linkTxt;
match = RX::Mdx::closeScriptTagRe.match( article, linkPos );
@ -972,26 +958,28 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
continue;
}
else {
//audio ,video ,html5 tags fall here.
match = RX::Mdx::srcRe.match( linkTxt );
if ( match.hasMatch() ) {
QString newText;
if ( linkType.at( 1 ) == 'o' ) // "source" tag
{
QString filename = match.captured( 3 );
QString newName = getCachedFileName( filename );
newName.replace( '\\', '/' );
newText = match.captured( 1 ) + match.captured( 2 ) + "file:///" + newName + match.captured( 2 );
QString scheme;
// "source" tag
if ( linkType.compare( "source" ) == 0 ) {
scheme = "gdvideo://";
}
else {
newText = match.captured( 1 ) + match.captured( 2 ) + "bres://" + id + "/" + match.captured( 3 )
+ match.captured( 2 );
scheme = "bres://";
}
newText =
match.captured( 1 ) + match.captured( 2 ) + scheme + id + "/" + match.captured( 3 ) + match.captured( 2 );
newLink = linkTxt.replace( match.capturedStart(), match.capturedLength(), newText );
}
else
newLink = linkTxt.replace( RX::Mdx::srcRe2, R"(\1"bres://)" + id + R"(/\2")" );
}
}
if ( !newLink.isEmpty() ) {
articleNewText += newLink;
}

View file

@ -137,7 +137,10 @@ MediaWikiWordSearchRequest::MediaWikiWordSearchRequest( wstring const & str,
Utils::Url::addQueryItem( reqUrl, "apprefix", QString::fromStdU32String( str ).replace( '+', "%2B" ) );
netReply = std::shared_ptr< QNetworkReply >( mgr.get( QNetworkRequest( reqUrl ) ) );
QNetworkRequest req( reqUrl );
//millseconds.
req.setTransferTimeout( 2000 );
netReply = std::shared_ptr< QNetworkReply >( mgr.get( req ) );
connect( netReply.get(), SIGNAL( finished() ), this, SLOT( downloadFinished() ) );

View file

@ -26,13 +26,15 @@ const static std::string finish_mark = std::string( "dehsinif" );
bool ftsIndexIsOldOrBad( BtreeIndexing::BtreeDictionary * dict )
{
try {
Xapian::WritableDatabase db( dict->ftsIndexName() );
Xapian::WritableDatabase const db( dict->ftsIndexName() );
auto docid = db.get_lastdocid();
auto document = db.get_document( docid );
qDebug() << document.get_data().c_str();
string const lastDoc = document.get_data();
bool const notFinished = lastDoc != finish_mark;
qDebug() << dict->ftsIndexName().c_str() << document.get_data().c_str() << notFinished;
//use a special document to mark the end of the index.
return document.get_data() != finish_mark;
return notFinished;
}
catch ( Xapian::Error & e ) {
qWarning() << e.get_description().c_str();
@ -47,7 +49,7 @@ bool ftsIndexIsOldOrBad( BtreeIndexing::BtreeDictionary * dict )
void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancelled )
{
QMutexLocker _( &dict->getFtsMutex() );
QMutexLocker const _( &dict->getFtsMutex() );
//check the index again.
if ( dict->haveFTSIndex() )
@ -78,7 +80,7 @@ void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancell
QVector< uint32_t > offsets;
offsets.resize( setOfOffsets.size() );
uint32_t * ptr = &offsets.front();
uint32_t * ptr = offsets.data();
for ( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); it != setOfOffsets.constEnd(); ++it ) {
*ptr = *it;

View file

@ -40,7 +40,9 @@ void Indexing::run()
sem.acquire();
QFuture< void > const f = QtConcurrent::run( [ this, &sem, &dictionary ]() {
QSemaphoreReleaser const _( sem );
emit sendNowIndexingName( QString::fromUtf8( dictionary->getName().c_str() ) );
const QString & dictionaryName = QString::fromUtf8( dictionary->getName().c_str() );
qDebug() << "[FULLTEXT] checking fts for the dictionary:" << dictionaryName;
emit sendNowIndexingName( dictionaryName );
dictionary->makeFTSIndex( isCancelled, false );
} );
synchronizer.addFuture( f );
@ -60,18 +62,26 @@ void Indexing::run()
void Indexing::timeout()
{
//display all the dictionary name in the following loop ,may result only one dictionary name been seen.
//as the interval is so small.
QString indexingDicts;
for ( const auto & dictionary : dictionaries ) {
if ( Utils::AtomicInt::loadAcquire( isCancelled ) )
break;
//Finished, clear the msg.
if ( dictionary->haveFTSIndex() ) {
continue;
}
auto newProgress = dictionary->getIndexingFtsProgress();
if ( newProgress > 0 && newProgress < 100 ) {
emit sendNowIndexingName(
if ( !indexingDicts.isEmpty() )
indexingDicts.append( "," );
indexingDicts.append(
QString( "%1......%%2" ).arg( QString::fromStdString( dictionary->getName() ) ).arg( newProgress ) );
}
}
if ( !indexingDicts.isEmpty() ) {
emit sendNowIndexingName( indexingDicts );
}
}
FtsIndexing::FtsIndexing( std::vector< sptr< Dictionary::Class > > const & dicts ):

View file

@ -65,24 +65,19 @@ History::Item History::getItem( int index )
void History::addItem( Item const & item )
{
// qDebug() << "adding item " << item.word << ", enabled=" << enabled();
if ( !enabled() )
return;
if ( (unsigned)item.word.size() > getMaxItemLength() || item.word.isEmpty() ) {
if ( item.word.isEmpty() ) {
// The search looks bogus. Don't save it.
return;
}
//from the normal operation ,there should be only one item in the history at a time.
if ( items.contains( item ) )
items.removeAll( item );
// Special case: if this items differs from the previous one only by group,
// remove it too.
if ( items.size() && items.first().word == item.word )
items.pop_front();
items.removeOne( item );
//TODO : The groupid has not used at all.
items.push_front( item );
ensureSizeConstraints();

View file

@ -311,11 +311,14 @@ int main( int argc, char ** argv )
// GoldenDict use lots of X11 functions and it currently cannot work
// natively on Wayland. This workaround will force GoldenDict to use
// XWayland.
if ( qEnvironmentVariableIsEmpty( "GOLDENDICT_FORCE_WAYLAND" ) ) {
char * xdg_envc = getenv( "XDG_SESSION_TYPE" );
QString xdg_session = xdg_envc ? QString::fromLatin1( xdg_envc ) : QString();
if ( !QString::compare( xdg_session, QString( "wayland" ), Qt::CaseInsensitive ) ) {
setenv( "QT_QPA_PLATFORM", "xcb", 1 );
}
}
#endif
#ifdef Q_OS_MAC
@ -405,12 +408,13 @@ int main( int argc, char ** argv )
#endif
const QStringList localSchemes =
{ "gdlookup", "gdau", "gico", "qrcx", "bres", "bword", "gdprg", "gdvideo", "gdpicture", "gdtts", "ifr", "entry" };
{ "gdlookup", "gdau", "gico", "qrcx", "bres", "bword", "gdprg", "gdvideo", "gdtts", "ifr", "entry" };
for ( const auto & localScheme : localSchemes ) {
QWebEngineUrlScheme webUiScheme( localScheme.toLatin1() );
webUiScheme.setFlags( QWebEngineUrlScheme::SecureScheme | QWebEngineUrlScheme::LocalScheme
| QWebEngineUrlScheme::LocalAccessAllowed | QWebEngineUrlScheme::CorsEnabled );
webUiScheme.setSyntax( QWebEngineUrlScheme::Syntax::Host );
webUiScheme.setFlags( QWebEngineUrlScheme::LocalScheme | QWebEngineUrlScheme::LocalAccessAllowed
| QWebEngineUrlScheme::CorsEnabled );
QWebEngineUrlScheme::registerScheme( webUiScheme );
}
@ -534,7 +538,7 @@ int main( int argc, char ** argv )
auto font = QApplication::font();
if ( !cfg.preferences.interfaceFont.isEmpty() && font.family() != cfg.preferences.interfaceFont ) {
font.setFamily( cfg.preferences.interfaceFont );
app.setFont( font );
QApplication::setFont( font );
}
QLocale locale( localeName );

View file

@ -7,6 +7,9 @@
#if ( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) )
#include <QMediaContent>
#endif
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
#include <QAudioDevice>
#endif
#include "multimediaaudioplayer.hh"
MultimediaAudioPlayer::MultimediaAudioPlayer()
@ -26,6 +29,15 @@ MultimediaAudioPlayer::MultimediaAudioPlayer()
connect( &player, &QMediaPlayer::errorChanged, this, &MultimediaAudioPlayer::onMediaPlayerError );
#endif
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
connect( &mediaDevices, &QMediaDevices::audioOutputsChanged, this, &MultimediaAudioPlayer::audioOutputChange );
#endif
}
void MultimediaAudioPlayer::audioOutputChange()
{
qDebug() << "audio device changed";
}
QString MultimediaAudioPlayer::play( const char * data, int size )
@ -37,11 +49,15 @@ QString MultimediaAudioPlayer::play( const char * data, int size )
return tr( "Couldn't open audio buffer for reading." );
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
player.setSourceDevice( audioBuffer );
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
audioOutput.setDevice( QMediaDevices::defaultAudioOutput() );
player.setAudioOutput( &audioOutput );
#endif
#else
player.setMedia( QMediaContent(), audioBuffer );
#endif
player.play();
return QString();
return {};
}
void MultimediaAudioPlayer::stop()

View file

@ -12,6 +12,9 @@
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
#include <QAudioOutput>
#endif
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) )
#include <QMediaDevices>
#endif
#include <QPointer>
class MultimediaAudioPlayer: public AudioPlayerInterface
@ -26,13 +29,18 @@ public:
private slots:
void onMediaPlayerError();
void audioOutputChange();
private:
QPointer< QBuffer > audioBuffer;
QMediaPlayer player; ///< Depends on audioBuffer.
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) )
QAudioOutput audioOutput;
#endif
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) )
QMediaDevices mediaDevices;
#endif
};
#endif // MAKE_QTMULTIMEDIA_PLAYER

View file

@ -7,26 +7,46 @@ ResourceSchemeHandler::ResourceSchemeHandler( ArticleNetworkAccessManager & arti
}
void ResourceSchemeHandler::requestStarted( QWebEngineUrlRequestJob * requestJob )
{
QUrl url = requestJob->requestUrl();
const QUrl url = requestJob->requestUrl();
QString content_type;
const QMimeType mineType = db.mimeTypeForUrl( url );
const sptr< Dictionary::DataRequest > reply = this->mManager.getResource( url, content_type );
content_type = mineType.name();
if ( reply->isFinished() ) {
replyJob( reply, requestJob, content_type );
}
else
connect( reply.get(), &Dictionary::DataRequest::finished, requestJob, [ = ]() {
replyJob( reply, requestJob, content_type );
} );
}
QNetworkRequest request;
request.setUrl( url );
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
QNetworkReply * reply = this->mManager.getArticleReply( request );
connect( reply, &QNetworkReply::finished, requestJob, [ = ]() {
if ( reply->error() == QNetworkReply::ContentNotFoundError ) {
void ResourceSchemeHandler::replyJob( sptr< Dictionary::DataRequest > reply,
QWebEngineUrlRequestJob * requestJob,
QString content_type )
{
if ( !reply.get() ) {
requestJob->fail( QWebEngineUrlRequestJob::UrlNotFound );
return;
}
if ( reply->error() != QNetworkReply::NoError ) {
qDebug() << "resource handler failed:" << reply->error() << ":" << reply->request().url();
requestJob->fail( QWebEngineUrlRequestJob::RequestFailed );
const auto & data = reply->getFullData();
if ( data.empty() ) {
requestJob->fail( QWebEngineUrlRequestJob::UrlNotFound );
return;
}
QMimeType mineType = db.mimeTypeForUrl( url );
QString contentType = mineType.name();
QByteArray * ba = new QByteArray( data.data(), data.size() );
QBuffer * buffer = new QBuffer( ba );
buffer->open( QBuffer::ReadOnly );
buffer->seek( 0 );
// Reply segment
requestJob->reply( contentType.toLatin1(), reply );
requestJob->reply( content_type.toLatin1(), buffer );
connect( requestJob, &QObject::destroyed, buffer, [ = ]() {
buffer->close();
ba->clear();
delete ba;
buffer->deleteLater();
} );
connect( requestJob, &QObject::destroyed, reply, &QObject::deleteLater );
}

View file

@ -12,6 +12,7 @@ public:
void requestStarted( QWebEngineUrlRequestJob * requestJob );
protected:
void replyJob( sptr< Dictionary::DataRequest > reply, QWebEngineUrlRequestJob * requestJob, QString content_type );
private:
ArticleNetworkAccessManager & mManager;

View file

@ -1068,22 +1068,6 @@ div.xdxf {
}
/* the left column width is specified in class .portlet */
/* Font size:
** We take advantage of keyword scaling- browsers won't go below 9px
** More at http://www.w3.org/2003/07/30-font-size
** http://style.cleverchimp.com/font_size_intervals/altintervals.html
*/
/*
body {
font: x-small sans-serif;
background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
color: black;
margin: 0;
padding: 0;
}
*/
/* scale back up to a sane default */
.mwiki #globalWrapper {
font-size: 127%;
@ -1220,7 +1204,6 @@ body {
list-style-type: square;
margin: 0.3em 0 0 1.5em;
padding: 0;
list-style-image: url(bullet.gif);
}
.mwiki ol {
line-height: 1.5em;
@ -1614,38 +1597,7 @@ in the bottom-right corner of the content area */
** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2
*/
.mwiki #bodyContent a.external,
.mwiki #bodyContent a[href ^="gopher://"]
{
background: url(external.png) center right no-repeat;
padding-right: 1em;
}
.mwiki #bodyContent a[href ^="https://"],
.mwiki .link-https {
background: url(lock_icon.gif) center right no-repeat;
padding-right: 16px;
}
.mwiki #bodyContent a[href^="mailto:"],
.mwiki .link-mailto {
background: url(mail_icon.gif) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a[href ^="news://"]
{
background: url(news_icon.png) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a[href ^="ftp://"],
.mwiki .link-ftp {
background: url(file_icon.gif) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a[href ^="irc://"],
.mwiki #bodyContent a.extiw[href ^="irc://"],
.mwiki .link-irc {
background: url(discussionitem_icon.gif) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a.external[href$=".ogg"],
.mwiki #bodyContent a.external[href$=".OGG"],
.mwiki #bodyContent a.external[href$=".oga"],
@ -1661,7 +1613,7 @@ in the bottom-right corner of the content area */
.mwiki #bodyContent a.external[href$=".wma"],
.mwiki #bodyContent a.external[href$=".WMA"],
.mwiki .link-audio {
background: url("audio.png") center right no-repeat;
background: url("qrc:///icons/audio.png") center right no-repeat;
padding-right: 1em;
}
.mwiki #bodyContent a.external[href$=".ogm"],
@ -1673,7 +1625,7 @@ in the bottom-right corner of the content area */
.mwiki #bodyContent a.external[href$=".mpg"],
.mwiki #bodyContent a.external[href$=".MPG"],
.mwiki .link-video {
background: url("video.png") center right no-repeat;
background: url("qrc:///icons/video.png") center right no-repeat;
padding-right: 1em;
}
.mwiki #bodyContent a.external[href$=".pdf"],
@ -1683,7 +1635,7 @@ in the bottom-right corner of the content area */
.mwiki #bodyContent a.external[href*=".pdf?"],
.mwiki #bodyContent a.external[href*=".PDF?"],
.mwiki .link-document {
background: url("document.png") center right no-repeat;
background: url("qrc:///icons/document.png") center right no-repeat;
padding-right: 12px;
}
@ -1763,7 +1715,6 @@ special external link styling */
.mwiki .portlet ul {
line-height: 1.5em;
list-style-type: square;
list-style-image: url(bullet.gif);
font-size: 95%;
}
.mwiki .portlet li {
@ -1899,7 +1850,6 @@ in bg url to hide it from iemac */
.mwiki li#pt-userpage,
.mwiki li#pt-anonuserpage,
.mwiki li#pt-login {
background: url(user.gif) top left no-repeat;
padding-left: 20px;
text-transform: none;
}
@ -2980,8 +2930,7 @@ table#sv-hooks,
/****** Wiktionary-specific excerpts *********/
.mwiki .audiolink a {
background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/16px-Loudspeaker.svg.png")
center left no-repeat !important;
background: url("qrc:///icons/audio.png") center left no-repeat !important;
padding-left: 20px !important;
padding-right: 0 !important;
}

View file

@ -5,18 +5,20 @@ html {
}
body {
font-family:
-apple-system,
BlinkMacSystemFont,
Tahoma, Verdana, "Lucida Sans Unicode","Palatino Linotype", "Arial Unicode MS",
"Segoe UI",
Roboto,
Oxygen,
Ubuntu,
Cantarell,
"Open Sans",
"Helvetica Neue",
sans-serif;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Apple Color Emoji",
"Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
}
.ipa,
.phon,
.phone,
.pron,
.audio-gb,
.audio-us {
font-family: "Segoe UI", "Lucida Grande", "Lucida Sans", "Droid Sans Mono",
"Droid Sans", "Arial Unicode MS", "Charis SIL", "Open Sans", Roboto,
Helvetica, Arial, normal;
}
h1,
@ -1093,12 +1095,6 @@ div.xdxf {
font-size: smaller;
}
/* feed links */
.mwiki a.feedlink {
background: url("images/feed-icon.png") center left no-repeat;
padding-left: 16px;
}
/************ monobook/main.css **************/
/*
@ -1134,23 +1130,6 @@ div.xdxf {
border-right: none;
line-height: 1.5em;
}
/* the left column width is specified in class .portlet */
/* Font size:
** We take advantage of keyword scaling- browsers won't go below 9px
** More at http://www.w3.org/2003/07/30-font-size
** http://style.cleverchimp.com/font_size_intervals/altintervals.html
*/
/*
body {
font: x-small sans-serif;
background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
color: black;
margin: 0;
padding: 0;
}
*/
/* scale back up to a sane default */
.mwiki #globalWrapper {
@ -1288,7 +1267,6 @@ body {
list-style-type: square;
margin: 0.3em 0 0 1.5em;
padding: 0;
list-style-image: url(bullet.gif);
}
.mwiki ol {
line-height: 1.5em;
@ -1682,38 +1660,7 @@ in the bottom-right corner of the content area */
** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2
*/
.mwiki #bodyContent a.external,
.mwiki #bodyContent a[href ^="gopher://"]
{
background: url(external.png) center right no-repeat;
padding-right: 1em;
}
.mwiki #bodyContent a[href ^="https://"],
.mwiki .link-https {
background: url(lock_icon.gif) center right no-repeat;
padding-right: 16px;
}
.mwiki #bodyContent a[href^="mailto:"],
.mwiki .link-mailto {
background: url(mail_icon.gif) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a[href ^="news://"]
{
background: url(news_icon.png) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a[href ^="ftp://"],
.mwiki .link-ftp {
background: url(file_icon.gif) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a[href ^="irc://"],
.mwiki #bodyContent a.extiw[href ^="irc://"],
.mwiki .link-irc {
background: url(discussionitem_icon.gif) center right no-repeat;
padding-right: 18px;
}
.mwiki #bodyContent a.external[href$=".ogg"],
.mwiki #bodyContent a.external[href$=".OGG"],
.mwiki #bodyContent a.external[href$=".oga"],
@ -1729,7 +1676,7 @@ in the bottom-right corner of the content area */
.mwiki #bodyContent a.external[href$=".wma"],
.mwiki #bodyContent a.external[href$=".WMA"],
.mwiki .link-audio {
background: url("audio.png") center right no-repeat;
background: url("qrc:///icons/audio.png") center right no-repeat;
padding-right: 1em;
}
.mwiki #bodyContent a.external[href$=".ogm"],
@ -1741,7 +1688,7 @@ in the bottom-right corner of the content area */
.mwiki #bodyContent a.external[href$=".mpg"],
.mwiki #bodyContent a.external[href$=".MPG"],
.mwiki .link-video {
background: url("video.png") center right no-repeat;
background: url("qrc:///icons/video.png") center right no-repeat;
padding-right: 1em;
}
.mwiki #bodyContent a.external[href$=".pdf"],
@ -1751,7 +1698,7 @@ in the bottom-right corner of the content area */
.mwiki #bodyContent a.external[href*=".pdf?"],
.mwiki #bodyContent a.external[href*=".PDF?"],
.mwiki .link-document {
background: url("document.png") center right no-repeat;
background: url("qrc:///icons/document.png") center right no-repeat;
padding-right: 12px;
}
@ -1831,7 +1778,6 @@ special external link styling */
.mwiki .portlet ul {
line-height: 1.5em;
list-style-type: square;
list-style-image: url(bullet.gif);
font-size: 95%;
}
.mwiki .portlet li {
@ -1967,7 +1913,6 @@ in bg url to hide it from iemac */
.mwiki li#pt-userpage,
.mwiki li#pt-anonuserpage,
.mwiki li#pt-login {
background: url(user.gif) top left no-repeat;
padding-left: 20px;
text-transform: none;
}
@ -3048,8 +2993,7 @@ table#sv-hooks,
/****** Wiktionary-specific excerpts *********/
.mwiki .audiolink a {
background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/16px-Loudspeaker.svg.png")
center left no-repeat !important;
background: url("qrc:///icons/audio.png") center left no-repeat !important;
padding-left: 20px !important;
padding-right: 0 !important;
}
@ -3073,7 +3017,7 @@ table#sv-hooks,
height: 16px;
vertical-align: text-bottom;
background-size: contain;
content: url("qrc://localhost/icons/arrow.png");
content: url("qrc:///icons/arrow.png");
}
.gdcollapseicon {
@ -3082,7 +3026,7 @@ table#sv-hooks,
height: 16px;
vertical-align: text-bottom;
background-size: contain;
content: url("qrc://localhost/icons/downarrow.png");
content: url("qrc:///icons/downarrow.png");
}
/********** Slob dictionaries ***********/

View file

@ -242,7 +242,9 @@ ArticleView::ArticleView( QWidget * parent,
settings->setAttribute( QWebEngineSettings::PrintElementBackgrounds, false );
#endif
webview->load( QUrl( "gdlookup://localhost?word=(untitled)&blank=1" ) );
auto html = articleNetMgr.getHtml( ResourceType::UNTITLE );
webview->setHtml( QString::fromStdString( html ) );
expandOptionalParts = cfg.preferences.alwaysExpandOptionalParts;
@ -355,16 +357,14 @@ void ArticleView::showDefinition( QString const & word,
if ( mutedDicts.size() )
Utils::Url::addQueryItem( req, "muted", mutedDicts );
// Update headwords history
emit sendWordToHistory( word );
// Any search opened is probably irrelevant now
closeSearch();
load( req );
//QApplication::setOverrideCursor( Qt::WaitCursor );
webview->setCursor( Qt::WaitCursor );
load( req );
// Update headwords history
emit sendWordToHistory( word );
}
void ArticleView::showDefinition( QString const & word,
@ -399,18 +399,17 @@ void ArticleView::showDefinition( QString const & word,
if ( ignoreDiacritics )
Utils::Url::addQueryItem( req, "ignore_diacritics", "1" );
// Update headwords history
emit sendWordToHistory( word );
// Any search opened is probably irrelevant now
closeSearch();
// Clear highlight all button selection
searchPanel->highlightAll->setChecked( false );
webview->setCursor( Qt::WaitCursor );
load( req );
webview->setCursor( Qt::WaitCursor );
// Update headwords history
emit sendWordToHistory( word );
}
void ArticleView::sendToAnki( QString const & word, QString const & dict_definition, QString const & sentence )
@ -734,18 +733,8 @@ bool ArticleView::eventFilter( QObject * obj, QEvent * ev )
}
if ( obj == webview ) {
if ( ev->type() == QEvent::MouseButtonPress ) {
auto event = static_cast< QMouseEvent * >( ev );
if ( event->button() == Qt::XButton1 ) {
back();
return true;
}
if ( event->button() == Qt::XButton2 ) {
forward();
return true;
}
}
else if ( ev->type() == QEvent::KeyPress ) {
if ( ev->type() == QEvent::KeyPress ) {
auto keyEvent = static_cast< QKeyEvent * >( ev );
if ( keyEvent->modifiers() & ( Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier ) )
@ -860,9 +849,6 @@ void ArticleView::linkHovered( const QString & link )
else if ( url.scheme() == "gdtts" ) {
msg = tr( "TTS Voice" );
}
else if ( url.scheme() == "gdpicture" ) {
msg = tr( "Picture" );
}
else if ( url.scheme() == "gdvideo" ) {
if ( url.path().isEmpty() ) {
msg = tr( "Video" );
@ -965,9 +951,7 @@ void ArticleView::openLink( QUrl const & url, QUrl const & ref, QString const &
Contexts contexts( contexts_ );
if ( url.scheme().compare( "gdpicture" ) == 0 )
load( url );
else if ( url.scheme().compare( "ankisearch" ) == 0 ) {
if ( url.scheme().compare( "ankisearch" ) == 0 ) {
ankiConnector->ankiSearch( url.path() );
return;
}
@ -1354,9 +1338,7 @@ void ArticleView::updateMutedContents()
bool ArticleView::canGoBack()
{
// First entry in a history is always an empty page,
// so we skip it.
return webview->history()->currentItemIndex() > 1;
return webview->history()->canGoBack();
}
bool ArticleView::canGoForward()
@ -2107,7 +2089,6 @@ bool ArticleView::closeSearch()
else if ( ftsSearchIsOpened ) {
firstAvailableText.clear();
uniqueMatches.clear();
ftsPosition = 0;
ftsSearchIsOpened = false;
ftsSearchPanel->hide();
@ -2309,6 +2290,12 @@ void ArticleView::on_ftsSearchNext_clicked()
{
performFtsFindOperation( false );
}
void ArticleView::clearContent()
{
auto html = articleNetMgr.getHtml( ResourceType::BLANK );
webview->setHtml( QString::fromStdString( html ) );
}
ResourceToSaveHandler::ResourceToSaveHandler( ArticleView * view, QString fileName ):
QObject( view ),

View file

@ -88,7 +88,6 @@ class ArticleView: public QWidget
QStringList uniqueMatches;
bool ftsSearchIsOpened = false;
bool ftsSearchMatchCase = false;
int ftsPosition = 0;
QString delayedHighlightText;
@ -116,6 +115,7 @@ public:
unsigned getCurrentGroupId();
virtual QSize minimumSizeHint() const;
void clearContent();
~ArticleView();

View file

@ -80,7 +80,8 @@ bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
singleClickAction( pe );
} );
}
mousePressEvent( pe );
if ( pe->buttons() & Qt::MiddleButton )
midButtonPressed = true;
}
if ( ev->type() == QEvent::MouseButtonRelease ) {
auto pe = dynamic_cast< QMouseEvent * >( ev );
@ -102,19 +103,6 @@ bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
return QWebEngineView::eventFilter( obj, ev );
}
void ArticleWebView::mousePressEvent( QMouseEvent * event )
{
if ( event->buttons() & Qt::MiddleButton )
midButtonPressed = true;
if ( event->buttons() & Qt::XButton1 ) {
back();
}
if ( event->buttons() & Qt::XButton2 ) {
forward();
}
}
void ArticleWebView::singleClickAction( QMouseEvent * event )
{
if ( !singleClickToDbClick )
@ -146,14 +134,6 @@ void ArticleWebView::sendCustomMouseEvent( QEvent::Type type )
}
}
void ArticleWebView::mouseReleaseEvent( QMouseEvent * event )
{
bool noMidButton = !( event->buttons() & Qt::MiddleButton );
// if ( midButtonPressed & noMidButton )
// midButtonPressed = false;
}
void ArticleWebView::doubleClickAction( QMouseEvent * event )
{
if ( Qt::MouseEventSynthesizedByApplication != event->source() ) {

View file

@ -55,8 +55,6 @@ protected:
bool event( QEvent * event ) override;
void singleClickAction( QMouseEvent * event );
void sendCustomMouseEvent( QEvent::Type type );
void mousePressEvent( QMouseEvent * event ) override;
void mouseReleaseEvent( QMouseEvent * event ) override;
void doubleClickAction( QMouseEvent * event );
void wheelEvent( QWheelEvent * event ) override;

View file

@ -182,14 +182,15 @@ MainWindow::MainWindow( Config::Class & cfg_ ):
GlobalBroadcaster::instance()->setPreference( &cfg.preferences );
localSchemeHandler = new LocalSchemeHandler( articleNetMgr, this );
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "gdlookup", localSchemeHandler );
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "bword", localSchemeHandler );
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "entry", localSchemeHandler );
QStringList htmlScheme = { "gdlookup", "bword", "entry" };
for ( const auto & localScheme : htmlScheme ) {
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( localScheme.toLatin1(), localSchemeHandler );
}
iframeSchemeHandler = new IframeSchemeHandler( this );
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "ifr", iframeSchemeHandler );
QStringList localSchemes = { "gdau", "gico", "qrcx", "bres", "gdprg", "gdvideo", "gdpicture", "gdtts" };
QStringList localSchemes = { "gdau", "gico", "qrcx", "bres", "gdprg", "gdvideo", "gdtts" };
resourceSchemeHandler = new ResourceSchemeHandler( articleNetMgr, this );
for ( const auto & localScheme : localSchemes ) {
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( localScheme.toLatin1(), resourceSchemeHandler );
@ -1224,8 +1225,9 @@ void MainWindow::commitData()
for ( auto & file : entries ) {
QString const fileName = file.fileName();
if ( dictMap.contains( fileName.toStdString() ) )
continue;
//remove both normal index and fts index.
if ( !dictMap.contains( fileName.toStdString() ) ) {
auto filePath = file.absoluteFilePath();
qDebug() << "remove invalid index files & fts dirs";
@ -1236,7 +1238,6 @@ void MainWindow::commitData()
}
}
}
}
try {
@ -2855,6 +2856,12 @@ void MainWindow::toggleMainWindow( bool onlyShow )
void MainWindow::installHotKeys()
{
#if defined( Q_OS_LINUX )
if ( !qEnvironmentVariableIsEmpty( "GOLDENDICT_FORCE_WAYLAND" ) ) {
return;
}
#endif
hotkeyWrapper.reset(); // Remove the old one
if ( cfg.preferences.enableMainWindowHotkey || cfg.preferences.enableClipboardHotkey ) {
@ -3290,8 +3297,8 @@ void MainWindow::on_saveArticle_triggered()
if ( complete ) {
QString folder = fi.absoluteDir().absolutePath() + "/" + fi.baseName() + "_files";
QRegExp rx1( "\"((?:bres|gico|gdau|qrcx|gdvideo)://[^\"]+)\"" );
QRegExp rx2( "'((?:bres|gico|gdau|qrcx|gdvideo)://[^']+)'" );
QRegExp rx1( "\"((?:bres|gico|gdau|qrcx|qrc|gdvideo)://[^\"]+)\"" );
QRegExp rx2( "'((?:bres|gico|gdau|qrcx|qrc|gdvideo)://[^']+)'" );
set< QByteArray > resourceIncluded;
vector< pair< QUrl, QString > > downloadResources;
@ -3499,9 +3506,12 @@ void MainWindow::applyWordsZoomLevel()
font.setPointSize( ps );
}
if ( translateLine->font().pointSize() != ps )
if ( translateLine->font().pointSize() != ps ) {
translateLine->setFont( font );
translateBox->completerWidget()->setFont( font );
}
font = groupListDefaultFont;
ps = font.pointSize();

View file

@ -354,7 +354,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
//Misc
ui.removeInvalidIndexOnExit->setChecked( p.removeInvalidIndexOnExit );
ui.dictionaryDebug->setChecked( p.dictionaryDebug );
// Add-on styles
ui.addonStylesLabel->setVisible( ui.addonStyles->count() > 1 );
@ -519,7 +518,6 @@ Config::Preferences Preferences::getPreferences()
p.clearNetworkCacheOnExit = ui.clearNetworkCacheOnExit->isChecked();
p.removeInvalidIndexOnExit = ui.removeInvalidIndexOnExit->isChecked();
p.dictionaryDebug = ui.dictionaryDebug->isChecked();
p.addonStyle = ui.addonStyles->getCurrentStyle();

View file

@ -1987,16 +1987,6 @@ from Stardict, Babylon and GLS dictionaries</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="dictionaryDebug">
<property name="toolTip">
<string>When debugging with dictionary css/js, disable certain cache to make it easier.</string>
</property>
<property name="text">
<string>Dictionary debug</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View file

@ -275,9 +275,6 @@ ScanPopup::ScanPopup( QWidget * parent,
void ScanPopup::refresh()
{
// TODO: GroupCombox's update should be moved inside GroupCombox
// currentIndexChanged() signal is very trigger-happy. To avoid triggering
// it, we disconnect it while we're clearing and filling back groups.
disconnect( ui.groupList, &GroupComboBox::currentIndexChanged, this, &ScanPopup::currentGroupChanged );
@ -341,8 +338,9 @@ void ScanPopup::applyWordsZoomLevel()
font.setPointSize( ps );
}
if ( ui.translateBox->completerWidget()->font().pointSize() != ps )
if ( ui.translateBox->completerWidget()->font().pointSize() != ps ) {
ui.translateBox->completerWidget()->setFont( font );
}
font = translateLineDefaultFont;
ps = font.pointSize();
@ -626,13 +624,7 @@ void ScanPopup::updateSuggestionList( QString const & text )
// An empty request always results in an empty result
wordFinder.cancel();
// Reset the noResults mark if it's on right now
if ( ui.translateBox->translateLine()->property( "noResults" ).toBool() ) {
auto translateLine = ui.translateBox->translateLine();
translateLine->setProperty( "noResults", false );
Utils::Widget::setNoResultColor( translateLine, false );
}
return;
}
@ -850,19 +842,10 @@ void ScanPopup::enterEvent( QEvent * event )
}
}
void ScanPopup::requestWindowFocus()
{
// One of the rare, actually working workarounds for requesting a user keyboard focus on X11,
// works for Qt::Popup windows, exactly like our Scan Popup (in unpinned state).
// Modern window managers actively resist to automatically focus pop-up windows.
}
void ScanPopup::showEvent( QShowEvent * ev )
{
QMainWindow::showEvent( ev );
QTimer::singleShot( 100, this, &ScanPopup::requestWindowFocus );
if ( groups.size() <= 1 ) // Only the default group? Hide then.
ui.groupList->hide();
@ -907,6 +890,10 @@ void ScanPopup::prefixMatchFinished()
_results << fst;
}
// Reset the noResults mark if it's on right now
auto translateLine = ui.translateBox->translateLine();
Utils::Widget::setNoResultColor( translateLine, _results.isEmpty() );
ui.translateBox->setModel( _results );
}
}
@ -1016,6 +1003,7 @@ void ScanPopup::hideWindow()
ui.translateBox->setPopupEnabled( false );
ui.translateBox->translateLine()->deselect();
hide();
definition->clearContent();
}
void ScanPopup::interceptMouse()

View file

@ -88,7 +88,6 @@ signals:
#endif
public slots:
void requestWindowFocus();
void inspectElementWhenPinned( QWebEnginePage * page );
/// Translates the word from the clipboard, showing the window etc.

View file

@ -468,7 +468,7 @@ of the appropriate groups to use them.</string>
<item>
<widget class="QLabel" name="label_17">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Prouncations provied by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pronunciations provided by &lt;a href=&quot;https://lingualibre.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Lingua Libre&lt;/span&gt;&lt;/a&gt;, a collaborative linguistic media library of Wikimedia France. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
@ -891,8 +891,8 @@ Not implemented yet in GoldenDict.</string>
<tabstop>paths</tabstop>
</tabstops>
<resources>
<include location="../../resources.qrc"/>
<include location="../../icons/flags.qrc"/>
<include location="../../resources.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -111,7 +111,7 @@ QLineEdit * TranslateBox::translateLine()
QWidget * TranslateBox::completerWidget()
{
return completer->widget();
return completer->popup();
}
void TranslateBox::rightButtonClicked()

Some files were not shown because too many files have changed in this diff Show more