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** **Additional context**
Add any other context about the problem here. 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 - name: install deps on macos
run: | run: |
brew install pcre2 harfbuzz freetype brew install cmake ninja
brew install cmake ninja python
brew install automake brew install automake
brew install autoconf brew install autoconf
brew install libtool brew install libtool
brew install opencc brew install opencc
# brew install speex
# brew tap homebrew-ffmpeg/ffmpeg
# brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
brew install libao brew install libao
brew install libiconv brew install libiconv
brew install lzo bzip2 brew install lzo bzip2
@ -69,8 +65,7 @@ jobs:
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2 wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
tar xvjf 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 .. cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
#brew install qt # or use official offline installer # brew install xz
brew install xz lzo
brew install pkg-config brew install pkg-config
brew install libiconv brew install libiconv
brew install xapian brew install xapian

View file

@ -22,7 +22,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [macos-13] os: [macos-13]
qt_ver: [ 6.5.2 ] qt_ver: [ 6.5.2,6.6.0 ]
qt_arch: [clang_64] qt_arch: [clang_64]
env: env:
targetName: GoldenDict targetName: GoldenDict
@ -42,8 +42,7 @@ jobs:
- name: install deps on macos - name: install deps on macos
run: | run: |
brew install pcre2 harfbuzz freetype brew install cmake ninja
brew install cmake ninja python
brew install automake brew install automake
brew install autoconf brew install autoconf
brew install libtool brew install libtool
@ -51,10 +50,6 @@ jobs:
brew install speex brew install speex
brew install wavpack 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 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 libiconv
brew install lzo bzip2 brew install lzo bzip2
@ -105,7 +100,7 @@ jobs:
- name: compile - name: compile
run: | 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 make -j8
- name: package - name: package
@ -209,8 +204,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run). 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). The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak. Linux users can use Flatpak or build from source.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer. macOS users can use `.dmg` installer.

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3,21 +3,16 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
on: on:
# workflow_run:
# workflows: [AutoTag]
# types: [completed]
workflow_dispatch: workflow_dispatch:
push: # push:
branches: # branches:
- dev # - dev
- master # - master
# - staged # paths-ignore:
paths-ignore: # - 'docs/**'
- 'docs/**' # - "howto/**"
# - ".github/**" # - "*.md"
- "howto/**" # - ".clang-format"
- "*.md"
- ".clang-format"
jobs: jobs:
build: build:
@ -228,8 +223,8 @@ jobs:
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run). 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). The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
Linux users can use AppImages or Flatpak. Linux users can use Flatpak or build from source.
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
macOS users can use `.dmg` installer. 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) [![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) [![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) [![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) [![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, 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> <source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation> <translation type="unfinished">Print version and diagnosis info.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>قم بتمكين Lingua Libre</translation> <translation>قم بتمكين Lingua Libre</translation>
@ -4218,6 +4222,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>قراءة النّصوص</translation> <translation>قراءة النّصوص</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Вывад версіі і звестак дыягностыкі.</translation> <translation>Вывад версіі і звестак дыягностыкі.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3986,10 +3994,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Уключыць Lingua Libre</translation> <translation>Уключыць Lingua Libre</translation>
@ -4202,6 +4206,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Сінтэз маўлення</translation> <translation>Сінтэз маўлення</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Печатна версия и информация за диагностика.</translation> <translation>Печатна версия и информация за диагностика.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Лингва Либре</translation> <translation>Лингва Либре</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Активирайте Lingua Libre</translation> <translation>Активирайте Lingua Libre</translation>
@ -4223,6 +4227,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Синтез говор</translation> <translation>Синтез говор</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3763,6 +3763,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3982,10 +3990,6 @@ GoldenDict 尚不支持此方案。</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation> Lingua Libre</translation> <translation> Lingua Libre</translation>
@ -4197,6 +4201,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ ze Stardict, Babylon a GLS slovníků</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Tisk verze a diagnostické informace.</translation> <translation>Tisk verze a diagnostické informace.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ V GoldenDictu ještě není implementován.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Povolit Lingua Libre</translation> <translation>Povolit Lingua Libre</translation>
@ -4217,6 +4221,10 @@ na spodek vhodných skupin.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Zvuková syntéza</translation> <translation>Zvuková syntéza</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Version und Diagnoseinformationen drucken.</translation> <translation>Version und Diagnoseinformationen drucken.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4001,10 +4009,6 @@ Standardisiert als ISO 3602.
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre aktivieren</translation> <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> <source>Text to Speech</source>
<translation>Sprachausgabe</translation> <translation>Sprachausgabe</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3772,6 +3772,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Version und Diagnoseinformationen drucken.</translation> <translation>Version und Diagnoseinformationen drucken.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3992,10 +4000,6 @@ Noch nicht in GoldenDict implementiert.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre aktivieren</translation> <translation>Lingua Libre aktivieren</translation>
@ -4213,6 +4217,10 @@ der passende Gruppe ein, um sie zu benutzen.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Sprachausgabe</translation> <translation>Sprachausgabe</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3782,6 +3782,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Εκτυπωμένη έκδοση και πληροφορίες διάγνωσης.</translation> <translation>Εκτυπωμένη έκδοση και πληροφορίες διάγνωσης.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4001,10 +4009,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Ενεργοποίηση Lingua Libre</translation> <translation>Ενεργοποίηση Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Εκφώνηση κειμένου</translation> <translation>Εκφώνηση κειμένου</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ el Stardict, Babylon kaj GLS-vortaroj</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Presa versio kaj diagnozaj informoj.</translation> <translation>Presa versio kaj diagnozaj informoj.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Ankoraŭ ne efektivigita en GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingvo Libre</translation> <translation>Lingvo Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Ebligu Lingvon Libren</translation> <translation>Ebligu Lingvon Libren</translation>
@ -4220,6 +4224,10 @@ de la taŭgaj grupoj por uzi ilin.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Parolsintezo</translation> <translation>Parolsintezo</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation> <translation type="unfinished">Print version and diagnosis info.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Todavía no está implementado en GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation type="unfinished">Lingua Libre</translation> <translation type="unfinished">Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation> <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> <source>Text to Speech</source>
<translation>Texto a Voz</translation> <translation>Texto a Voz</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3775,6 +3775,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation> <translation type="unfinished">Print version and diagnosis info.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3994,10 +4002,6 @@ Todavía no implementado en GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation type="unfinished">Lingua Libre</translation> <translation type="unfinished">Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation> <translation type="unfinished">Enable Lingua Libre</translation>
@ -4214,6 +4218,10 @@ fondos de grupos apropriados para utilizarlos.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation type="unfinished">Text to Speech</translation> <translation type="unfinished">Text to Speech</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ de diccionarios Stardict, Babylon y GLS</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Versión impresa e información de diagnóstico.</translation> <translation>Versión impresa e información de diagnóstico.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Todavía no implementado en GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Habilitar Lingua Libre</translation> <translation>Habilitar Lingua Libre</translation>
@ -4217,6 +4221,10 @@ de los grupos apropiados para utilizarlos.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Síntesis de voz</translation> <translation>Síntesis de voz</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>نسخه چاپی و اطلاعات تشخیص</translation> <translation>نسخه چاپی و اطلاعات تشخیص</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre را فعال کنید</translation> <translation>Lingua Libre را فعال کنید</translation>
@ -4217,6 +4221,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>متن به گفتار</translation> <translation>متن به گفتار</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ alkaen alkaen alkupisteestä, Babylonista ja GLS-sanakirjoista</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Tulostusversio ja diagnoositiedot.</translation> <translation>Tulostusversio ja diagnoositiedot.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Ei vielä käytössä GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Ota Lingua Libre Käyttöön</translation> <translation>Ota Lingua Libre Käyttöön</translation>
@ -4220,6 +4224,10 @@ niiden käyttämiseksi.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Tekstistä puheeksi</translation> <translation>Tekstistä puheeksi</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3776,6 +3776,14 @@ des dictionnaires Stardict, Babylon et GLS</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Version imprimée et informations de diagnostic.</translation> <translation>Version imprimée et informations de diagnostic.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3996,10 +4004,6 @@ Pas encore implémenté dans GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Activer Lingua Libre</translation> <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> <source>Text to Speech</source>
<translation>Synthèse vocale TTS</translation> <translation>Synthèse vocale TTS</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3764,6 +3764,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>ि ि </translation> <translation>ि ि </translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3984,10 +3992,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>ि ि</translation> <translation>ि ि</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>ि ि </translation> <translation>ि ि </translation>
@ -4197,6 +4201,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation> ि </translation> <translation> ि </translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation> <translation type="unfinished">Print version and diagnosis info.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation> <translation type="unfinished">Enable Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Diction</translation> <translation>Diction</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3778,6 +3778,14 @@ dai dizionari di Stardict, Babylon e GLS</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Stampa la versione e le informazioni sulla diagnosi.</translation> <translation>Stampa la versione e le informazioni sulla diagnosi.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3998,10 +4006,6 @@ Non ancora implementato.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Abilita Lingua Libre</translation> <translation>Abilita Lingua Libre</translation>
@ -4218,6 +4222,10 @@ in fondo al gruppo linguistico appropriato.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Testo a sintesi vocale (Text to Speech)</translation> <translation>Testo a sintesi vocale (Text to Speech)</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3999,10 +4007,6 @@ GoldenDict にはまだ実装されていません。</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation></translation> <translation></translation>
@ -4213,6 +4217,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation type="unfinished">Print version and diagnosis info.</translation> <translation type="unfinished">Print version and diagnosis info.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation type="unfinished">Lingua Libre</translation> <translation type="unfinished">Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation type="unfinished">Enable Lingua Libre</translation> <translation type="unfinished">Enable Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation type="unfinished">Text to Speech</translation> <translation type="unfinished">Text to Speech</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3776,6 +3776,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation> .</translation> <translation> .</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3996,10 +4004,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation> </translation> <translation> </translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation> </translation> <translation> </translation>
@ -4221,6 +4225,10 @@ GBK와 GB18030 → %GDGBK%, Shift-JIS → %GDSHIFTJIS%</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation> </translation> <translation> </translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Spausdinimo versija ir diagnostikos informacija.</translation> <translation>Spausdinimo versija ir diagnostikos informacija.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3997,10 +4005,6 @@ Dar įtraukta į GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Įgalinti Lingua Libre</translation> <translation>Įgalinti Lingua Libre</translation>
@ -4216,6 +4220,10 @@ rašybos spėjimus.
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Balso sintezavimas</translation> <translation>Balso sintezavimas</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3788,6 +3788,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Информации за печатена верзија и дијагноза.</translation> <translation>Информации за печатена верзија и дијагноза.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4008,10 +4016,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Лингва Либре</translation> <translation>Лингва Либре</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Овозможете Lingua Libre</translation> <translation>Овозможете Lingua Libre</translation>
@ -4230,6 +4234,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Текст во говор</translation> <translation>Текст во говор</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3776,6 +3776,14 @@ van Stardict, Babylon en GLS woordenboeken</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Printversie en diagnose-info.</translation> <translation>Printversie en diagnose-info.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3996,10 +4004,6 @@ Nog niet geïmplementeerd in GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre inschakelen</translation> <translation>Lingua Libre inschakelen</translation>
@ -4216,6 +4220,10 @@ groep om ze te gebruiken.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Tekst naar spraak</translation> <translation>Tekst naar spraak</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Wersja do druku i informacje diagnostyczne.</translation> <translation>Wersja do druku i informacje diagnostyczne.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Systemu tego nie zaimplementowano jeszcze w programie GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Włącz Lingua Libre</translation> <translation>Włącz Lingua Libre</translation>
@ -4221,6 +4225,10 @@ właściwej grupy.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Tekst na mowę</translation> <translation>Tekst na mowę</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3785,6 +3785,14 @@ dos dicionários Stardict, Babylon e GLS</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Versão impressa e informações de diagnóstico.</translation> <translation>Versão impressa e informações de diagnóstico.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4005,10 +4013,6 @@ Ainda não implementado no GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Habilitar Lingua Livre</translation> <translation>Habilitar Lingua Livre</translation>
@ -4229,6 +4233,10 @@ dos grupos apropriados para usá-los.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Texto para Fala</translation> <translation>Texto para Fala</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Versão impressa e informações de diagnóstico.</translation> <translation>Versão impressa e informações de diagnóstico.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ não implementado ainda em GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Habilitar Lingua Livre</translation> <translation>Habilitar Lingua Livre</translation>
@ -4220,6 +4224,10 @@ dos grupos apropriados para usá-los.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Texto para fala</translation> <translation>Texto para fala</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Версия для печати и диагностическая информация.</translation> <translation>Версия для печати и диагностическая информация.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4005,10 +4013,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Включить Lingua Libre</translation> <translation>Включить Lingua Libre</translation>
@ -4228,6 +4232,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Синтез речи</translation> <translation>Синтез речи</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3773,6 +3773,14 @@ zo slovníkov Stardict, Babylon a GLS.</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Vytlačiť verziu a diagnostické informácie.</translation> <translation>Vytlačiť verziu a diagnostické informácie.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3993,10 +4001,6 @@ Zatiaľ nie je implementovaný v GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Povoliť Lingua Libre</translation> <translation>Povoliť Lingua Libre</translation>
@ -4211,6 +4215,10 @@ vhodné slovníky dole k vhodným skupinám.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Text na reč</translation> <translation>Text na reč</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3772,6 +3772,14 @@ nga fjalorët Stardict, Babylon dhe GLS</translation>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Versioni i printuar dhe informacioni i diagnozës.</translation> <translation>Versioni i printuar dhe informacioni i diagnozës.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3992,10 +4000,6 @@ Akoma i pafutur në GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Aktivizo Lingua Libre</translation> <translation>Aktivizo Lingua Libre</translation>
@ -4211,6 +4215,10 @@ të caktuara për t&apos;i përdorur.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Tekst tinguj</translation> <translation>Tekst tinguj</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3782,6 +3782,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Верзија за штампање и информације о дијагнози.</translation> <translation>Верзија за штампање и информације о дијагнози.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4002,10 +4010,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Лингуа Либре</translation> <translation>Лингуа Либре</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Омогућите Лингуа Либре</translation> <translation>Омогућите Лингуа Либре</translation>
@ -4224,6 +4228,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Текст у говор</translation> <translation>Текст у говор</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Utskriftsversion och diagnosinformation.</translation> <translation>Utskriftsversion och diagnosinformation.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4002,10 +4010,6 @@ Har ännu inte implementerats i GoldenDict.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Aktivera Lingua Libre</translation> <translation>Aktivera Lingua Libre</translation>
@ -4222,6 +4226,10 @@ använda dem.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Text till tal</translation> <translation>Text till tal</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Версияи чопӣ ва маълумоти ташхис.</translation> <translation>Версияи чопӣ ва маълумоти ташхис.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre-ро фаъол созед</translation> <translation>Lingua Libre-ро фаъол созед</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Матн ба талаффуз</translation> <translation>Матн ба талаффуз</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Wersiýa we diagnoz maglumatlary çap ediň.</translation> <translation>Wersiýa we diagnoz maglumatlary çap ediň.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3999,10 +4007,6 @@ Entek GoldenDict-de edilmedik.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre-i işlediň</translation> <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> <source>Text to Speech</source>
<translation>Teksti gürläp aýtdyrmak</translation> <translation>Teksti gürläp aýtdyrmak</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Sürümü ve teşhis bilgilerini yazdırın.</translation> <translation>Sürümü ve teşhis bilgilerini yazdırın.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3998,10 +4006,6 @@ Henüz GoldenDict uygulanmadı.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Serbest Dil</translation> <translation>Serbest Dil</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre'yi Etkinleştir</translation> <translation>Lingua Libre'yi Etkinleştir</translation>
@ -4216,6 +4220,10 @@ uygun grupların altlarına ekleyin.</translation>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Metinden Sese</translation> <translation>Metinden Sese</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3781,6 +3781,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation>Друкована версія та інформація про діагностику.</translation> <translation>Друкована версія та інформація про діагностику.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -4001,10 +4009,6 @@ Not implemented yet in GoldenDict.</source>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Увімкнути Lingua Libre</translation> <translation>Увімкнути Lingua Libre</translation>
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation>Текст для вимови</translation> <translation>Текст для вимови</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <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> <source>Print version and diagnosis info.</source>
<translation>Phiên bản in thông tin chẩn đoán.</translation> <translation>Phiên bản in thông tin chẩn đoán.</translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3993,10 +4001,6 @@ Chưa được bổ sung trong Từ điển Vàng.</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>ngôn ngữ tự do</translation> <translation>ngôn ngữ tự do</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Kích hoạt Lingua Libre</translation> <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> <source>Text to Speech</source>
<translation>chuyển văn bản thành giọng nói</translation> <translation>chuyển văn bản thành giọng nói</translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -3581,7 +3581,7 @@ from Stardict, Babylon and GLS dictionaries</source>
</message> </message>
<message> <message>
<source>Appearance</source> <source>Appearance</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source> <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> <source>Print version and diagnosis info.</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3982,10 +3990,6 @@ GoldenDict 尚不支持此方案。</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation> Lingua Libre</translation> <translation> Lingua Libre</translation>
@ -4199,6 +4203,10 @@ of the appropriate groups to use them.</source>
<source>Text to Speech</source> <source>Text to Speech</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

@ -465,7 +465,7 @@ between classic and school orthography in cyrillic)</source>
</message> </message>
<message> <message>
<source>Auto group by folder failed.</source> <source>Auto group by folder failed.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>The parent directory of %1 can not be reached.</source> <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>
<message> <message>
<source>Are you sure you want to generate a set of groups based on containing folders?</source> <source>Are you sure you want to generate a set of groups based on containing folders?</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>Make two-side translate group &quot;%1-%2-%1&quot;</source> <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>
<message> <message>
<source>Open index folder</source> <source>Open index folder</source>
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -1064,11 +1064,11 @@ between classic and school orthography in cyrillic)</source>
</message> </message>
<message> <message>
<source>Create folder-based groups.</source> <source>Create folder-based groups.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>Group by Folders</source> <source>Group by Folders</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>Group by Metadata</source> <source>Group by Metadata</source>
@ -3589,7 +3589,7 @@ from Stardict, Babylon and GLS dictionaries</source>
</message> </message>
<message> <message>
<source>Appearance</source> <source>Appearance</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source> <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>
<message> <message>
<source>Save debug messages to gd_log.txt in the config folder.</source> <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>
<message> <message>
<source>Reset window state.</source> <source>Reset window state.</source>
@ -3771,6 +3771,14 @@ from Stardict, Babylon and GLS dictionaries</source>
<source>Print version and diagnosis info.</source> <source>Print version and diagnosis info.</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>QuickFilterLine</name> <name>QuickFilterLine</name>
@ -3991,10 +3999,6 @@ GoldenDict 尚不支援此方案。</translation>
<source>Lingua Libre</source> <source>Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
</message> </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> <message>
<source>Enable Lingua Libre</source> <source>Enable Lingua Libre</source>
<translation>Lingua Libre</translation> <translation>Lingua Libre</translation>
@ -4208,6 +4212,10 @@ Big-5 使用%GDBIG5%Big5-HKSCS 使用 %GDBIG5HKSCS% GBK 和 GB18030 使用
<source>Text to Speech</source> <source>Text to Speech</source>
<translation></translation> <translation></translation>
</message> </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>
<context> <context>
<name>StylesComboBox</name> <name>StylesComboBox</name>

View file

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

View file

@ -156,7 +156,7 @@ body { background: #242525; }
.gdarticle { background: initial;} .gdarticle { background: initial;}
.gdarticlebody img{ .gdarticlebody img{
background: white; background: white !important;
} }
</style> </style>
<script> <script>
@ -246,46 +246,9 @@ std::string ArticleMaker::makeNotFoundBody( QString const & word, QString const
return result; return result;
} }
sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const & word, string ArticleMaker::makeWelcomeHtml() const
unsigned groupId,
QMap< QString, QString > const & contexts,
QSet< QString > const & mutedDicts,
QStringList const & dictIDs,
bool ignoreDiacritics ) const
{ {
if ( !dictIDs.isEmpty() ) { string result = makeHtmlHeader( tr( "Welcome!" ), QString(), cfg.alwaysExpandOptionalParts );
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!" ) ) {
//tooltip //tooltip
result += R"(<script src="qrc:///scripts/popper.min.js"></script>)"; result += R"(<script src="qrc:///scripts/popper.min.js"></script>)";
result += R"(<script src="qrc:///scripts/tippy.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>)" ) </script>)" )
.arg( theme ) .arg( theme )
.toStdString(); .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 { else {
// Not found // Not found
return makeNotFoundTextFor( word, "help" ); 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 // Find the given group
Instances::Group const * activeGroup = 0; Instances::Group const * activeGroup = 0;
for ( unsigned x = 0; x < groups.size(); ++x ) for ( const auto & group : groups )
if ( groups[ x ].id == groupId ) { if ( group.id == groupId ) {
activeGroup = &groups[ x ]; activeGroup = &group;
break; break;
} }
@ -426,19 +430,22 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeNotFoundTextFor( QString const
sptr< Dictionary::DataRequest > ArticleMaker::makeEmptyPage() 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 ); sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
r->appendString( result ); r->appendString( result );
return r; return r;
} }
string ArticleMaker::makeUntitleHtml() const
{
return makeHtmlHeader( tr( "(untitled)" ), QString(), true ) + "</body></html>";
}
sptr< Dictionary::DataRequest > ArticleMaker::makePicturePage( string const & url ) const sptr< Dictionary::DataRequest > ArticleMaker::makePicturePage( string const & url ) const
{ {
string result = makeHtmlHeader( tr( "(picture)" ), QString(), true ) string const result =
+ R"lit(<a href="javascript: if(history.length>2) history.go(-1)">)lit" + R"(<img src=")" + url + R"(" /></a>)" makeHtmlHeader( tr( "(picture)" ), QString(), true ) + R"(<img src=")" + url + R"(" />)" + "</body></html>";
+ "</body></html>";
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true ); sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
@ -461,6 +468,10 @@ bool ArticleMaker::adjustFilePath( QString & fileName )
} }
return false; return false;
} }
string ArticleMaker::makeBlankHtml() const
{
return makeHtmlHeader( "", QString(), true ) + "</body></html>";
}
//////// ArticleRequest //////// ArticleRequest
@ -869,13 +880,12 @@ void ArticleRequest::stemmedSearchFinished()
continueMatching = true; continueMatching = true;
} }
if ( !continueMatching ) if ( !continueMatching ) {
footer += "</body></html>"; footer += "</body></html>";
{
appendString( footer );
} }
appendString( footer );
if ( continueMatching ) if ( continueMatching )
update(); update();
else else
@ -891,8 +901,6 @@ void ArticleRequest::compoundSearchNextStep( bool lastSearchSucceeded )
if ( lastGoodCompoundResult.size() ) // We have something to append if ( lastGoodCompoundResult.size() ) // We have something to append
{ {
// GD_DPRINTF( "Appending\n" );
if ( !firstCompoundWasFound ) { if ( !firstCompoundWasFound ) {
// Append the beginning // Append the beginning
footer += R"(<div class="gdstemmedsuggestion"><span class="gdstemmedsuggestion_head">)" 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 /// This class generates the article's body for the given lookup request
class ArticleMaker: public QObject 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< sptr< Dictionary::Class > > const & dictionaries;
std::vector< Instances::Group > const & groups; 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 /// Add base path to file path if it's relative and file not found
/// Return true if path successfully adjusted /// Return true if path successfully adjusted
static bool adjustFilePath( QString & fileName ); static bool adjustFilePath( QString & fileName );
string makeUntitleHtml() const;
string makeWelcomeHtml() const;
string makeBlankHtml() const;
private: private:
std::string readCssFile( QString const & fileName, std::string type ) const; std::string readCssFile( QString const & fileName, std::string type ) const;

View file

@ -62,45 +62,7 @@ AllowFrameReply::AllowFrameReply( QNetworkReply * _reply ):
void AllowFrameReply::applyMetaData() void AllowFrameReply::applyMetaData()
{ {
// Set raw headers except X-Frame-Options // The webengine does not support to customize the headers right now ,maybe until Qt6.7 there should be some api supports
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();
} }
void AllowFrameReply::setReadBufferSize( qint64 size ) void AllowFrameReply::setReadBufferSize( qint64 size )
@ -135,35 +97,20 @@ void AllowFrameReply::finishedSlot()
QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest const & req ) QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest const & req )
{ {
QUrl url;
auto op = GetOperation;
if ( req.url().scheme() == "qrcx" ) { if ( req.url().scheme() == "qrcx" ) {
// We had to override the local load policy for the qrc URL scheme until QWebSecurityOrigin::addLocalScheme() was // Do not support qrcx which is the custom define protocol.
// introduced in Qt 4.6. Hence we used a custom qrcx URL scheme and redirected it here back to qrc. Qt versions return new BlockedNetworkReply( this );
// 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 );
} }
url = req.url(); auto op = GetOperation;
QUrl url = req.url();
QMimeType mineType = db.mimeTypeForUrl( url ); QMimeType mineType = db.mimeTypeForUrl( url );
QString contentType = mineType.name(); QString contentType = mineType.name();
if ( req.url().scheme() == "gdlookup" ) { if ( req.url().scheme() == "gdlookup" ) {
QString path = url.path(); QString path = url.path();
if ( !path.isEmpty() ) { if ( path.size() > 1 ) {
url.setPath( "" ); url.setPath( "" );
Utils::Url::addQueryItem( url, "word", path.mid( 1 ) ); 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() ) if ( dr.get() )
return new ArticleResourceReply( this, req, dr, contentType ); 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. //if not external url,can be blocked from here. no need to continue execute the following code.
//such as bres://upload.wikimedia.... etc . //such as bres://upload.wikimedia.... etc .
if ( !Utils::isExternalLink( url ) ) { 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 ); return new BlockedNetworkReply( this );
} }
@ -197,7 +144,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
if ( !url.host().endsWith( refererUrl.host() ) if ( !url.host().endsWith( refererUrl.host() )
&& Utils::Url::getHostBaseFromUrl( url ) != Utils::Url::getHostBaseFromUrl( refererUrl ) && Utils::Url::getHostBaseFromUrl( url ) != Utils::Url::getHostBaseFromUrl( refererUrl )
&& !url.scheme().startsWith( "data" ) ) { && !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 ); return new BlockedNetworkReply( this );
} }
@ -206,7 +153,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
if ( req.url().scheme() == "file" ) { if ( req.url().scheme() == "file" ) {
// Check file presence and adjust path if necessary // Check file presence and adjust path if necessary
QString fileName = req.url().toLocalFile(); 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 newUrl( req.url() );
QUrl localUrl = QUrl::fromLocalFile( fileName ); QUrl localUrl = QUrl::fromLocalFile( fileName );
@ -239,6 +186,20 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
return new AllowFrameReply( reply ); 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 ) sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl const & url, QString & contentType )
{ {
qDebug() << "getResource:" << url.toString(); qDebug() << "getResource:" << url.toString();
@ -275,21 +236,8 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
// Unpack contexts // Unpack contexts
QMap< QString, QString > contexts; QString const contextsEncoded = Utils::Url::queryItemValue( url, "contexts" );
QMap< QString, QString > const contexts = Utils::str2map( contextsEncoded );
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;
}
// See for ignore diacritics // 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" ) if ( ( url.scheme() == "bres" || url.scheme() == "gdau" || url.scheme() == "gdvideo" || url.scheme() == "gico" )
&& url.path().size() ) { && 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(); string id = url.host().toStdString();
bool search = ( id == "search" ); bool search = ( id == "search" );
if ( !search ) { if ( !search ) {
for ( unsigned x = 0; x < dictionaries.size(); ++x ) for ( const auto & dictionary : dictionaries )
if ( dictionaries[ x ]->getId() == id ) { if ( dictionary->getId() == id ) {
if ( url.scheme() == "gico" ) { if ( url.scheme() == "gico" ) {
QByteArray bytes; QByteArray bytes;
QBuffer buffer( &bytes ); QBuffer buffer( &bytes );
buffer.open( QIODevice::WriteOnly ); buffer.open( QIODevice::WriteOnly );
dictionaries[ x ]->getIcon().pixmap( 64 ).save( &buffer, "PNG" ); dictionary->getIcon().pixmap( 64 ).save( &buffer, "PNG" );
buffer.close(); buffer.close();
sptr< Dictionary::DataRequestInstant > ico = std::make_shared< Dictionary::DataRequestInstant >( true ); sptr< Dictionary::DataRequestInstant > ico = std::make_shared< Dictionary::DataRequestInstant >( true );
ico->getData().resize( bytes.size() ); ico->getData().resize( bytes.size() );
@ -323,24 +272,17 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
return ico; return ico;
} }
try { 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 ) { catch ( std::exception & e ) {
gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), dictionaries[ x ]->getName().c_str() ); gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), dictionary->getName().c_str() );
return sptr< Dictionary::DataRequest >(); return {};
} }
} }
} }
} }
if ( url.scheme() == "gdpicture" ) { return {};
contentType = "text/html";
QUrl imgUrl( url );
imgUrl.setScheme( "bres" );
return articleMaker.makePicturePage( imgUrl.toEncoded().data() );
}
return sptr< Dictionary::DataRequest >();
} }
ArticleResourceReply::ArticleResourceReply( QObject * parent, ArticleResourceReply::ArticleResourceReply( QObject * parent,
@ -401,16 +343,17 @@ void ArticleResourceReply::reqFinished()
qint64 ArticleResourceReply::bytesAvailable() const qint64 ArticleResourceReply::bytesAvailable() const
{ {
qint64 avail = req->dataSize(); qint64 const avail = req->dataSize();
if ( avail < 0 ) if ( avail < 0 )
return 0; return 0;
if ( !req->isFinished() ) { qint64 const availBytes = avail - alreadyRead + QNetworkReply::bytesAvailable();
return 65536; 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 ) if ( maxSize == 0 )
return 0; return 0;
bool finished = req->isFinished(); bool const finished = req->isFinished();
qint64 avail = req->dataSize(); qint64 const avail = req->dataSize();
if ( avail < 0 ) if ( avail < 0 )
return finished ? -1 : 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 ) if ( !toRead && finished )
return -1; return -1;
GD_DPRINTF( "====reading %d of (%lld) bytes . Finished: %d", (int)toRead, avail, finished ); 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 ) void LocalSchemeHandler::requestStarted( QWebEngineUrlRequestJob * requestJob )
{ {
QUrl url = requestJob->requestUrl(); QUrl const url = requestJob->requestUrl();
QNetworkRequest request; QNetworkRequest request;
request.setUrl( url ); request.setUrl( url );
//all the url reached here must be either gdlookup or bword scheme. //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()) // or the condition can be (!queryWord.first || word.isEmpty())
// ( queryWord.first && word.isEmpty() ) is only part of the above condition. // ( queryWord.first && word.isEmpty() ) is only part of the above condition.
if ( valid && word.isEmpty() ) { if ( schemeValid && word.isEmpty() ) {
// invalid gdlookup url. // invalid gdlookup url.
return; return;
} }

View file

@ -125,6 +125,11 @@ protected:
} }
}; };
enum class ResourceType {
UNTITLE,
WELCOME,
BLANK
};
class ArticleNetworkAccessManager: public QNetworkAccessManager class ArticleNetworkAccessManager: public QNetworkAccessManager
{ {
@ -157,6 +162,7 @@ public:
sptr< Dictionary::DataRequest > getResource( QUrl const & url, QString & contentType ); sptr< Dictionary::DataRequest > getResource( QUrl const & url, QString & contentType );
virtual QNetworkReply * getArticleReply( QNetworkRequest const & req ); virtual QNetworkReply * getArticleReply( QNetworkRequest const & req );
string getHtml( ResourceType resourceType );
}; };
class ArticleResourceReply: public QNetworkReply 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 ) void loadFromFile( std::string const & filename, std::vector< char > & data )
{ {
File::Class f( filename, "rb" ); File::Class f( filename, "rb" );
QByteArray byteArray{ f.readall() }; auto size = f.file().size(); // QFile::size() obtains size via statx on Linux
data.reserve( byteArray.size() ); data.resize( size );
data = std::vector< char >( byteArray.cbegin(), byteArray.cend() ); f.read( data.data(), size );
} }
void Class::open( char const * mode ) 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 ) void Class::read( void * buf, qint64 size )
{ {
qint64 result = f.read( static_cast< char * >( buf ), size ); if ( f.read( static_cast< char * >( buf ), size ) != size ) {
if ( result != size )
throw exReadError(); throw exReadError();
}
} }
size_t Class::readRecords( void * buf, qint64 size, qint64 count ) size_t Class::readRecords( void * buf, qint64 size, qint64 count )

View file

@ -13,7 +13,8 @@
#include <vector> #include <vector>
#include <QMutex> #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` /// 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. /// 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; 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 ) void GlobalBroadcaster::setPreference( Config::Preferences * p )
{ {
preference = p; preference = p;

View file

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

View file

@ -24,7 +24,8 @@ QRegularExpression Ftx::token( R"((".*?")|([\w\W\+\-]+))",
| QRegularExpression::CaseInsensitiveOption ); | QRegularExpression::CaseInsensitiveOption );
//mdx //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::CaseInsensitiveOption );
QRegularExpression Mdx::wordCrossLink( R"(([\s"']href\s*=)\s*(["'])entry://([^>#]*?)((?:#[^>]*?)?)\2)", QRegularExpression Mdx::wordCrossLink( R"(([\s"']href\s*=)\s*(["'])entry://([^>#]*?)((?:#[^>]*?)?)\2)",
QRegularExpression::CaseInsensitiveOption ); QRegularExpression::CaseInsensitiveOption );

View file

@ -7,8 +7,23 @@
#ifdef _MSC_VER #ifdef _MSC_VER
#include <stub_msvc.h> #include <stub_msvc.h>
#endif #endif
#include <QBuffer>
using std::string; using std::string;
namespace Utils { 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 //some str has \0 in the middle of the string. return the string before the \0
std::string c_string( const QString & str ) 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 ) void Utils::Widget::setNoResultColor( QWidget * widget, bool noResult )
{ {
if ( noResult ) { if ( noResult ) {
QPalette pal( widget->palette() ); auto font = widget->font();
// #febb7d font.setItalic( true );
QRgb rgb = 0xfebb7d;
pal.setColor( QPalette::Base, QColor( rgb ) ); widget->setFont( font );
widget->setAutoFillBackground( true );
widget->setPalette( pal );
} }
else { else {
QPalette pal( widget->style()->standardPalette() ); auto font = widget->font();
widget->setAutoFillBackground( true ); font.setItalic( false );
widget->setPalette( pal );
widget->setFont( font );
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -163,17 +163,13 @@ class DslDictionary: public BtreeIndexing::BtreeDictionary
int optionalPartNom; int optionalPartNom;
quint8 articleNom; quint8 articleNom;
int maxPictureWidth;
wstring currentHeadword; wstring currentHeadword;
string resourceDir1, resourceDir2; string resourceDir1, resourceDir2;
public: public:
DslDictionary( string const & id, DslDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles );
string const & indexFile,
vector< string > const & dictionaryFiles,
int maxPictureWidth_ );
void deferredInit() override; void deferredInit() override;
@ -285,18 +281,14 @@ private:
friend class DslFTSResultsRequest; friend class DslFTSResultsRequest;
}; };
DslDictionary::DslDictionary( string const & id, DslDictionary::DslDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles ):
string const & indexFile,
vector< string > const & dictionaryFiles,
int maxPictureWidth_ ):
BtreeDictionary( id, dictionaryFiles ), BtreeDictionary( id, dictionaryFiles ),
idx( indexFile, "rb" ), idx( indexFile, "rb" ),
idxHeader( idx.read< IdxHeader >() ), idxHeader( idx.read< IdxHeader >() ),
dz( 0 ), dz( 0 ),
deferredInitRunnableStarted( false ), deferredInitRunnableStarted( false ),
optionalPartNom( 0 ), optionalPartNom( 0 ),
articleNom( 0 ), articleNom( 0 )
maxPictureWidth( maxPictureWidth_ )
{ {
ftsIdxName = indexFile + Dictionary::getFtsSuffix(); ftsIdxName = indexFile + Dictionary::getFtsSuffix();
@ -840,61 +832,10 @@ string DslDictionary::nodeToHtml( ArticleDom::Node const & node )
url.setHost( QString::fromUtf8( getId().c_str() ) ); url.setHost( QString::fromUtf8( getId().c_str() ) );
url.setPath( Utils::Url::ensureLeadingSlash( QString::fromUtf8( filename.c_str() ) ) ); url.setPath( Utils::Url::ensureLeadingSlash( QString::fromUtf8( filename.c_str() ) ) );
vector< char > imgdata; string maxWidthStyle = " style=\"max-width:100%;\" ";
bool resize = false;
try { result += string( "<img src=\"" ) + url.toEncoded().data() + "\" " + maxWidthStyle + " alt=\""
File::loadFromFile( n, imgdata ); + Html::escape( filename ) + "\"/>";
}
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 ) + "\"/>";
} }
else if ( Filetype::isNameOfVideo( filename ) ) { else if ( Filetype::isNameOfVideo( filename ) ) {
QUrl url; QUrl url;
@ -1126,14 +1067,15 @@ QString DslDictionary::getMainFilename()
void DslDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) void DslDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration )
{ {
if ( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) if ( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName )
|| FtsHelpers::ftsIndexIsOldOrBad( this ) ) ) || FtsHelpers::ftsIndexIsOldOrBad( this ) ) ) {
FTS_index_completed.ref(); FTS_index_completed.ref();
}
if ( haveFTSIndex() ) if ( haveFTSIndex() )
return; return;
if ( ensureInitDone().size() ) if ( !ensureInitDone().empty() )
return; return;
if ( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) if ( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch )
@ -1209,10 +1151,11 @@ void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword,
size_t begin = pos; size_t begin = pos;
pos = articleData.find_first_of( U"\n\r", begin ); pos = articleData.find_first_of( U"\n\r", begin );
if ( pos == wstring::npos )
pos = articleData.size();
if ( articleHeadword.empty() ) { if ( articleHeadword.empty() ) {
// Process the headword // Process the headword
articleHeadword = wstring( articleData, begin, pos - begin ); articleHeadword = wstring( articleData, begin, pos - begin );
if ( insidedCard && !articleHeadword.empty() && isDslWs( articleHeadword[ 0 ] ) ) { if ( insidedCard && !articleHeadword.empty() && isDslWs( articleHeadword[ 0 ] ) ) {
@ -1254,12 +1197,12 @@ void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword,
if ( articleData[ pos ] == '\r' ) if ( articleData[ pos ] == '\r' )
++pos; ++pos;
if ( pos != articleData.size() ) { if ( pos < articleData.size() ) {
if ( articleData[ pos ] == '\n' ) if ( articleData[ pos ] == '\n' )
++pos; ++pos;
} }
if ( pos == articleData.size() ) { if ( pos >= articleData.size() ) {
// Ok, it's end of article // Ok, it's end of article
break; break;
} }
@ -1704,7 +1647,6 @@ sptr< Dictionary::DataRequest > DslDictionary::getSearchResults( QString const &
vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames, vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames,
string const & indicesDir, string const & indicesDir,
Dictionary::Initializing & initializing, Dictionary::Initializing & initializing,
int maxPictureWidth,
unsigned int maxHeadwordSize ) unsigned int maxHeadwordSize )
{ {
@ -2164,7 +2106,7 @@ vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & f
} // if need to rebuild } // 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 ) { catch ( std::exception & e ) {
gdWarning( "DSL dictionary reading failed: %s:%u, error: %s\n", fileName.c_str(), atLine, e.what() ); 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, vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames,
string const & indicesDir, string const & indicesDir,
Dictionary::Initializing &, Dictionary::Initializing &,
int maxPictureWidth,
unsigned int maxHeadwordSize ); unsigned int maxHeadwordSize );
} // namespace Dsl } // namespace Dsl

View file

@ -899,7 +899,7 @@ EB_Error_Code EpwingBook::forwardText( EB_Position & startPos )
ret = eb_forward_text( &book, &appendix ); ret = eb_forward_text( &book, &appendix );
while ( ret != EB_SUCCESS ) { 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; return EB_ERR_END_OF_CONTENT;
const auto offset = startPos.offset + 2; const auto offset = startPos.offset + 2;

View file

@ -58,7 +58,6 @@ LoadDictionaries::LoadDictionaries( Config::Class const & cfg ):
hunspell( cfg.hunspell ), hunspell( cfg.hunspell ),
transliteration( cfg.transliteration ), transliteration( cfg.transliteration ),
exceptionText( "Load did not finish" ), // Will be cleared upon success exceptionText( "Load did not finish" ), // Will be cleared upon success
maxPictureWidth( cfg.maxPictureWidth ),
maxHeadwordSize( cfg.maxHeadwordSize ), maxHeadwordSize( cfg.maxHeadwordSize ),
maxHeadwordToExpand( cfg.maxHeadwordsToExpand ) maxHeadwordToExpand( cfg.maxHeadwordsToExpand )
{ {
@ -167,8 +166,7 @@ void LoadDictionaries::handlePath( Config::Path const & path )
addDicts( Bgl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) ); addDicts( Bgl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( Stardict::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordToExpand ) ); addDicts( Stardict::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordToExpand ) );
addDicts( Lsa::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) ); addDicts( Lsa::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( addDicts( Dsl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordSize ) );
Dsl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxPictureWidth, maxHeadwordSize ) );
addDicts( DictdFiles::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) ); addDicts( DictdFiles::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( Xdxf::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) ); addDicts( Xdxf::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
addDicts( Sdict::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; Config::Transliteration const & transliteration;
std::vector< sptr< Dictionary::Class > > dictionaries; std::vector< sptr< Dictionary::Class > > dictionaries;
std::string exceptionText; std::string exceptionText;
int maxPictureWidth;
unsigned int maxHeadwordSize; unsigned int maxHeadwordSize;
unsigned int maxHeadwordToExpand; unsigned int maxHeadwordToExpand;

View file

@ -749,18 +749,6 @@ void MddResourceRequest::run()
const QString id = QString::fromUtf8( dict.getId().c_str() ); const QString id = QString::fromUtf8( dict.getId().c_str() );
const QString unique_key = id + QString::fromStdString( u8ResourceName ); 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 ); dict.loadResourceFile( resourceName, data );
@ -789,8 +777,6 @@ void MddResourceRequest::run()
data.resize( bytes.size() ); data.resize( bytes.size() );
memcpy( &data.front(), bytes.constData(), 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 ) ) { if ( Filetype::isNameOfTiff( u8ResourceName ) ) {
// Convert it // Convert it
@ -908,7 +894,7 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
QString linkType = allLinksMatch.captured( 1 ).toLower(); QString linkType = allLinksMatch.captured( 1 ).toLower();
QString newLink; QString newLink;
if ( !linkType.isEmpty() && linkType.at( 0 ) == 'a' ) { if ( linkType.compare( "a" ) == 0 || linkType.compare( "area" ) == 0 ) {
newLink = linkTxt; newLink = linkTxt;
QRegularExpressionMatch match = RX::Mdx::audioRe.match( newLink ); QRegularExpressionMatch match = RX::Mdx::audioRe.match( newLink );
@ -956,12 +942,12 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
else else
newLink = linkTxt.replace( RX::Mdx::stylesRe2, R"(\1"bres://)" + id + R"(/\2")" ); newLink = linkTxt.replace( RX::Mdx::stylesRe2, R"(\1"bres://)" + id + R"(/\2")" );
} }
else if ( linkType.compare( "script" ) == 0 || linkType.compare( "img" ) == 0 else {
|| linkType.compare( "source" ) == 0 ) { //linkType in ("script","img","source","audio","video")
// javascripts and images // javascripts and images
QRegularExpressionMatch match = RX::Mdx::inlineScriptRe.match( linkTxt ); QRegularExpressionMatch match = RX::Mdx::inlineScriptRe.match( linkTxt );
if ( linkType.at( 1 ) == 'c' // "script" tag // "script" tag
&& match.hasMatch() && match.capturedLength() == linkTxt.length() ) { if ( linkType.compare( "script" ) == 0 && match.hasMatch() && match.capturedLength() == linkTxt.length() ) {
// skip inline scripts // skip inline scripts
articleNewText += linkTxt; articleNewText += linkTxt;
match = RX::Mdx::closeScriptTagRe.match( article, linkPos ); match = RX::Mdx::closeScriptTagRe.match( article, linkPos );
@ -972,26 +958,28 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
continue; continue;
} }
else { else {
//audio ,video ,html5 tags fall here.
match = RX::Mdx::srcRe.match( linkTxt ); match = RX::Mdx::srcRe.match( linkTxt );
if ( match.hasMatch() ) { if ( match.hasMatch() ) {
QString newText; QString newText;
if ( linkType.at( 1 ) == 'o' ) // "source" tag QString scheme;
{ // "source" tag
QString filename = match.captured( 3 ); if ( linkType.compare( "source" ) == 0 ) {
QString newName = getCachedFileName( filename ); scheme = "gdvideo://";
newName.replace( '\\', '/' );
newText = match.captured( 1 ) + match.captured( 2 ) + "file:///" + newName + match.captured( 2 );
} }
else { else {
newText = match.captured( 1 ) + match.captured( 2 ) + "bres://" + id + "/" + match.captured( 3 ) scheme = "bres://";
+ match.captured( 2 );
} }
newText =
match.captured( 1 ) + match.captured( 2 ) + scheme + id + "/" + match.captured( 3 ) + match.captured( 2 );
newLink = linkTxt.replace( match.capturedStart(), match.capturedLength(), newText ); newLink = linkTxt.replace( match.capturedStart(), match.capturedLength(), newText );
} }
else else
newLink = linkTxt.replace( RX::Mdx::srcRe2, R"(\1"bres://)" + id + R"(/\2")" ); newLink = linkTxt.replace( RX::Mdx::srcRe2, R"(\1"bres://)" + id + R"(/\2")" );
} }
} }
if ( !newLink.isEmpty() ) { if ( !newLink.isEmpty() ) {
articleNewText += newLink; articleNewText += newLink;
} }

View file

@ -137,7 +137,10 @@ MediaWikiWordSearchRequest::MediaWikiWordSearchRequest( wstring const & str,
Utils::Url::addQueryItem( reqUrl, "apprefix", QString::fromStdU32String( str ).replace( '+', "%2B" ) ); 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() ) ); 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 ) bool ftsIndexIsOldOrBad( BtreeIndexing::BtreeDictionary * dict )
{ {
try { try {
Xapian::WritableDatabase db( dict->ftsIndexName() ); Xapian::WritableDatabase const db( dict->ftsIndexName() );
auto docid = db.get_lastdocid(); auto docid = db.get_lastdocid();
auto document = db.get_document( docid ); 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. //use a special document to mark the end of the index.
return document.get_data() != finish_mark; return notFinished;
} }
catch ( Xapian::Error & e ) { catch ( Xapian::Error & e ) {
qWarning() << e.get_description().c_str(); qWarning() << e.get_description().c_str();
@ -47,7 +49,7 @@ bool ftsIndexIsOldOrBad( BtreeIndexing::BtreeDictionary * dict )
void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancelled ) void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancelled )
{ {
QMutexLocker _( &dict->getFtsMutex() ); QMutexLocker const _( &dict->getFtsMutex() );
//check the index again. //check the index again.
if ( dict->haveFTSIndex() ) if ( dict->haveFTSIndex() )
@ -78,7 +80,7 @@ void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancell
QVector< uint32_t > offsets; QVector< uint32_t > offsets;
offsets.resize( setOfOffsets.size() ); 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 ) { for ( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); it != setOfOffsets.constEnd(); ++it ) {
*ptr = *it; *ptr = *it;

View file

@ -40,7 +40,9 @@ void Indexing::run()
sem.acquire(); sem.acquire();
QFuture< void > const f = QtConcurrent::run( [ this, &sem, &dictionary ]() { QFuture< void > const f = QtConcurrent::run( [ this, &sem, &dictionary ]() {
QSemaphoreReleaser const _( sem ); 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 ); dictionary->makeFTSIndex( isCancelled, false );
} ); } );
synchronizer.addFuture( f ); synchronizer.addFuture( f );
@ -60,18 +62,26 @@ void Indexing::run()
void Indexing::timeout() void Indexing::timeout()
{ {
//display all the dictionary name in the following loop ,may result only one dictionary name been seen. QString indexingDicts;
//as the interval is so small.
for ( const auto & dictionary : dictionaries ) { for ( const auto & dictionary : dictionaries ) {
if ( Utils::AtomicInt::loadAcquire( isCancelled ) ) if ( Utils::AtomicInt::loadAcquire( isCancelled ) )
break; break;
//Finished, clear the msg.
if ( dictionary->haveFTSIndex() ) {
continue;
}
auto newProgress = dictionary->getIndexingFtsProgress(); auto newProgress = dictionary->getIndexingFtsProgress();
if ( newProgress > 0 && newProgress < 100 ) { if ( newProgress > 0 && newProgress < 100 ) {
emit sendNowIndexingName( if ( !indexingDicts.isEmpty() )
indexingDicts.append( "," );
indexingDicts.append(
QString( "%1......%%2" ).arg( QString::fromStdString( dictionary->getName() ) ).arg( newProgress ) ); 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 ): 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 ) void History::addItem( Item const & item )
{ {
// qDebug() << "adding item " << item.word << ", enabled=" << enabled();
if ( !enabled() ) if ( !enabled() )
return; return;
if ( (unsigned)item.word.size() > getMaxItemLength() || item.word.isEmpty() ) { if ( item.word.isEmpty() ) {
// The search looks bogus. Don't save it. // The search looks bogus. Don't save it.
return; return;
} }
//from the normal operation ,there should be only one item in the history at a time.
if ( items.contains( item ) ) if ( items.contains( item ) )
items.removeAll( item ); items.removeOne( 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();
//TODO : The groupid has not used at all.
items.push_front( item ); items.push_front( item );
ensureSizeConstraints(); ensureSizeConstraints();

View file

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

View file

@ -7,6 +7,9 @@
#if ( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) ) #if ( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) )
#include <QMediaContent> #include <QMediaContent>
#endif #endif
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
#include <QAudioDevice>
#endif
#include "multimediaaudioplayer.hh" #include "multimediaaudioplayer.hh"
MultimediaAudioPlayer::MultimediaAudioPlayer() MultimediaAudioPlayer::MultimediaAudioPlayer()
@ -26,6 +29,15 @@ MultimediaAudioPlayer::MultimediaAudioPlayer()
connect( &player, &QMediaPlayer::errorChanged, this, &MultimediaAudioPlayer::onMediaPlayerError ); connect( &player, &QMediaPlayer::errorChanged, this, &MultimediaAudioPlayer::onMediaPlayerError );
#endif #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 ) 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." ); return tr( "Couldn't open audio buffer for reading." );
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) ) #if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
player.setSourceDevice( audioBuffer ); player.setSourceDevice( audioBuffer );
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
audioOutput.setDevice( QMediaDevices::defaultAudioOutput() );
player.setAudioOutput( &audioOutput );
#endif
#else #else
player.setMedia( QMediaContent(), audioBuffer ); player.setMedia( QMediaContent(), audioBuffer );
#endif #endif
player.play(); player.play();
return QString(); return {};
} }
void MultimediaAudioPlayer::stop() void MultimediaAudioPlayer::stop()

View file

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

View file

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

View file

@ -1068,22 +1068,6 @@ div.xdxf {
} }
/* the left column width is specified in class .portlet */ /* 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 */ /* scale back up to a sane default */
.mwiki #globalWrapper { .mwiki #globalWrapper {
font-size: 127%; font-size: 127%;
@ -1220,7 +1204,6 @@ body {
list-style-type: square; list-style-type: square;
margin: 0.3em 0 0 1.5em; margin: 0.3em 0 0 1.5em;
padding: 0; padding: 0;
list-style-image: url(bullet.gif);
} }
.mwiki ol { .mwiki ol {
line-height: 1.5em; 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 ** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2 ** 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$=".OGG"], .mwiki #bodyContent a.external[href$=".OGG"],
.mwiki #bodyContent a.external[href$=".oga"], .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 #bodyContent a.external[href$=".WMA"], .mwiki #bodyContent a.external[href$=".WMA"],
.mwiki .link-audio { .mwiki .link-audio {
background: url("audio.png") center right no-repeat; background: url("qrc:///icons/audio.png") center right no-repeat;
padding-right: 1em; padding-right: 1em;
} }
.mwiki #bodyContent a.external[href$=".ogm"], .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 #bodyContent a.external[href$=".MPG"], .mwiki #bodyContent a.external[href$=".MPG"],
.mwiki .link-video { .mwiki .link-video {
background: url("video.png") center right no-repeat; background: url("qrc:///icons/video.png") center right no-repeat;
padding-right: 1em; padding-right: 1em;
} }
.mwiki #bodyContent a.external[href$=".pdf"], .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 #bodyContent a.external[href*=".PDF?"], .mwiki #bodyContent a.external[href*=".PDF?"],
.mwiki .link-document { .mwiki .link-document {
background: url("document.png") center right no-repeat; background: url("qrc:///icons/document.png") center right no-repeat;
padding-right: 12px; padding-right: 12px;
} }
@ -1763,7 +1715,6 @@ special external link styling */
.mwiki .portlet ul { .mwiki .portlet ul {
line-height: 1.5em; line-height: 1.5em;
list-style-type: square; list-style-type: square;
list-style-image: url(bullet.gif);
font-size: 95%; font-size: 95%;
} }
.mwiki .portlet li { .mwiki .portlet li {
@ -1899,7 +1850,6 @@ in bg url to hide it from iemac */
.mwiki li#pt-userpage, .mwiki li#pt-userpage,
.mwiki li#pt-anonuserpage, .mwiki li#pt-anonuserpage,
.mwiki li#pt-login { .mwiki li#pt-login {
background: url(user.gif) top left no-repeat;
padding-left: 20px; padding-left: 20px;
text-transform: none; text-transform: none;
} }
@ -2980,8 +2930,7 @@ table#sv-hooks,
/****** Wiktionary-specific excerpts *********/ /****** Wiktionary-specific excerpts *********/
.mwiki .audiolink a { .mwiki .audiolink a {
background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/16px-Loudspeaker.svg.png") background: url("qrc:///icons/audio.png") center left no-repeat !important;
center left no-repeat !important;
padding-left: 20px !important; padding-left: 20px !important;
padding-right: 0 !important; padding-right: 0 !important;
} }

View file

@ -5,18 +5,20 @@ html {
} }
body { body {
font-family: font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
-apple-system, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Apple Color Emoji",
BlinkMacSystemFont, "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
Tahoma, Verdana, "Lucida Sans Unicode","Palatino Linotype", "Arial Unicode MS", }
"Segoe UI",
Roboto, .ipa,
Oxygen, .phon,
Ubuntu, .phone,
Cantarell, .pron,
"Open Sans", .audio-gb,
"Helvetica Neue", .audio-us {
sans-serif; 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, h1,
@ -1093,12 +1095,6 @@ div.xdxf {
font-size: smaller; font-size: smaller;
} }
/* feed links */
.mwiki a.feedlink {
background: url("images/feed-icon.png") center left no-repeat;
padding-left: 16px;
}
/************ monobook/main.css **************/ /************ monobook/main.css **************/
/* /*
@ -1134,23 +1130,6 @@ div.xdxf {
border-right: none; border-right: none;
line-height: 1.5em; 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 */ /* scale back up to a sane default */
.mwiki #globalWrapper { .mwiki #globalWrapper {
@ -1288,7 +1267,6 @@ body {
list-style-type: square; list-style-type: square;
margin: 0.3em 0 0 1.5em; margin: 0.3em 0 0 1.5em;
padding: 0; padding: 0;
list-style-image: url(bullet.gif);
} }
.mwiki ol { .mwiki ol {
line-height: 1.5em; 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 ** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2 ** 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$=".OGG"], .mwiki #bodyContent a.external[href$=".OGG"],
.mwiki #bodyContent a.external[href$=".oga"], .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 #bodyContent a.external[href$=".WMA"], .mwiki #bodyContent a.external[href$=".WMA"],
.mwiki .link-audio { .mwiki .link-audio {
background: url("audio.png") center right no-repeat; background: url("qrc:///icons/audio.png") center right no-repeat;
padding-right: 1em; padding-right: 1em;
} }
.mwiki #bodyContent a.external[href$=".ogm"], .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 #bodyContent a.external[href$=".MPG"], .mwiki #bodyContent a.external[href$=".MPG"],
.mwiki .link-video { .mwiki .link-video {
background: url("video.png") center right no-repeat; background: url("qrc:///icons/video.png") center right no-repeat;
padding-right: 1em; padding-right: 1em;
} }
.mwiki #bodyContent a.external[href$=".pdf"], .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 #bodyContent a.external[href*=".PDF?"], .mwiki #bodyContent a.external[href*=".PDF?"],
.mwiki .link-document { .mwiki .link-document {
background: url("document.png") center right no-repeat; background: url("qrc:///icons/document.png") center right no-repeat;
padding-right: 12px; padding-right: 12px;
} }
@ -1831,7 +1778,6 @@ special external link styling */
.mwiki .portlet ul { .mwiki .portlet ul {
line-height: 1.5em; line-height: 1.5em;
list-style-type: square; list-style-type: square;
list-style-image: url(bullet.gif);
font-size: 95%; font-size: 95%;
} }
.mwiki .portlet li { .mwiki .portlet li {
@ -1967,7 +1913,6 @@ in bg url to hide it from iemac */
.mwiki li#pt-userpage, .mwiki li#pt-userpage,
.mwiki li#pt-anonuserpage, .mwiki li#pt-anonuserpage,
.mwiki li#pt-login { .mwiki li#pt-login {
background: url(user.gif) top left no-repeat;
padding-left: 20px; padding-left: 20px;
text-transform: none; text-transform: none;
} }
@ -3048,8 +2993,7 @@ table#sv-hooks,
/****** Wiktionary-specific excerpts *********/ /****** Wiktionary-specific excerpts *********/
.mwiki .audiolink a { .mwiki .audiolink a {
background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/16px-Loudspeaker.svg.png") background: url("qrc:///icons/audio.png") center left no-repeat !important;
center left no-repeat !important;
padding-left: 20px !important; padding-left: 20px !important;
padding-right: 0 !important; padding-right: 0 !important;
} }
@ -3073,7 +3017,7 @@ table#sv-hooks,
height: 16px; height: 16px;
vertical-align: text-bottom; vertical-align: text-bottom;
background-size: contain; background-size: contain;
content: url("qrc://localhost/icons/arrow.png"); content: url("qrc:///icons/arrow.png");
} }
.gdcollapseicon { .gdcollapseicon {
@ -3082,7 +3026,7 @@ table#sv-hooks,
height: 16px; height: 16px;
vertical-align: text-bottom; vertical-align: text-bottom;
background-size: contain; background-size: contain;
content: url("qrc://localhost/icons/downarrow.png"); content: url("qrc:///icons/downarrow.png");
} }
/********** Slob dictionaries ***********/ /********** Slob dictionaries ***********/

View file

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

View file

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

View file

@ -80,7 +80,8 @@ bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
singleClickAction( pe ); singleClickAction( pe );
} ); } );
} }
mousePressEvent( pe ); if ( pe->buttons() & Qt::MiddleButton )
midButtonPressed = true;
} }
if ( ev->type() == QEvent::MouseButtonRelease ) { if ( ev->type() == QEvent::MouseButtonRelease ) {
auto pe = dynamic_cast< QMouseEvent * >( ev ); auto pe = dynamic_cast< QMouseEvent * >( ev );
@ -102,19 +103,6 @@ bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
return QWebEngineView::eventFilter( obj, 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 ) void ArticleWebView::singleClickAction( QMouseEvent * event )
{ {
if ( !singleClickToDbClick ) 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 ) void ArticleWebView::doubleClickAction( QMouseEvent * event )
{ {
if ( Qt::MouseEventSynthesizedByApplication != event->source() ) { if ( Qt::MouseEventSynthesizedByApplication != event->source() ) {

View file

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

View file

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

View file

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

View file

@ -1987,16 +1987,6 @@ from Stardict, Babylon and GLS dictionaries</string>
</property> </property>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
</item> </item>

View file

@ -275,9 +275,6 @@ ScanPopup::ScanPopup( QWidget * parent,
void ScanPopup::refresh() void ScanPopup::refresh()
{ {
// TODO: GroupCombox's update should be moved inside GroupCombox
// currentIndexChanged() signal is very trigger-happy. To avoid triggering // currentIndexChanged() signal is very trigger-happy. To avoid triggering
// it, we disconnect it while we're clearing and filling back groups. // it, we disconnect it while we're clearing and filling back groups.
disconnect( ui.groupList, &GroupComboBox::currentIndexChanged, this, &ScanPopup::currentGroupChanged ); disconnect( ui.groupList, &GroupComboBox::currentIndexChanged, this, &ScanPopup::currentGroupChanged );
@ -341,8 +338,9 @@ void ScanPopup::applyWordsZoomLevel()
font.setPointSize( ps ); font.setPointSize( ps );
} }
if ( ui.translateBox->completerWidget()->font().pointSize() != ps ) if ( ui.translateBox->completerWidget()->font().pointSize() != ps ) {
ui.translateBox->completerWidget()->setFont( font ); ui.translateBox->completerWidget()->setFont( font );
}
font = translateLineDefaultFont; font = translateLineDefaultFont;
ps = font.pointSize(); ps = font.pointSize();
@ -626,13 +624,7 @@ void ScanPopup::updateSuggestionList( QString const & text )
// An empty request always results in an empty result // An empty request always results in an empty result
wordFinder.cancel(); 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; 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 ) void ScanPopup::showEvent( QShowEvent * ev )
{ {
QMainWindow::showEvent( ev ); QMainWindow::showEvent( ev );
QTimer::singleShot( 100, this, &ScanPopup::requestWindowFocus );
if ( groups.size() <= 1 ) // Only the default group? Hide then. if ( groups.size() <= 1 ) // Only the default group? Hide then.
ui.groupList->hide(); ui.groupList->hide();
@ -907,6 +890,10 @@ void ScanPopup::prefixMatchFinished()
_results << fst; _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 ); ui.translateBox->setModel( _results );
} }
} }
@ -1016,6 +1003,7 @@ void ScanPopup::hideWindow()
ui.translateBox->setPopupEnabled( false ); ui.translateBox->setPopupEnabled( false );
ui.translateBox->translateLine()->deselect(); ui.translateBox->translateLine()->deselect();
hide(); hide();
definition->clearContent();
} }
void ScanPopup::interceptMouse() void ScanPopup::interceptMouse()

View file

@ -88,7 +88,6 @@ signals:
#endif #endif
public slots: public slots:
void requestWindowFocus();
void inspectElementWhenPinned( QWebEnginePage * page ); void inspectElementWhenPinned( QWebEnginePage * page );
/// Translates the word from the clipboard, showing the window etc. /// 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> <item>
<widget class="QLabel" name="label_17"> <widget class="QLabel" name="label_17">
<property name="text"> <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>
<property name="openExternalLinks"> <property name="openExternalLinks">
<bool>true</bool> <bool>true</bool>
@ -891,8 +891,8 @@ Not implemented yet in GoldenDict.</string>
<tabstop>paths</tabstop> <tabstop>paths</tabstop>
</tabstops> </tabstops>
<resources> <resources>
<include location="../../resources.qrc"/>
<include location="../../icons/flags.qrc"/> <include location="../../icons/flags.qrc"/>
<include location="../../resources.qrc"/>
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View file

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

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