mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-12-04 16:14:05 +00:00
fix: merge conflict
This commit is contained in:
commit
b4c87bbdb1
15
.github/ISSUE_TEMPLATE/bug_report.md
vendored
15
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -39,15 +39,10 @@ Copy & paste `help` -> `about` -> `Copy version info` to here
|
|||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
Windows:
|
||||
Platform | Context
|
||||
---------|----------
|
||||
Windows |Upload the dmp file in the crash folder located in the configuration folder (can be opened through the menu help->configuration folder) to here
|
||||
Macos | upload the crashpad crash log
|
||||
Linux | gdb backtrace info
|
||||
|
||||
Upload the dmp file in the crash folder located in the configuration folder (can be opened through the menu help->configuration folder) to here
|
||||
|
||||
Macos:
|
||||
|
||||
upload the crashpad crash log
|
||||
|
||||
Linux:
|
||||
|
||||
gdb backtrace info.
|
||||
|
||||
|
|
14
.github/ISSUE_TEMPLATE/bug_report_cn.md
vendored
14
.github/ISSUE_TEMPLATE/bug_report_cn.md
vendored
|
@ -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 堆栈信息
|
|
@ -49,16 +49,12 @@ jobs:
|
|||
|
||||
- name: install deps on macos
|
||||
run: |
|
||||
brew install pcre2 harfbuzz freetype
|
||||
brew install cmake ninja python
|
||||
brew install cmake ninja
|
||||
brew install automake
|
||||
brew install autoconf
|
||||
brew install libtool
|
||||
brew install opencc
|
||||
|
||||
# brew install speex
|
||||
# brew tap homebrew-ffmpeg/ffmpeg
|
||||
# brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
|
||||
brew install libao
|
||||
brew install libiconv
|
||||
brew install lzo bzip2
|
||||
|
@ -69,8 +65,7 @@ jobs:
|
|||
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
|
||||
tar xvjf eb-4.4.3.tar.bz2
|
||||
cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
|
||||
#brew install qt # or use official offline installer
|
||||
brew install xz lzo
|
||||
# brew install xz
|
||||
brew install pkg-config
|
||||
brew install libiconv
|
||||
brew install xapian
|
||||
|
|
15
.github/workflows/macos-homebrew-breakpad.yml
vendored
15
.github/workflows/macos-homebrew-breakpad.yml
vendored
|
@ -22,7 +22,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [macos-13]
|
||||
qt_ver: [ 6.5.2 ]
|
||||
qt_ver: [ 6.5.2,6.6.0 ]
|
||||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
|
@ -42,8 +42,7 @@ jobs:
|
|||
|
||||
- name: install deps on macos
|
||||
run: |
|
||||
brew install pcre2 harfbuzz freetype
|
||||
brew install cmake ninja python
|
||||
brew install cmake ninja
|
||||
brew install automake
|
||||
brew install autoconf
|
||||
brew install libtool
|
||||
|
@ -51,10 +50,6 @@ jobs:
|
|||
brew install speex
|
||||
brew install wavpack
|
||||
brew install automake fdk-aac git lame libass libtool libvorbis libvpx opus sdl shtool texi2html theora wget x264 x265 xvid nasm
|
||||
brew install speex
|
||||
|
||||
brew tap homebrew-ffmpeg/ffmpeg
|
||||
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
|
||||
|
||||
brew install libiconv
|
||||
brew install lzo bzip2
|
||||
|
@ -105,7 +100,7 @@ jobs:
|
|||
|
||||
- name: compile
|
||||
run: |
|
||||
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian CONFIG+=use_breakpad
|
||||
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian CONFIG+=use_breakpad CONFIG+=no_ffmpeg_player CONFIG+=no_tts_support
|
||||
make -j8
|
||||
|
||||
- name: package
|
||||
|
@ -209,8 +204,8 @@ jobs:
|
|||
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
|
||||
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
|
||||
|
||||
Linux users can use AppImages or Flatpak.
|
||||
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
|
||||
Linux users can use Flatpak or build from source.
|
||||
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
|
||||
|
||||
macOS users can use `.dmg` installer.
|
||||
|
||||
|
|
22
.github/workflows/macos-homebrew.yml
vendored
22
.github/workflows/macos-homebrew.yml
vendored
|
@ -22,7 +22,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [macos-12,macos-13]
|
||||
qt_ver: [ 6.5.2 ]
|
||||
qt_ver: [ 6.5.2,6.6.0 ]
|
||||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
|
@ -42,20 +42,12 @@ jobs:
|
|||
|
||||
- name: install deps on macos
|
||||
run: |
|
||||
brew install pcre2 harfbuzz freetype
|
||||
brew install cmake ninja python
|
||||
brew install cmake ninja
|
||||
brew install automake
|
||||
brew install autoconf
|
||||
brew install libtool
|
||||
brew install opencc
|
||||
# brew install speex
|
||||
brew install wavpack
|
||||
brew install automake git lame libass libtool shtool texi2html theora wget xvid nasm
|
||||
# brew install automake fdk-aac git lame libass libtool libvorbis libvpx opus sdl shtool texi2html theora wget x264 x265 xvid nasm
|
||||
|
||||
# brew tap homebrew-ffmpeg/ffmpeg
|
||||
# brew options homebrew-ffmpeg/ffmpeg/ffmpeg
|
||||
# brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
|
||||
|
||||
brew install libiconv
|
||||
brew install lzo bzip2
|
||||
|
@ -65,7 +57,7 @@ jobs:
|
|||
brew install hunspell
|
||||
git clone https://github.com/xiaoyifang/eb.git
|
||||
cd eb && ./configure && make -j 8 && sudo make install && cd ..
|
||||
brew install xz lzo
|
||||
# brew install xz
|
||||
brew install pkg-config
|
||||
brew install create-dmg
|
||||
brew install xapian
|
||||
|
@ -77,8 +69,8 @@ jobs:
|
|||
cmake -B build -DCMAKE_BUILD_TYPE=release
|
||||
cmake --build build --config release
|
||||
sudo make install
|
||||
find /usr/local -name libzstd.1.dylib
|
||||
find /usr/local -name liblzma.5.dylib
|
||||
# find /usr/local -name libzstd.1.dylib
|
||||
# find /usr/local -name liblzma.5.dylib
|
||||
- name: version-file
|
||||
shell: bash
|
||||
env:
|
||||
|
@ -217,8 +209,8 @@ jobs:
|
|||
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
|
||||
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
|
||||
|
||||
Linux users can use AppImages or Flatpak.
|
||||
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
|
||||
Linux users can use Flatpak or build from source.
|
||||
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
|
||||
|
||||
macOS users can use `.dmg` installer.
|
||||
|
||||
|
|
29
.github/workflows/ubuntu-6.2.yml
vendored
29
.github/workflows/ubuntu-6.2.yml
vendored
|
@ -3,21 +3,16 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
on:
|
||||
# workflow_run:
|
||||
# workflows: [AutoTag]
|
||||
# types: [completed]
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
- master
|
||||
# - staged
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
# - ".github/**"
|
||||
- "howto/**"
|
||||
- "*.md"
|
||||
- ".clang-format"
|
||||
# push:
|
||||
# branches:
|
||||
# - dev
|
||||
# - master
|
||||
# paths-ignore:
|
||||
# - 'docs/**'
|
||||
# - "howto/**"
|
||||
# - "*.md"
|
||||
# - ".clang-format"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -26,7 +21,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-20.04]
|
||||
qt_ver: [ 6.5.2 ]
|
||||
qt_ver: [ 6.5.2,6.6.0 ]
|
||||
qt_arch: [gcc_64]
|
||||
env:
|
||||
version: 23.09.29
|
||||
|
@ -191,8 +186,8 @@ jobs:
|
|||
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
|
||||
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
|
||||
|
||||
Linux users can use AppImages or Flatpak.
|
||||
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
|
||||
Linux users can use Flatpak or build from source.
|
||||
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
|
||||
|
||||
macOS users can use `.dmg` installer.
|
||||
|
||||
|
|
2
.github/workflows/ubuntu-PR-check.yml
vendored
2
.github/workflows/ubuntu-PR-check.yml
vendored
|
@ -26,7 +26,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
qt_ver: [5.15.2,6.5.2]
|
||||
qt_ver: [5.15.2,6.6.0]
|
||||
qt_arch: [gcc_64]
|
||||
|
||||
steps:
|
||||
|
|
27
.github/workflows/ubuntu.yml
vendored
27
.github/workflows/ubuntu.yml
vendored
|
@ -4,21 +4,16 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
on:
|
||||
# workflow_run:
|
||||
# workflows: [AutoTag]
|
||||
# types: [completed]
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
- master
|
||||
# - staged
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
# - ".github/**"
|
||||
- "howto/**"
|
||||
- "*.md"
|
||||
- ".clang-format"
|
||||
# push:
|
||||
# branches:
|
||||
# - dev
|
||||
# - master
|
||||
# paths-ignore:
|
||||
# - 'docs/**'
|
||||
# - "howto/**"
|
||||
# - "*.md"
|
||||
# - ".clang-format"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -178,8 +173,8 @@ jobs:
|
|||
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
|
||||
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
|
||||
|
||||
Linux users can use AppImages or Flatpak.
|
||||
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
|
||||
Linux users can use Flatpak or build from source.
|
||||
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
|
||||
|
||||
macOS users can use `.dmg` installer.
|
||||
|
||||
|
|
6
.github/workflows/windows-6.x.yml
vendored
6
.github/workflows/windows-6.x.yml
vendored
|
@ -27,7 +27,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [windows-2019]
|
||||
qt_ver: [6.5.2]
|
||||
qt_ver: [6.5.2,6.6.0 ]
|
||||
qt_arch: [win64_msvc2019_64]
|
||||
env:
|
||||
targetName: GoldenDict.exe
|
||||
|
@ -254,8 +254,8 @@ jobs:
|
|||
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
|
||||
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
|
||||
|
||||
Linux users can use AppImages or Flatpak.
|
||||
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
|
||||
Linux users can use Flatpak or build from source.
|
||||
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
|
||||
|
||||
macOS users can use `.dmg` installer.
|
||||
|
||||
|
|
2
.github/workflows/windows-PR-check.yml
vendored
2
.github/workflows/windows-PR-check.yml
vendored
|
@ -27,7 +27,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [windows-2019]
|
||||
qt_ver: [5.15.2,6.5.2]
|
||||
qt_ver: [5.15.2,6.6.0]
|
||||
qt_arch: [win64_msvc2019_64]
|
||||
steps:
|
||||
- uses: actions/setup-python@v3
|
||||
|
|
27
.github/workflows/windows.yml
vendored
27
.github/workflows/windows.yml
vendored
|
@ -3,21 +3,16 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
on:
|
||||
# workflow_run:
|
||||
# workflows: [AutoTag]
|
||||
# types: [completed]
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
- master
|
||||
# - staged
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
# - ".github/**"
|
||||
- "howto/**"
|
||||
- "*.md"
|
||||
- ".clang-format"
|
||||
# push:
|
||||
# branches:
|
||||
# - dev
|
||||
# - master
|
||||
# paths-ignore:
|
||||
# - 'docs/**'
|
||||
# - "howto/**"
|
||||
# - "*.md"
|
||||
# - ".clang-format"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -228,8 +223,8 @@ jobs:
|
|||
Windows users can use either `****-installer.exe` (for installer) or `****.zip` (unzip and run).
|
||||
The `goldendict.exe` can be dropped into previous installation's folder (if dependencies aren't changed).
|
||||
|
||||
Linux users can use AppImages or Flatpak.
|
||||
https://flathub.org/zh-Hans/apps/io.github.xiaoyifang.goldendict_ng
|
||||
Linux users can use Flatpak or build from source.
|
||||
https://flathub.org/apps/io.github.xiaoyifang.goldendict_ng
|
||||
|
||||
macOS users can use `.dmg` installer.
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
[![Crowdin](https://badges.crowdin.net/goldendict-ng/localized.svg)](https://crowdin.com/project/goldendict-ng)
|
||||
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=xiaoyifang_goldendict&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=xiaoyifang_goldendict)
|
||||
[![Windows-6.x](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/windows-6.x.yml/badge.svg)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/windows-6.x.yml)
|
||||
[![Ubuntu-6.2](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml/badge.svg?branch=staged)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml)
|
||||
[![Ubuntu-6.2](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml/badge.svg?event=push)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/ubuntu-6.2.yml)
|
||||
[![macos-homebrew](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/macos-homebrew.yml/badge.svg)](https://github.com/xiaoyifang/goldendict-ng/actions/workflows/macos-homebrew.yml)
|
||||
|
||||
The Next Generation GoldenDict. A feature-rich open-source dictionary lookup program,
|
||||
|
|
BIN
icons/audio.png
Normal file
BIN
icons/audio.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 441 B |
BIN
icons/document.png
Normal file
BIN
icons/document.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 567 B |
|
@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation type="unfinished">Print version and diagnosis info.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3997,10 +4005,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>التصريحات التي أدلى بها <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>، مكتبة وسائط لغوية تعاونية في ويكيميديا فرنسا. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>قم بتمكين Lingua Libre</translation>
|
||||
|
@ -4218,6 +4222,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>قراءة النّصوص</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
586
locale/ay_BO.ts
586
locale/ay_BO.ts
File diff suppressed because it is too large
Load diff
|
@ -3767,6 +3767,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Вывад версіі і звестак дыягностыкі.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Прымусіць слова быць перакладзены ў scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Прымусова перакласці слова ў галоўным акне</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3986,10 +3994,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Вымаўленне пададзена <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, - сумесная лінгвістычная бібліятэка Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Уключыць Lingua Libre</translation>
|
||||
|
@ -4202,6 +4206,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Сінтэз маўлення</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Вымаўленне прадстаўлена <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, сумеснай лінгвістычнай медыятэкай Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Печатна версия и информация за диагностика.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Принудете думата да бъде преведена в scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Принудете думата да бъде преведена в главния прозорец</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Лингва Либре</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Произношенията са предоставени от <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, съвместна лингвистична медийна библиотека на Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Активирайте Lingua Libre</translation>
|
||||
|
@ -4223,6 +4227,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Синтез говор</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Произношенията са предоставени от <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, съвместна лингвистична медийна библиотека на Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3763,6 +3763,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3982,10 +3990,6 @@ GoldenDict 尚不支持此方案。</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>由 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>法国维基百科合作语言媒体图书馆 </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>启用 Lingua Libre</translation>
|
||||
|
@ -4197,6 +4201,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>语音合成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3777,6 +3777,14 @@ ze Stardict, Babylon a GLS slovníků</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Tisk verze a diagnostické informace.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Vynutit překlad slova v scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Vynutit překlad slova v hlavním okně</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3997,10 +4005,6 @@ V GoldenDictu ještě není implementován.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prokázané <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, kooperativní jazyková mediální knihovna Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Povolit Lingua Libre</translation>
|
||||
|
@ -4217,6 +4221,10 @@ na spodek vhodných skupin.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Zvuková syntéza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Výslovnosti poskytuje <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, kolaborativní lingvistická mediální knihovna Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3781,6 +3781,14 @@ Stardict, Babylon und GLS Wörterbüchern wünschen.</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Version und Diagnoseinformationen drucken.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Erzwinge das Wort im ScanPopUp zu übersetzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Erzwinge das Wort im Hauptfenster zu übersetzen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4001,10 +4009,6 @@ Standardisiert als ISO 3602.
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations bereitgestellt von <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, einer gemeinschaftlichen linguistischen Medienbibliothek von Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre aktivieren</translation>
|
||||
|
@ -4219,6 +4223,10 @@ Fügen Sie entsprechende Wörterbücher am besten am Ende der passenden Gruppe e
|
|||
<source>Text to Speech</source>
|
||||
<translation>Sprachausgabe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Aussprachen bereitgestellt von <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, einer kollaborativen linguistischen Medienbibliothek von Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3772,6 +3772,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Version und Diagnoseinformationen drucken.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Erzwingen Sie die Übersetzung des Wortes in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Erzwingen Sie die Übersetzung des Wortes im Hauptfenster</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3992,10 +4000,6 @@ Noch nicht in GoldenDict implementiert.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations bereitgestellt von <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, einer gemeinschaftlichen linguistischen Medienbibliothek von Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre aktivieren</translation>
|
||||
|
@ -4213,6 +4217,10 @@ der passende Gruppe ein, um sie zu benutzen.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Sprachausgabe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Aussprachen bereitgestellt von <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, einer kollaborativen linguistischen Medienbibliothek von Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3782,6 +3782,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Εκτυπωμένη έκδοση και πληροφορίες διάγνωσης.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Αναγκάστε να μεταφραστεί η λέξη στο scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Αναγκάστε να μεταφραστεί η λέξη στο κύριο παράθυρο</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4001,10 +4009,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Προτάσεις που προωθούνται από <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, μια συνεργατική βιβλιοθήκη γλωσσικών μέσων της Wikimedia Γαλλίας. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Ενεργοποίηση Lingua Libre</translation>
|
||||
|
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Εκφώνηση κειμένου</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Οι προφορές παρέχονται από το <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, μια συνεργατική βιβλιοθήκη γλωσσικών μέσων του Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3780,6 +3780,14 @@ el Stardict, Babylon kaj GLS-vortaroj</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Presa versio kaj diagnozaj informoj.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Devigu la vorton esti tradukita en scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Devigu la vorton esti tradukita en la ĉeffenestro</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Ankoraŭ ne efektivigita en GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingvo Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations provid by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, kunlabora lingva amaskomunikilaro de Vikimedia Francio. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Ebligu Lingvon Libren</translation>
|
||||
|
@ -4220,6 +4224,10 @@ de la taŭgaj grupoj por uzi ilin.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Parolsintezo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prononcoj provizitaj de <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, kunlabora lingva amaskomunikilaro de Vikimedia Francio. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation type="unfinished">Print version and diagnosis info.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Todavía no está implementado en GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation type="unfinished">Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prounciones promocionadas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, una biblioteca colaborativa de medios de comunicación lingüísticos de Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation type="unfinished">Enable Lingua Libre</translation>
|
||||
|
@ -4219,6 +4223,10 @@ respectivamente, %GDBIG5% para Big-5, %GDBIG5HKSCS% para Big5-HKSCS, %GDGBK% par
|
|||
<source>Text to Speech</source>
|
||||
<translation>Texto a Voz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3775,6 +3775,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation type="unfinished">Print version and diagnosis info.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3994,10 +4002,6 @@ Todavía no implementado en GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation type="unfinished">Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prounciones promocionadas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, una biblioteca colaborativa de medios de comunicación lingüísticos de Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation type="unfinished">Enable Lingua Libre</translation>
|
||||
|
@ -4214,6 +4218,10 @@ fondos de grupos apropriados para utilizarlos.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation type="unfinished">Text to Speech</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3777,6 +3777,14 @@ de diccionarios Stardict, Babylon y GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Versión impresa e información de diagnóstico.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Forzar la traducción de la palabra en scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Forzar la traducción de la palabra en la ventana principal.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3997,10 +4005,6 @@ Todavía no implementado en GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prounciones promocionadas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, una biblioteca colaborativa de medios de comunicación lingüísticos de Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Habilitar Lingua Libre</translation>
|
||||
|
@ -4217,6 +4221,10 @@ de los grupos apropiados para utilizarlos.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Síntesis de voz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Pronunciaciones proporcionadas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, una biblioteca colaborativa de medios lingüísticos de Wikimedia Francia. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>نسخه چاپی و اطلاعات تشخیص</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>ترجمه اجباری کلمه در scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>مجبور کنید کلمه را در پنجره اصلی ترجمه کنید</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3997,10 +4005,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>تلفظ های ارائه شده توسط <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>، یک کتابخانه رسانه زبانی مشترک ویکی مدیا فرانسه. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre را فعال کنید</translation>
|
||||
|
@ -4217,6 +4221,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>متن به گفتار</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>تلفظ ها توسط <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>ارائه شده است، یک کتابخانه رسانه زبانی مشترک ویکی مدیا فرانسه. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3780,6 +3780,14 @@ alkaen alkaen alkupisteestä, Babylonista ja GLS-sanakirjoista</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Tulostusversio ja diagnoositiedot.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Pakota sana käännettäväksi scanpopupissa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Pakota sana käännettäväksi pääikkunassa</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Ei vielä käytössä GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p> <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, Wikimedia Francen kielikirjasto. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Ota Lingua Libre Käyttöön</translation>
|
||||
|
@ -4220,6 +4224,10 @@ niiden käyttämiseksi.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Tekstistä puheeksi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Ääntämiset tarjoaa <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, Wikimedia Francen yhteistoiminnallinen kielellinen mediakirjasto. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3776,6 +3776,14 @@ des dictionnaires Stardict, Babylon et GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Version imprimée et informations de diagnostic.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Forcer la traduction du mot dans scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Forcer la traduction du mot dans la fenêtre principale</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3996,10 +4004,6 @@ Pas encore implémenté dans GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations fournies par <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, une bibliothèque multimédia linguistique collaborative de Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Activer Lingua Libre</translation>
|
||||
|
@ -4214,6 +4218,10 @@ Ajoutez les dictionnaires appropriés à la fin des groupes concernés pour les
|
|||
<source>Text to Speech</source>
|
||||
<translation>Synthèse vocale TTS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prononciations fournies par <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, médiathèque linguistique collaborative de Wikimédia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3764,6 +3764,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>प्रिंट संस्करण और निदान जानकारी।</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>शब्द को स्कैनपॉपअप में अनुवादित करने के लिए बाध्य करें</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>शब्द को मुख्य विंडो में अनुवादित करने के लिए बाध्य करें</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3984,10 +3992,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>लिंगुआ लिब्रे</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>उच्चारण <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">लिंगुआ लिबरे</span></a>द्वारा प्रमाणित, विकिमीडिया फ़्रांस की एक सहयोगी भाषाई मीडिया लाइब्रेरी। </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>लिंगुआ लिब्रे सक्षम करें</translation>
|
||||
|
@ -4197,6 +4201,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>वाक् संश्लेषण के लिए पाठ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>उच्चारण <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">लिंगुआ लिबरे</span></a>द्वारा प्रदान किया गया है, जो विकिमीडिया फ़्रांस की एक सहयोगी भाषाई मीडिया लाइब्रेरी है। </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation type="unfinished">Print version and diagnosis info.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation type="unfinished">Enable Lingua Libre</translation>
|
||||
|
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Diction</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3778,6 +3778,14 @@ dai dizionari di Stardict, Babylon e GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Stampa la versione e le informazioni sulla diagnosi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Forza la traduzione della parola in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Forza la traduzione della parola nella finestra principale</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3998,10 +4006,6 @@ Non ancora implementato.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations fornite da <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, una biblioteca di media linguistici collaborativi di Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Abilita Lingua Libre</translation>
|
||||
|
@ -4218,6 +4222,10 @@ in fondo al gruppo linguistico appropriato.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Testo a sintesi vocale (Text to Speech)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Pronunce fornite da <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, una libreria multimediale linguistica collaborativa di Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3779,6 +3779,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>バージョンと診断情報を印刷します。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>scanpopup で単語を強制的に翻訳する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>メインウィンドウで単語を強制的に翻訳する</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3999,10 +4007,6 @@ GoldenDict にはまだ実装されていません。</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p> <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">フランスのウィキメディアメディアライブラリであるリンガ・リブレ</span></a>によって証明された主張。 </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>リンガ・リブレを有効にする</translation>
|
||||
|
@ -4213,6 +4217,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>テキスト読み上げ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>発音は、ウィキメディア フランスの共同言語メディア ライブラリである <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>によって提供されています。 </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation type="unfinished">Print version and diagnosis info.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation type="unfinished">Force the word to be translated in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation type="unfinished">Force the word to be translated in the mainwindow</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation type="unfinished">Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation type="unfinished">Enable Lingua Libre</translation>
|
||||
|
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation type="unfinished">Text to Speech</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3776,6 +3776,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>버전 및 진단 정보를 인쇄합니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>스캔팝업에서 단어를 강제로 번역</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>메인 창에서 단어가 강제로 번역되도록 합니다.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3996,10 +4004,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>링구아 리브레</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>발음은 Wikimedia France의 공동 언어 미디어 라이브러리인 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>에서 제공합니다. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>링구아 리브레 활성화</translation>
|
||||
|
@ -4221,6 +4225,10 @@ GBK와 GB18030 → %GDGBK%, Shift-JIS → %GDSHIFTJIS%</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>음성 합성</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>발음은 Wikimedia France의 공동 언어 미디어 라이브러리인 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>에서 제공됩니다. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3777,6 +3777,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Spausdinimo versija ir diagnostikos informacija.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Priverskite žodį išversti „scanpopup“.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Priverskite žodį išversti pagrindiniame lange</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3997,10 +4005,6 @@ Dar įtraukta į GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Tarimus pateikė <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, bendradarbiaujanti Wikimedia France lingvistinė medijos biblioteka. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Įgalinti Lingua Libre</translation>
|
||||
|
@ -4216,6 +4220,10 @@ rašybos spėjimus.
|
|||
<source>Text to Speech</source>
|
||||
<translation>Balso sintezavimas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Tarimus pateikė <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, bendradarbiaujanti Wikimedia France lingvistinė medijos biblioteka. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3788,6 +3788,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Информации за печатена верзија и дијагноза.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Принудете го зборот да се преведе во scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Принудете го зборот да се преведе во главниот прозорец</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4008,10 +4016,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Лингва Либре</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Изговори обезбедени од <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, заедничка лингвистичка медиумска библиотека на Викимедија Франција. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Овозможете Lingua Libre</translation>
|
||||
|
@ -4230,6 +4234,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Текст во говор</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Изговорите се обезбедени од <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, заедничка лингвистичка медиумска библиотека на Викимедија Франција. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3776,6 +3776,14 @@ van Stardict, Babylon en GLS woordenboeken</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Printversie en diagnose-info.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Forceer het woord om te worden vertaald in scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Forceer dat het woord in het hoofdvenster wordt vertaald</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3996,10 +4004,6 @@ Nog niet geïmplementeerd in GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncaties geleverd door <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, een gezamenlijke taalmediabibliotheek van Wikimedia Frankrijk. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre inschakelen</translation>
|
||||
|
@ -4216,6 +4220,10 @@ groep om ze te gebruiken.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Tekst naar spraak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Uitspraken geleverd door <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, een gezamenlijke taalkundige mediabibliotheek van Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3779,6 +3779,14 @@ ze słowników Stardict, Babylon i GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Wersja do druku i informacje diagnostyczne.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Wymuś przetłumaczenie słowa w scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Wymuś przetłumaczenie słowa w oknie głównym</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Systemu tego nie zaimplementowano jeszcze w programie GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations sprowokowały <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, wspólna biblioteka mediów językowych w Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Włącz Lingua Libre</translation>
|
||||
|
@ -4221,6 +4225,10 @@ właściwej grupy.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Tekst na mowę</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Wymowy dostarczone przez <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, wspólną bibliotekę mediów językowych Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3785,6 +3785,14 @@ dos dicionários Stardict, Babylon e GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Versão impressa e informações de diagnóstico.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Forçar a palavra a ser traduzida no scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Forçar a palavra a ser traduzida na janela principal</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4005,10 +4013,6 @@ Ainda não implementado no GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncações fornecidas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, uma biblioteca de mídia linguística colaborativa da Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Habilitar Lingua Livre</translation>
|
||||
|
@ -4229,6 +4233,10 @@ dos grupos apropriados para usá-los.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Texto para Fala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Pronúncias fornecidas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, uma biblioteca de mídia linguística colaborativa da Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3780,6 +3780,14 @@ no Stardict, Babilônia e dicionários GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Versão impressa e informações de diagnóstico.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Forçar a palavra a ser traduzida no scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Forçar a palavra a ser traduzida na janela principal</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ não implementado ainda em GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncações fornecidas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, uma biblioteca de mídia linguística colaborativa da Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Habilitar Lingua Livre</translation>
|
||||
|
@ -4220,6 +4224,10 @@ dos grupos apropriados para usá-los.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Texto para fala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Pronúncias fornecidas por <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, uma biblioteca de mídia linguística colaborativa da Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
1234
locale/qu_PE.ts
1234
locale/qu_PE.ts
File diff suppressed because it is too large
Load diff
|
@ -3785,6 +3785,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Версия для печати и диагностическая информация.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Принудительно перевести слово в scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Принудительно перевести слово в главном окне</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4005,10 +4013,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Принцессы, предоставленные <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, совместная библиотека лингвистических медиа во Франции. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Включить Lingua Libre</translation>
|
||||
|
@ -4228,6 +4232,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Синтез речи</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Произношения предоставлены <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, совместной лингвистической медиабиблиотекой Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3773,6 +3773,14 @@ zo slovníkov Stardict, Babylon a GLS.</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Vytlačiť verziu a diagnostické informácie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Vynútiť preklad slova v scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Vynútiť preklad slova v hlavnom okne</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3993,10 +4001,6 @@ Zatiaľ nie je implementovaný v GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Výslovnosti poskytnuté <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, kolaboratívna lingvistická mediálna knižnica Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Povoliť Lingua Libre</translation>
|
||||
|
@ -4211,6 +4215,10 @@ vhodné slovníky dole k vhodným skupinám.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Text na reč</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Výslovnosti poskytuje <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, kolaboratívna lingvistická mediálna knižnica Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3772,6 +3772,14 @@ nga fjalorët Stardict, Babylon dhe GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Versioni i printuar dhe informacioni i diagnozës.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Detyrojeni fjalën të përkthehet në scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Detyrojeni fjalën të përkthehet në dritaren kryesore</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3992,10 +4000,6 @@ Akoma i pafutur në GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Shqiptime të ofruara nga <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, një bibliotekë mediatike gjuhësore bashkëpunuese e Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Aktivizo Lingua Libre</translation>
|
||||
|
@ -4211,6 +4215,10 @@ të caktuara për t'i përdorur.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Tekst në tinguj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Shqiptime të siguruara nga <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, një bibliotekë mediatike gjuhësore bashkëpunuese e Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3782,6 +3782,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Верзија за штампање и информације о дијагнози.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Присилите да се реч преведе у искачућем прозору</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Присилите да се реч преведе у главном прозору</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4002,10 +4010,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Лингуа Либре</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Изговоре обезбедио <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Лингуа Либре</span></a>, колаборативна лингвистичка медијска библиотека Викимедије Француске. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Омогућите Лингуа Либре</translation>
|
||||
|
@ -4224,6 +4228,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Текст у говор</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Изговоре обезбеђује <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Лингуа Либре</span></a>, сарадничка лингвистичка медијска библиотека Викимедије Француске. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3782,6 +3782,14 @@ från Stardict, Babylon och GLS ordböcker</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Utskriftsversion och diagnosinformation.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Tvinga ordet att översättas i scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Tvinga ordet att översättas i huvudfönstret</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4002,10 +4010,6 @@ Har ännu inte implementerats i GoldenDict.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prounkeringar som tillhandahålls av <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, ett språkligt mediebibliotek i Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Aktivera Lingua Libre</translation>
|
||||
|
@ -4222,6 +4226,10 @@ använda dem.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Text till tal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Uttal tillhandahålls av <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, ett samarbetande språkligt mediebibliotek från Wikimedia Frankrike. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3780,6 +3780,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Версияи чопӣ ва маълумоти ташхис.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Маҷбур кунед, ки калимаро дар scanpopup тарҷума кунед</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Маҷбур кардани калима дар равзанаи асосӣ тарҷума карда шавад</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4000,10 +4008,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Тарҷумаҳо аз ҷониби <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, китобхонаи муштараки лингвистии Викимедиа Фаронса. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre-ро фаъол созед</translation>
|
||||
|
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Матн ба талаффуз</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Талаффузҳо аз ҷониби <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, китобхонаи муштараки лингвистии Викимедиа Фаронса. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3779,6 +3779,14 @@ arkaly goşmaça makalalary gözlemek üçin bu opsiýany açyň</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Wersiýa we diagnoz maglumatlary çap ediň.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Sözü skanpopupda terjime etmäge mejbur ediň</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Sözü esasy setirde terjime etmäge mejbur ediň</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3999,10 +4007,6 @@ Entek GoldenDict-de edilmedik.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Wikimedia France-iň bilelikdäki dil metbugat kitaphanasy <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>tarapyndan berlen bildirişler. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre-i işlediň</translation>
|
||||
|
@ -4215,6 +4219,10 @@ Laýyk gelýän sözlükleri degişli toparlaryň aşagyna goşup ulan.</transla
|
|||
<source>Text to Speech</source>
|
||||
<translation>Teksti gürläp aýtdyrmak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Wikimedia France-iň bilelikdäki lingwistik media kitaphanasy <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>tarapyndan berlen sözler. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3778,6 +3778,14 @@ eşanlamlı listeleri aracılığıyla ekstra makale aramasını etkinleştirmek
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Sürümü ve teşhis bilgilerini yazdırın.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Scanpopup'ta çevrilecek kelimeyi zorla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Ana pencerede çevrilecek kelimeyi zorla</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3998,10 +4006,6 @@ Henüz GoldenDict uygulanmadı.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Serbest Dil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Telaffuz <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>tarafından sağlanmıştır, Wikimedia Fransa'nın işbirliğine dayalı bir dilbilimsel ortam kitaplığı. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Lingua Libre'yi Etkinleştir</translation>
|
||||
|
@ -4216,6 +4220,10 @@ uygun grupların altlarına ekleyin.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Metinden Sese</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Telaffuzlar, Wikimedia Fransa'nın ortak dilsel medya kütüphanesi olan <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>tarafından sağlanmıştır. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3781,6 +3781,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Друкована версія та інформація про діагностику.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Примусово перекласти слово у вікні сканування</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Примусово перекласти слово в головному вікні</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -4001,10 +4009,6 @@ Not implemented yet in GoldenDict.</source>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Вимова надано <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, спільною лінгвістичною медіа-бібліотекою Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Увімкнути Lingua Libre</translation>
|
||||
|
@ -4220,6 +4224,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>Текст для вимови</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Вимова надана <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, спільною лінгвістичною медіа-бібліотекою Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3773,6 +3773,14 @@ từ các từ điển Stardict, Babylon và GLS</translation>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>Phiên bản in và thông tin chẩn đoán.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>Buộc dịch từ đó trong scanpopup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>Buộc dịch từ trong cửa sổ chính</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3993,10 +4001,6 @@ Chưa được bổ sung trong Từ điển Vàng.</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>ngôn ngữ tự do</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Prouncations được cung cấp bởi <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, một thư viện phương tiện ngôn ngữ cộng tác của Wikimedia Pháp. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>Kích hoạt Lingua Libre</translation>
|
||||
|
@ -4211,6 +4215,10 @@ phù hợp để sử dụng chúng.</translation>
|
|||
<source>Text to Speech</source>
|
||||
<translation>chuyển văn bản thành giọng nói</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>Cách phát âm được cung cấp bởi <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, một thư viện phương tiện ngôn ngữ hợp tác của Wikimedia France. </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -3581,7 +3581,7 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation>外貌</translation>
|
||||
<translation>界面外观</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source>
|
||||
|
@ -3763,6 +3763,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>打印版本和诊断信息。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>强制在 scanpopup 中翻译单词</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>强制在主窗口中翻译该单词</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3982,10 +3990,6 @@ GoldenDict 尚不支持此方案。</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>由 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>法国维基百科合作语言媒体图书馆 </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>启用 Lingua Libre</translation>
|
||||
|
@ -4199,6 +4203,10 @@ of the appropriate groups to use them.</source>
|
|||
<source>Text to Speech</source>
|
||||
<translation>语音合成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>发音由法国维基媒体合作语言媒体图书馆 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>提供。 </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -465,7 +465,7 @@ between classic and school orthography in cyrillic)</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Auto group by folder failed.</source>
|
||||
<translation>依文件夾自動分組失敗</translation>
|
||||
<translation>按資料夾自動分組失敗。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The parent directory of %1 can not be reached.</source>
|
||||
|
@ -473,7 +473,7 @@ between classic and school orthography in cyrillic)</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to generate a set of groups based on containing folders?</source>
|
||||
<translation>您確定要依據語言來產生群組嗎?</translation>
|
||||
<translation>您確定要根據包含的資料夾產生一組群組嗎?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Make two-side translate group "%1-%2-%1"</source>
|
||||
|
@ -661,7 +661,7 @@ between classic and school orthography in cyrillic)</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Open index folder</source>
|
||||
<translation>打開索引文件夾</translation>
|
||||
<translation>打開索引資料夾</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -1064,11 +1064,11 @@ between classic and school orthography in cyrillic)</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Create folder-based groups.</source>
|
||||
<translation>創建基於文件夾的群組</translation>
|
||||
<translation>建立基於資料夾的群組。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Group by Folders</source>
|
||||
<translation>按文件夾分組</translation>
|
||||
<translation>按資料夾分組</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Group by Metadata</source>
|
||||
|
@ -3589,7 +3589,7 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation>外貌</translation>
|
||||
<translation>界面外觀</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>These fonts will be applied when the fonts specified by a dictionary are not found.</source>
|
||||
|
@ -3745,7 +3745,7 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Save debug messages to gd_log.txt in the config folder.</source>
|
||||
<translation>將調試消息保存到配置文件夾中的 gd_log.txt。</translation>
|
||||
<translation>將偵錯訊息儲存到 config 資料夾中的 gd_log.txt。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset window state.</source>
|
||||
|
@ -3771,6 +3771,14 @@ from Stardict, Babylon and GLS dictionaries</source>
|
|||
<source>Print version and diagnosis info.</source>
|
||||
<translation>打印版本和診斷信息。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in scanpopup</source>
|
||||
<translation>強制在 scanpopup 中翻譯單字</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force the word to be translated in the mainwindow</source>
|
||||
<translation>強制在主視窗中翻譯該單字</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QuickFilterLine</name>
|
||||
|
@ -3991,10 +3999,6 @@ GoldenDict 尚不支援此方案。</translation>
|
|||
<source>Lingua Libre</source>
|
||||
<translation>Lingua Libre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>發音由 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a> 提供,後者是法國維基媒體的協作語言媒體庫。 </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Lingua Libre</source>
|
||||
<translation>啟用Lingua Libre</translation>
|
||||
|
@ -4208,6 +4212,10 @@ Big-5 使用%GDBIG5%,Big5-HKSCS 使用 %GDBIG5HKSCS% ,GBK 和 GB18030 使用
|
|||
<source>Text to Speech</source>
|
||||
<translation>文字轉語音</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></source>
|
||||
<translation><html><head/><body><p>發音由法國維基媒體合作語言媒體圖書館 <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>提供。 </p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StylesComboBox</name>
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>icons/add-anki-icon.svg</file>
|
||||
<file>icons/document.png</file>
|
||||
<file>icons/audio.png</file>
|
||||
<file>version.txt</file>
|
||||
<file>icons/arrow.png</file>
|
||||
<file>icons/prefix.png</file>
|
||||
|
|
|
@ -156,7 +156,7 @@ body { background: #242525; }
|
|||
.gdarticle { background: initial;}
|
||||
|
||||
.gdarticlebody img{
|
||||
background: white;
|
||||
background: white !important;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
|
@ -246,46 +246,9 @@ std::string ArticleMaker::makeNotFoundBody( QString const & word, QString const
|
|||
return result;
|
||||
}
|
||||
|
||||
sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const & word,
|
||||
unsigned groupId,
|
||||
QMap< QString, QString > const & contexts,
|
||||
QSet< QString > const & mutedDicts,
|
||||
QStringList const & dictIDs,
|
||||
bool ignoreDiacritics ) const
|
||||
string ArticleMaker::makeWelcomeHtml() const
|
||||
{
|
||||
if ( !dictIDs.isEmpty() ) {
|
||||
QStringList ids = dictIDs;
|
||||
std::vector< sptr< Dictionary::Class > > ftsDicts;
|
||||
|
||||
// Find dictionaries by ID's
|
||||
for ( unsigned x = 0; x < dictionaries.size(); x++ ) {
|
||||
for ( QStringList::Iterator it = ids.begin(); it != ids.end(); ++it ) {
|
||||
if ( *it == QString::fromStdString( dictionaries[ x ]->getId() ) ) {
|
||||
ftsDicts.push_back( dictionaries[ x ] );
|
||||
ids.erase( it );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( ids.isEmpty() )
|
||||
break;
|
||||
}
|
||||
|
||||
string header = makeHtmlHeader( word, QString(), true );
|
||||
|
||||
return std::make_shared< ArticleRequest >( word,
|
||||
Instances::Group{ groupId, "" },
|
||||
contexts,
|
||||
ftsDicts,
|
||||
header,
|
||||
-1,
|
||||
true );
|
||||
}
|
||||
|
||||
if ( groupId == Instances::Group::HelpGroupId ) {
|
||||
// This is a special group containing internal welcome/help pages
|
||||
string result = makeHtmlHeader( word, QString(), cfg.alwaysExpandOptionalParts );
|
||||
|
||||
if ( word == tr( "Welcome!" ) ) {
|
||||
string result = makeHtmlHeader( tr( "Welcome!" ), QString(), cfg.alwaysExpandOptionalParts );
|
||||
//tooltip
|
||||
result += R"(<script src="qrc:///scripts/popper.min.js"></script>)";
|
||||
result += R"(<script src="qrc:///scripts/tippy.min.js"></script>)";
|
||||
|
@ -350,27 +313,68 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const &
|
|||
</script>)" )
|
||||
.arg( theme )
|
||||
.toStdString();
|
||||
|
||||
result += "</body></html>";
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const & word,
|
||||
unsigned groupId,
|
||||
QMap< QString, QString > const & contexts,
|
||||
QSet< QString > const & mutedDicts,
|
||||
QStringList const & dictIDs,
|
||||
bool ignoreDiacritics ) const
|
||||
{
|
||||
if ( !dictIDs.isEmpty() ) {
|
||||
QStringList ids = dictIDs;
|
||||
std::vector< sptr< Dictionary::Class > > ftsDicts;
|
||||
|
||||
// Find dictionaries by ID's
|
||||
for ( unsigned x = 0; x < dictionaries.size(); x++ ) {
|
||||
for ( QStringList::Iterator it = ids.begin(); it != ids.end(); ++it ) {
|
||||
if ( *it == QString::fromStdString( dictionaries[ x ]->getId() ) ) {
|
||||
ftsDicts.push_back( dictionaries[ x ] );
|
||||
ids.erase( it );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( ids.isEmpty() )
|
||||
break;
|
||||
}
|
||||
|
||||
string header = makeHtmlHeader( word, QString(), true );
|
||||
|
||||
return std::make_shared< ArticleRequest >( word,
|
||||
Instances::Group{ groupId, "" },
|
||||
contexts,
|
||||
ftsDicts,
|
||||
header,
|
||||
-1,
|
||||
true );
|
||||
}
|
||||
|
||||
if ( groupId == Instances::Group::HelpGroupId ) {
|
||||
if ( word == tr( "Welcome!" ) ) {
|
||||
string welcome = makeWelcomeHtml();
|
||||
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
|
||||
|
||||
r->appendString( welcome );
|
||||
return r;
|
||||
}
|
||||
else {
|
||||
// Not found
|
||||
return makeNotFoundTextFor( word, "help" );
|
||||
}
|
||||
|
||||
result += "</body></html>";
|
||||
|
||||
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
|
||||
|
||||
r->appendString( result );
|
||||
return r;
|
||||
}
|
||||
|
||||
// Find the given group
|
||||
|
||||
Instances::Group const * activeGroup = 0;
|
||||
|
||||
for ( unsigned x = 0; x < groups.size(); ++x )
|
||||
if ( groups[ x ].id == groupId ) {
|
||||
activeGroup = &groups[ x ];
|
||||
for ( const auto & group : groups )
|
||||
if ( group.id == groupId ) {
|
||||
activeGroup = &group;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -426,19 +430,22 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeNotFoundTextFor( QString const
|
|||
|
||||
sptr< Dictionary::DataRequest > ArticleMaker::makeEmptyPage() const
|
||||
{
|
||||
string result = makeHtmlHeader( tr( "(untitled)" ), QString(), true ) + "</body></html>";
|
||||
|
||||
string result = makeUntitleHtml();
|
||||
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
|
||||
|
||||
r->appendString( result );
|
||||
return r;
|
||||
}
|
||||
|
||||
string ArticleMaker::makeUntitleHtml() const
|
||||
{
|
||||
return makeHtmlHeader( tr( "(untitled)" ), QString(), true ) + "</body></html>";
|
||||
}
|
||||
|
||||
sptr< Dictionary::DataRequest > ArticleMaker::makePicturePage( string const & url ) const
|
||||
{
|
||||
string result = makeHtmlHeader( tr( "(picture)" ), QString(), true )
|
||||
+ R"lit(<a href="javascript: if(history.length>2) history.go(-1)">)lit" + R"(<img src=")" + url + R"(" /></a>)"
|
||||
+ "</body></html>";
|
||||
string const result =
|
||||
makeHtmlHeader( tr( "(picture)" ), QString(), true ) + R"(<img src=")" + url + R"(" />)" + "</body></html>";
|
||||
|
||||
sptr< Dictionary::DataRequestInstant > r = std::make_shared< Dictionary::DataRequestInstant >( true );
|
||||
|
||||
|
@ -461,6 +468,10 @@ bool ArticleMaker::adjustFilePath( QString & fileName )
|
|||
}
|
||||
return false;
|
||||
}
|
||||
string ArticleMaker::makeBlankHtml() const
|
||||
{
|
||||
return makeHtmlHeader( "", QString(), true ) + "</body></html>";
|
||||
}
|
||||
|
||||
//////// ArticleRequest
|
||||
|
||||
|
@ -869,13 +880,12 @@ void ArticleRequest::stemmedSearchFinished()
|
|||
continueMatching = true;
|
||||
}
|
||||
|
||||
if ( !continueMatching )
|
||||
if ( !continueMatching ) {
|
||||
footer += "</body></html>";
|
||||
|
||||
{
|
||||
appendString( footer );
|
||||
}
|
||||
|
||||
appendString( footer );
|
||||
|
||||
if ( continueMatching )
|
||||
update();
|
||||
else
|
||||
|
@ -891,8 +901,6 @@ void ArticleRequest::compoundSearchNextStep( bool lastSearchSucceeded )
|
|||
|
||||
if ( lastGoodCompoundResult.size() ) // We have something to append
|
||||
{
|
||||
// GD_DPRINTF( "Appending\n" );
|
||||
|
||||
if ( !firstCompoundWasFound ) {
|
||||
// Append the beginning
|
||||
footer += R"(<div class="gdstemmedsuggestion"><span class="gdstemmedsuggestion_head">)"
|
||||
|
|
|
@ -16,7 +16,8 @@
|
|||
/// This class generates the article's body for the given lookup request
|
||||
class ArticleMaker: public QObject
|
||||
{
|
||||
Q_OBJECT // We make it QObject to use tr() conveniently
|
||||
Q_OBJECT
|
||||
// We make it QObject to use tr() conveniently
|
||||
|
||||
std::vector< sptr< Dictionary::Class > > const & dictionaries;
|
||||
std::vector< Instances::Group > const & groups;
|
||||
|
@ -62,6 +63,9 @@ public:
|
|||
/// Add base path to file path if it's relative and file not found
|
||||
/// Return true if path successfully adjusted
|
||||
static bool adjustFilePath( QString & fileName );
|
||||
string makeUntitleHtml() const;
|
||||
string makeWelcomeHtml() const;
|
||||
string makeBlankHtml() const;
|
||||
|
||||
private:
|
||||
std::string readCssFile( QString const & fileName, std::string type ) const;
|
||||
|
|
|
@ -62,45 +62,7 @@ AllowFrameReply::AllowFrameReply( QNetworkReply * _reply ):
|
|||
|
||||
void AllowFrameReply::applyMetaData()
|
||||
{
|
||||
// Set raw headers except X-Frame-Options
|
||||
QList< QByteArray > rawHeaders = baseReply->rawHeaderList();
|
||||
for ( QList< QByteArray >::iterator it = rawHeaders.begin(); it != rawHeaders.end(); ++it ) {
|
||||
auto headerName = it->toLower();
|
||||
if ( headerName != "x-frame-options" && headerName != "content-security-policy" )
|
||||
setRawHeader( *it, baseReply->rawHeader( *it ) );
|
||||
}
|
||||
|
||||
// Set known headers
|
||||
setHeader( QNetworkRequest::ContentDispositionHeader,
|
||||
baseReply->header( QNetworkRequest::ContentDispositionHeader ) );
|
||||
setHeader( QNetworkRequest::ContentTypeHeader, baseReply->header( QNetworkRequest::ContentTypeHeader ) );
|
||||
setHeader( QNetworkRequest::ContentLengthHeader, baseReply->header( QNetworkRequest::ContentLengthHeader ) );
|
||||
setHeader( QNetworkRequest::LocationHeader, baseReply->header( QNetworkRequest::LocationHeader ) );
|
||||
setHeader( QNetworkRequest::LastModifiedHeader, baseReply->header( QNetworkRequest::LastModifiedHeader ) );
|
||||
setHeader( QNetworkRequest::CookieHeader, baseReply->header( QNetworkRequest::CookieHeader ) );
|
||||
setHeader( QNetworkRequest::SetCookieHeader, baseReply->header( QNetworkRequest::SetCookieHeader ) );
|
||||
setHeader( QNetworkRequest::UserAgentHeader, baseReply->header( QNetworkRequest::UserAgentHeader ) );
|
||||
setHeader( QNetworkRequest::ServerHeader, baseReply->header( QNetworkRequest::ServerHeader ) );
|
||||
|
||||
// Set attributes
|
||||
setAttribute( QNetworkRequest::HttpStatusCodeAttribute,
|
||||
baseReply->attribute( QNetworkRequest::HttpStatusCodeAttribute ) );
|
||||
setAttribute( QNetworkRequest::HttpReasonPhraseAttribute,
|
||||
baseReply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ) );
|
||||
setAttribute( QNetworkRequest::RedirectionTargetAttribute,
|
||||
baseReply->attribute( QNetworkRequest::RedirectionTargetAttribute ) );
|
||||
setAttribute( QNetworkRequest::ConnectionEncryptedAttribute,
|
||||
baseReply->attribute( QNetworkRequest::ConnectionEncryptedAttribute ) );
|
||||
setAttribute( QNetworkRequest::SourceIsFromCacheAttribute,
|
||||
baseReply->attribute( QNetworkRequest::SourceIsFromCacheAttribute ) );
|
||||
setAttribute( QNetworkRequest::HttpPipeliningWasUsedAttribute,
|
||||
baseReply->attribute( QNetworkRequest::HttpPipeliningWasUsedAttribute ) );
|
||||
setAttribute( QNetworkRequest::BackgroundRequestAttribute,
|
||||
baseReply->attribute( QNetworkRequest::BackgroundRequestAttribute ) );
|
||||
setAttribute( QNetworkRequest::Http2WasUsedAttribute,
|
||||
baseReply->attribute( QNetworkRequest::Http2WasUsedAttribute ) );
|
||||
|
||||
emit metaDataChanged();
|
||||
// The webengine does not support to customize the headers right now ,maybe until Qt6.7 there should be some api supports
|
||||
}
|
||||
|
||||
void AllowFrameReply::setReadBufferSize( qint64 size )
|
||||
|
@ -135,35 +97,20 @@ void AllowFrameReply::finishedSlot()
|
|||
|
||||
QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest const & req )
|
||||
{
|
||||
QUrl url;
|
||||
auto op = GetOperation;
|
||||
|
||||
if ( req.url().scheme() == "qrcx" ) {
|
||||
// We had to override the local load policy for the qrc URL scheme until QWebSecurityOrigin::addLocalScheme() was
|
||||
// introduced in Qt 4.6. Hence we used a custom qrcx URL scheme and redirected it here back to qrc. Qt versions
|
||||
// older than 4.6 are no longer supported, so GoldenDict itself no longer uses the qrcx scheme. However, qrcx has
|
||||
// been used for many years in our built-in article styles, and so may appear in user-defined article styles.
|
||||
// TODO: deprecate (print a warning or show a warning message box) and eventually remove support for the obsolete
|
||||
// qrcx URL scheme. A recent commit "Add support for qrc:// URL scheme" is the first one where the qrc scheme
|
||||
// works correctly. So the deprecation has to wait until older GoldenDict versions become rarely used.
|
||||
QUrl newUrl( req.url() );
|
||||
|
||||
newUrl.setScheme( "qrc" );
|
||||
newUrl.setHost( "" );
|
||||
|
||||
QNetworkRequest newReq( req );
|
||||
newReq.setUrl( newUrl );
|
||||
|
||||
return QNetworkAccessManager::createRequest( op, newReq, nullptr );
|
||||
// Do not support qrcx which is the custom define protocol.
|
||||
return new BlockedNetworkReply( this );
|
||||
}
|
||||
|
||||
url = req.url();
|
||||
auto op = GetOperation;
|
||||
|
||||
QUrl url = req.url();
|
||||
QMimeType mineType = db.mimeTypeForUrl( url );
|
||||
QString contentType = mineType.name();
|
||||
|
||||
if ( req.url().scheme() == "gdlookup" ) {
|
||||
QString path = url.path();
|
||||
if ( !path.isEmpty() ) {
|
||||
if ( path.size() > 1 ) {
|
||||
url.setPath( "" );
|
||||
|
||||
Utils::Url::addQueryItem( url, "word", path.mid( 1 ) );
|
||||
|
@ -171,7 +118,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
|
|||
}
|
||||
}
|
||||
|
||||
sptr< Dictionary::DataRequest > dr = getResource( url, contentType );
|
||||
auto dr = getResource( url, contentType );
|
||||
|
||||
if ( dr.get() )
|
||||
return new ArticleResourceReply( this, req, dr, contentType );
|
||||
|
@ -182,7 +129,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
|
|||
//if not external url,can be blocked from here. no need to continue execute the following code.
|
||||
//such as bres://upload.wikimedia.... etc .
|
||||
if ( !Utils::isExternalLink( url ) ) {
|
||||
gdWarning( "Blocking element \"%s\" as built-in link ", req.url().toEncoded().data() );
|
||||
gdWarning( R"(Blocking element "%s" as built-in link )", req.url().toEncoded().data() );
|
||||
return new BlockedNetworkReply( this );
|
||||
}
|
||||
|
||||
|
@ -197,7 +144,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
|
|||
if ( !url.host().endsWith( refererUrl.host() )
|
||||
&& Utils::Url::getHostBaseFromUrl( url ) != Utils::Url::getHostBaseFromUrl( refererUrl )
|
||||
&& !url.scheme().startsWith( "data" ) ) {
|
||||
gdWarning( "Blocking element \"%s\" due to not same domain", url.toEncoded().data() );
|
||||
gdWarning( R"(Blocking element "%s" due to not same domain)", url.toEncoded().data() );
|
||||
|
||||
return new BlockedNetworkReply( this );
|
||||
}
|
||||
|
@ -206,7 +153,7 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
|
|||
if ( req.url().scheme() == "file" ) {
|
||||
// Check file presence and adjust path if necessary
|
||||
QString fileName = req.url().toLocalFile();
|
||||
if ( req.url().host().isEmpty() && articleMaker.adjustFilePath( fileName ) ) {
|
||||
if ( req.url().host().isEmpty() && ArticleMaker::adjustFilePath( fileName ) ) {
|
||||
QUrl newUrl( req.url() );
|
||||
QUrl localUrl = QUrl::fromLocalFile( fileName );
|
||||
|
||||
|
@ -239,6 +186,20 @@ QNetworkReply * ArticleNetworkAccessManager::getArticleReply( QNetworkRequest co
|
|||
return new AllowFrameReply( reply );
|
||||
}
|
||||
|
||||
string ArticleNetworkAccessManager::getHtml( ResourceType resourceType )
|
||||
{
|
||||
switch ( resourceType ) {
|
||||
case ResourceType::UNTITLE:
|
||||
return articleMaker.makeUntitleHtml();
|
||||
case ResourceType::WELCOME:
|
||||
return articleMaker.makeWelcomeHtml();
|
||||
case ResourceType::BLANK:
|
||||
return articleMaker.makeBlankHtml();
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl const & url, QString & contentType )
|
||||
{
|
||||
qDebug() << "getResource:" << url.toString();
|
||||
|
@ -275,21 +236,8 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
|
|||
|
||||
// Unpack contexts
|
||||
|
||||
QMap< QString, QString > contexts;
|
||||
|
||||
QString contextsEncoded = Utils::Url::queryItemValue( url, "contexts" );
|
||||
|
||||
if ( contextsEncoded.size() ) {
|
||||
QByteArray ba = QByteArray::fromBase64( contextsEncoded.toLatin1() );
|
||||
|
||||
QBuffer buf( &ba );
|
||||
|
||||
buf.open( QBuffer::ReadOnly );
|
||||
|
||||
QDataStream stream( &buf );
|
||||
|
||||
stream >> contexts;
|
||||
}
|
||||
QString const contextsEncoded = Utils::Url::queryItemValue( url, "contexts" );
|
||||
QMap< QString, QString > const contexts = Utils::str2map( contextsEncoded );
|
||||
|
||||
// See for ignore diacritics
|
||||
|
||||
|
@ -301,21 +249,22 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
|
|||
|
||||
if ( ( url.scheme() == "bres" || url.scheme() == "gdau" || url.scheme() == "gdvideo" || url.scheme() == "gico" )
|
||||
&& url.path().size() ) {
|
||||
//GD_DPRINTF( "Get %s\n", req.url().host().toLocal8Bit().data() );
|
||||
//GD_DPRINTF( "Get %s\n", req.url().path().toLocal8Bit().data() );
|
||||
|
||||
|
||||
QMimeType mineType = db.mimeTypeForUrl( url );
|
||||
contentType = mineType.name();
|
||||
string id = url.host().toStdString();
|
||||
|
||||
bool search = ( id == "search" );
|
||||
|
||||
if ( !search ) {
|
||||
for ( unsigned x = 0; x < dictionaries.size(); ++x )
|
||||
if ( dictionaries[ x ]->getId() == id ) {
|
||||
for ( const auto & dictionary : dictionaries )
|
||||
if ( dictionary->getId() == id ) {
|
||||
if ( url.scheme() == "gico" ) {
|
||||
QByteArray bytes;
|
||||
QBuffer buffer( &bytes );
|
||||
buffer.open( QIODevice::WriteOnly );
|
||||
dictionaries[ x ]->getIcon().pixmap( 64 ).save( &buffer, "PNG" );
|
||||
dictionary->getIcon().pixmap( 64 ).save( &buffer, "PNG" );
|
||||
buffer.close();
|
||||
sptr< Dictionary::DataRequestInstant > ico = std::make_shared< Dictionary::DataRequestInstant >( true );
|
||||
ico->getData().resize( bytes.size() );
|
||||
|
@ -323,24 +272,17 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl c
|
|||
return ico;
|
||||
}
|
||||
try {
|
||||
return dictionaries[ x ]->getResource( Utils::Url::path( url ).mid( 1 ).toUtf8().data() );
|
||||
return dictionary->getResource( Utils::Url::path( url ).mid( 1 ).toUtf8().data() );
|
||||
}
|
||||
catch ( std::exception & e ) {
|
||||
gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), dictionaries[ x ]->getName().c_str() );
|
||||
return sptr< Dictionary::DataRequest >();
|
||||
gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), dictionary->getName().c_str() );
|
||||
return {};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( url.scheme() == "gdpicture" ) {
|
||||
contentType = "text/html";
|
||||
QUrl imgUrl( url );
|
||||
imgUrl.setScheme( "bres" );
|
||||
return articleMaker.makePicturePage( imgUrl.toEncoded().data() );
|
||||
}
|
||||
|
||||
return sptr< Dictionary::DataRequest >();
|
||||
return {};
|
||||
}
|
||||
|
||||
ArticleResourceReply::ArticleResourceReply( QObject * parent,
|
||||
|
@ -401,16 +343,17 @@ void ArticleResourceReply::reqFinished()
|
|||
|
||||
qint64 ArticleResourceReply::bytesAvailable() const
|
||||
{
|
||||
qint64 avail = req->dataSize();
|
||||
qint64 const avail = req->dataSize();
|
||||
|
||||
if ( avail < 0 )
|
||||
return 0;
|
||||
|
||||
if ( !req->isFinished() ) {
|
||||
return 65536;
|
||||
qint64 const availBytes = avail - alreadyRead + QNetworkReply::bytesAvailable();
|
||||
if ( availBytes == 0 && !req->isFinished() ) {
|
||||
return 10240;
|
||||
}
|
||||
|
||||
return avail - alreadyRead + QNetworkReply::bytesAvailable();
|
||||
return availBytes;
|
||||
}
|
||||
|
||||
|
||||
|
@ -426,17 +369,17 @@ qint64 ArticleResourceReply::readData( char * out, qint64 maxSize )
|
|||
if ( maxSize == 0 )
|
||||
return 0;
|
||||
|
||||
bool finished = req->isFinished();
|
||||
bool const finished = req->isFinished();
|
||||
|
||||
qint64 avail = req->dataSize();
|
||||
qint64 const avail = req->dataSize();
|
||||
|
||||
if ( avail < 0 )
|
||||
return finished ? -1 : 0;
|
||||
|
||||
|
||||
qint64 left = avail - alreadyRead;
|
||||
qint64 const left = avail - alreadyRead;
|
||||
|
||||
qint64 toRead = maxSize < left ? maxSize : left;
|
||||
qint64 const toRead = maxSize < left ? maxSize : left;
|
||||
if ( !toRead && finished )
|
||||
return -1;
|
||||
GD_DPRINTF( "====reading %d of (%lld) bytes . Finished: %d", (int)toRead, avail, finished );
|
||||
|
@ -501,15 +444,15 @@ LocalSchemeHandler::LocalSchemeHandler( ArticleNetworkAccessManager & articleNet
|
|||
|
||||
void LocalSchemeHandler::requestStarted( QWebEngineUrlRequestJob * requestJob )
|
||||
{
|
||||
QUrl url = requestJob->requestUrl();
|
||||
QUrl const url = requestJob->requestUrl();
|
||||
QNetworkRequest request;
|
||||
request.setUrl( url );
|
||||
|
||||
//all the url reached here must be either gdlookup or bword scheme.
|
||||
auto [ valid, word ] = Utils::Url::getQueryWord( url );
|
||||
auto [ schemeValid, word ] = Utils::Url::getQueryWord( url );
|
||||
// or the condition can be (!queryWord.first || word.isEmpty())
|
||||
// ( queryWord.first && word.isEmpty() ) is only part of the above condition.
|
||||
if ( valid && word.isEmpty() ) {
|
||||
if ( schemeValid && word.isEmpty() ) {
|
||||
// invalid gdlookup url.
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -125,6 +125,11 @@ protected:
|
|||
}
|
||||
};
|
||||
|
||||
enum class ResourceType {
|
||||
UNTITLE,
|
||||
WELCOME,
|
||||
BLANK
|
||||
};
|
||||
|
||||
class ArticleNetworkAccessManager: public QNetworkAccessManager
|
||||
{
|
||||
|
@ -157,6 +162,7 @@ public:
|
|||
sptr< Dictionary::DataRequest > getResource( QUrl const & url, QString & contentType );
|
||||
|
||||
virtual QNetworkReply * getArticleReply( QNetworkRequest const & req );
|
||||
string getHtml( ResourceType resourceType );
|
||||
};
|
||||
|
||||
class ArticleResourceReply: public QNetworkReply
|
||||
|
|
|
@ -36,9 +36,9 @@ bool tryPossibleZipName( std::string const & name, std::string & copyTo )
|
|||
void loadFromFile( std::string const & filename, std::vector< char > & data )
|
||||
{
|
||||
File::Class f( filename, "rb" );
|
||||
QByteArray byteArray{ f.readall() };
|
||||
data.reserve( byteArray.size() );
|
||||
data = std::vector< char >( byteArray.cbegin(), byteArray.cend() );
|
||||
auto size = f.file().size(); // QFile::size() obtains size via statx on Linux
|
||||
data.resize( size );
|
||||
f.read( data.data(), size );
|
||||
}
|
||||
|
||||
void Class::open( char const * mode )
|
||||
|
@ -82,11 +82,10 @@ Class::Class( std::string_view filename, char const * mode )
|
|||
|
||||
void Class::read( void * buf, qint64 size )
|
||||
{
|
||||
qint64 result = f.read( static_cast< char * >( buf ), size );
|
||||
|
||||
if ( result != size )
|
||||
if ( f.read( static_cast< char * >( buf ), size ) != size ) {
|
||||
throw exReadError();
|
||||
}
|
||||
}
|
||||
|
||||
size_t Class::readRecords( void * buf, qint64 size, qint64 count )
|
||||
{
|
||||
|
|
|
@ -13,7 +13,8 @@
|
|||
#include <vector>
|
||||
#include <QMutex>
|
||||
|
||||
/// A simple wrapper over QFile with some convenient GD specific functions
|
||||
/// A wrapper over QFile with some GD specific functions
|
||||
/// and exception throwing which are required for older coded to work correctly
|
||||
/// Consider the wrapped QFile as private implementation in the `Pimpl Idiom`
|
||||
///
|
||||
/// Note: this is used *only* in code related to `Dictionary::CLass` to manage dict files.
|
||||
|
|
|
@ -18,14 +18,6 @@ GlobalBroadcaster * GlobalBroadcaster::instance()
|
|||
return bdcaster;
|
||||
}
|
||||
|
||||
void GlobalBroadcaster::insertCache( const QString & key, QByteArray * object )
|
||||
{
|
||||
//do not cache the item when debug dictionary.
|
||||
if ( preference->dictionaryDebug )
|
||||
return;
|
||||
cache.insert( key, object );
|
||||
}
|
||||
|
||||
void GlobalBroadcaster::setPreference( Config::Preferences * p )
|
||||
{
|
||||
preference = p;
|
||||
|
|
|
@ -41,10 +41,6 @@ public:
|
|||
QMap< QString, QSet< QString > > folderFavoritesMap;
|
||||
QMap< unsigned, QString > groupFolderMap;
|
||||
PronounceEngine pronounce_engine;
|
||||
QCache< QString, QByteArray > cache;
|
||||
|
||||
void insertCache( const QString &, QByteArray * );
|
||||
|
||||
signals:
|
||||
void dictionaryChanges( ActiveDictIds ad );
|
||||
void dictionaryClear( ActiveDictIds ad );
|
||||
|
|
|
@ -24,7 +24,8 @@ QRegularExpression Ftx::token( R"((".*?")|([\w\W\+\-]+))",
|
|||
| QRegularExpression::CaseInsensitiveOption );
|
||||
//mdx
|
||||
|
||||
QRegularExpression Mdx::allLinksRe( R"((?:<\s*(a(?:rea)?|img|link|script|source)(?:\s+[^>]+|\s*)>))",
|
||||
//<audio src="xxx"> is also a valid url.
|
||||
QRegularExpression Mdx::allLinksRe( R"((?:<\s*(a(?:rea)?|img|link|script|source|audio|video)(?:\s+[^>]+|\s*)>))",
|
||||
QRegularExpression::CaseInsensitiveOption );
|
||||
QRegularExpression Mdx::wordCrossLink( R"(([\s"']href\s*=)\s*(["'])entry://([^>#]*?)((?:#[^>]*?)?)\2)",
|
||||
QRegularExpression::CaseInsensitiveOption );
|
||||
|
|
|
@ -7,8 +7,23 @@
|
|||
#ifdef _MSC_VER
|
||||
#include <stub_msvc.h>
|
||||
#endif
|
||||
#include <QBuffer>
|
||||
|
||||
using std::string;
|
||||
namespace Utils {
|
||||
QMap< QString, QString > str2map( const QString & contextsEncoded )
|
||||
{
|
||||
QMap< QString, QString > contexts;
|
||||
|
||||
if ( contextsEncoded.size() ) {
|
||||
QByteArray ba = QByteArray::fromBase64( contextsEncoded.toLatin1() );
|
||||
QBuffer buf( &ba );
|
||||
buf.open( QBuffer::ReadOnly );
|
||||
QDataStream stream( &buf );
|
||||
stream >> contexts;
|
||||
}
|
||||
return contexts;
|
||||
}
|
||||
//some str has \0 in the middle of the string. return the string before the \0
|
||||
std::string c_string( const QString & str )
|
||||
{
|
||||
|
@ -38,17 +53,16 @@ QString Utils::Url::getSchemeAndHost( QUrl const & url )
|
|||
void Utils::Widget::setNoResultColor( QWidget * widget, bool noResult )
|
||||
{
|
||||
if ( noResult ) {
|
||||
QPalette pal( widget->palette() );
|
||||
// #febb7d
|
||||
QRgb rgb = 0xfebb7d;
|
||||
pal.setColor( QPalette::Base, QColor( rgb ) );
|
||||
widget->setAutoFillBackground( true );
|
||||
widget->setPalette( pal );
|
||||
auto font = widget->font();
|
||||
font.setItalic( true );
|
||||
|
||||
widget->setFont( font );
|
||||
}
|
||||
else {
|
||||
QPalette pal( widget->style()->standardPalette() );
|
||||
widget->setAutoFillBackground( true );
|
||||
widget->setPalette( pal );
|
||||
auto font = widget->font();
|
||||
font.setItalic( false );
|
||||
|
||||
widget->setFont( font );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
using std::string;
|
||||
|
||||
namespace Utils {
|
||||
QMap< QString, QString > str2map( const QString & contextsEncoded );
|
||||
|
||||
inline bool isCJKChar( ushort ch )
|
||||
{
|
||||
if ( ( ch >= 0x3400 && ch <= 0x9FFF ) || ( ch >= 0xF900 && ch <= 0xFAFF ) || ( ch >= 0xD800 && ch <= 0xDFFF ) )
|
||||
|
|
|
@ -1013,8 +1013,6 @@ Class load()
|
|||
c.preferences.removeInvalidIndexOnExit =
|
||||
( preferences.namedItem( "removeInvalidIndexOnExit" ).toElement().text() == "1" );
|
||||
|
||||
c.preferences.dictionaryDebug = fromConfig2Preference( preferences.namedItem( "dictionaryDebug" ), "1" );
|
||||
|
||||
if ( !preferences.namedItem( "maxStringsInHistory" ).isNull() )
|
||||
c.preferences.maxStringsInHistory = preferences.namedItem( "maxStringsInHistory" ).toElement().text().toUInt();
|
||||
|
||||
|
@ -1160,9 +1158,6 @@ Class load()
|
|||
if ( !root.namedItem( "editDictionaryCommandLine" ).isNull() )
|
||||
c.editDictionaryCommandLine = root.namedItem( "editDictionaryCommandLine" ).toElement().text();
|
||||
|
||||
if ( !root.namedItem( "maxPictureWidth" ).isNull() )
|
||||
c.maxPictureWidth = root.namedItem( "maxPictureWidth" ).toElement().text().toInt();
|
||||
|
||||
if ( !root.namedItem( "maxHeadwordSize" ).isNull() ) {
|
||||
unsigned int value = root.namedItem( "maxHeadwordSize" ).toElement().text().toUInt();
|
||||
if ( value != 0 ) // 0 is invalid value for our purposes
|
||||
|
@ -2003,10 +1998,6 @@ void save( Class const & c )
|
|||
opt.appendChild( dd.createTextNode( c.preferences.removeInvalidIndexOnExit ? "1" : "0" ) );
|
||||
preferences.appendChild( opt );
|
||||
|
||||
opt = dd.createElement( "dictionaryDebug" );
|
||||
opt.appendChild( dd.createTextNode( c.preferences.dictionaryDebug ? "1" : "0" ) );
|
||||
preferences.appendChild( opt );
|
||||
|
||||
opt = dd.createElement( "maxStringsInHistory" );
|
||||
opt.appendChild( dd.createTextNode( QString::number( c.preferences.maxStringsInHistory ) ) );
|
||||
preferences.appendChild( opt );
|
||||
|
@ -2172,10 +2163,6 @@ void save( Class const & c )
|
|||
opt.appendChild( dd.createTextNode( c.editDictionaryCommandLine ) );
|
||||
root.appendChild( opt );
|
||||
|
||||
opt = dd.createElement( "maxPictureWidth" );
|
||||
opt.appendChild( dd.createTextNode( QString::number( c.maxPictureWidth ) ) );
|
||||
root.appendChild( opt );
|
||||
|
||||
opt = dd.createElement( "maxHeadwordSize" );
|
||||
opt.appendChild( dd.createTextNode( QString::number( c.maxHeadwordSize ) ) );
|
||||
root.appendChild( opt );
|
||||
|
|
|
@ -404,7 +404,6 @@ struct Preferences
|
|||
int maxNetworkCacheSize;
|
||||
bool clearNetworkCacheOnExit;
|
||||
bool removeInvalidIndexOnExit = false;
|
||||
bool dictionaryDebug = false;
|
||||
|
||||
qreal zoomFactor;
|
||||
qreal helpZoomFactor;
|
||||
|
@ -881,8 +880,6 @@ struct Class
|
|||
|
||||
bool usingSmallIconsInToolbars;
|
||||
|
||||
int maxPictureWidth; // Maximum picture width
|
||||
|
||||
/// Maximum size for the headwords.
|
||||
/// Bigger headwords won't be indexed. For now, only in DSL.
|
||||
unsigned int maxHeadwordSize;
|
||||
|
@ -899,7 +896,6 @@ struct Class
|
|||
pinPopupWindow( false ),
|
||||
showingDictBarNames( false ),
|
||||
usingSmallIconsInToolbars( false ),
|
||||
maxPictureWidth( 0 ),
|
||||
maxHeadwordSize( 256U ),
|
||||
maxHeadwordsToExpand( 0 )
|
||||
{
|
||||
|
|
|
@ -40,12 +40,14 @@ void Request::update()
|
|||
void Request::finish()
|
||||
{
|
||||
if ( !Utils::AtomicInt::loadAcquire( isFinishedFlag ) ) {
|
||||
isFinishedFlag.ref();
|
||||
emit finished();
|
||||
|
||||
{
|
||||
QMutexLocker _( &dataMutex );
|
||||
isFinishedFlag.ref();
|
||||
|
||||
cond.wakeAll();
|
||||
}
|
||||
emit finished();
|
||||
}
|
||||
}
|
||||
|
||||
void Request::setErrorString( QString const & str )
|
||||
|
|
|
@ -403,6 +403,9 @@ public:
|
|||
|
||||
int getIndexingFtsProgress()
|
||||
{
|
||||
if ( haveFTSIndex() ) {
|
||||
return 100;
|
||||
}
|
||||
auto total = getArticleCount();
|
||||
if ( total == 0 )
|
||||
return 0;
|
||||
|
|
|
@ -62,9 +62,8 @@ bool connectToServer( QTcpSocket & socket, QString const & url, QString & errorS
|
|||
return false;
|
||||
|
||||
socket.connectToHost( serverUrl.host(), port );
|
||||
|
||||
if ( socket.state() != QTcpSocket::ConnectedState ) {
|
||||
if ( !socket.waitForConnected( 5000 ) )
|
||||
if ( !socket.waitForConnected( 2000 ) )
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -197,6 +196,25 @@ public:
|
|||
strategies = strategies_.split( QRegularExpression( "[ ,;]" ), Qt::SkipEmptyParts );
|
||||
if ( strategies.isEmpty() )
|
||||
strategies.append( "prefix" );
|
||||
QUrl serverUrl( url );
|
||||
quint16 port = serverUrl.port( DefaultPort );
|
||||
QString reply;
|
||||
socket.connectToHost( serverUrl.host(), port );
|
||||
connect( &socket, &QTcpSocket::connected, this, [ this ]() {
|
||||
//initialize the description.
|
||||
getServerDatabasesAfterConnect();
|
||||
} );
|
||||
connect( &socket, &QTcpSocket::stateChanged, this, []( QAbstractSocket::SocketState state ) {
|
||||
qDebug() << "socket state change: " << state;
|
||||
} );
|
||||
connect( &socket, &QTcpSocket::errorOccurred, this, []( QAbstractSocket::SocketError error ) {
|
||||
qDebug() << "socket error message: " << error;
|
||||
} );
|
||||
}
|
||||
|
||||
~DictServerDictionary() override
|
||||
{
|
||||
disconnectFromServer( socket );
|
||||
}
|
||||
|
||||
string getName() noexcept override
|
||||
|
@ -206,7 +224,7 @@ public:
|
|||
|
||||
map< Property, string > getProperties() noexcept override
|
||||
{
|
||||
return map< Property, string >();
|
||||
return {};
|
||||
}
|
||||
|
||||
unsigned long getArticleCount() noexcept override
|
||||
|
@ -239,10 +257,9 @@ protected:
|
|||
|
||||
void loadIcon() noexcept override;
|
||||
|
||||
void getServerDatabases();
|
||||
|
||||
friend class DictServerWordSearchRequest;
|
||||
friend class DictServerArticleRequest;
|
||||
void getServerDatabasesAfterConnect();
|
||||
};
|
||||
|
||||
void DictServerDictionary::loadIcon() noexcept
|
||||
|
@ -262,11 +279,6 @@ void DictServerDictionary::loadIcon() noexcept
|
|||
|
||||
QString const & DictServerDictionary::getDescription()
|
||||
{
|
||||
if ( serverDatabases.isEmpty() ) {
|
||||
dictionaryDescription.clear();
|
||||
getServerDatabases();
|
||||
}
|
||||
|
||||
if ( dictionaryDescription.isEmpty() ) {
|
||||
dictionaryDescription = QCoreApplication::translate( "DictServer", "Url: " ) + url + "\n";
|
||||
dictionaryDescription += QCoreApplication::translate( "DictServer", "Databases: " ) + databases.join( ", " ) + "\n";
|
||||
|
@ -283,23 +295,18 @@ QString const & DictServerDictionary::getDescription()
|
|||
return dictionaryDescription;
|
||||
}
|
||||
|
||||
void DictServerDictionary::getServerDatabases()
|
||||
void DictServerDictionary::getServerDatabasesAfterConnect()
|
||||
{
|
||||
QAtomicInt isCancelled;
|
||||
QTcpSocket * socket = new QTcpSocket;
|
||||
|
||||
if ( !socket )
|
||||
return;
|
||||
|
||||
if ( connectToServer( *socket, url, errorString, isCancelled ) ) {
|
||||
for ( ;; ) {
|
||||
QString req = QString( "SHOW DB\r\n" );
|
||||
socket->write( req.toUtf8() );
|
||||
socket->waitForBytesWritten( 1000 );
|
||||
socket.write( req.toUtf8() );
|
||||
socket.waitForBytesWritten( 1000 );
|
||||
|
||||
QString reply;
|
||||
|
||||
if ( !readLine( *socket, reply, errorString, isCancelled ) )
|
||||
if ( !readLine( socket, reply, errorString, isCancelled ) )
|
||||
return;
|
||||
|
||||
if ( reply.left( 3 ) == "110" ) {
|
||||
|
@ -309,7 +316,7 @@ void DictServerDictionary::getServerDatabases()
|
|||
|
||||
// Read databases
|
||||
for ( int x = 0; x < count; x++ ) {
|
||||
if ( !readLine( *socket, reply, errorString, isCancelled ) )
|
||||
if ( !readLine( socket, reply, errorString, isCancelled ) )
|
||||
break;
|
||||
|
||||
if ( reply[ 0 ] == '.' )
|
||||
|
@ -329,12 +336,6 @@ void DictServerDictionary::getServerDatabases()
|
|||
break;
|
||||
}
|
||||
}
|
||||
disconnectFromServer( *socket );
|
||||
}
|
||||
|
||||
if ( !errorString.isEmpty() )
|
||||
gdWarning( "Retrieving databases from \"%s\" fault: %s\n", getName().c_str(), errorString.toUtf8().data() );
|
||||
delete socket;
|
||||
}
|
||||
|
||||
class DictServerWordSearchRequest: public Dictionary::WordSearchRequest
|
||||
|
@ -482,7 +483,7 @@ void DictServerWordSearchRequest::run()
|
|||
if ( count ) {
|
||||
QMutexLocker _( &dataMutex );
|
||||
for ( int x = 0; x < count; x++ )
|
||||
matches.push_back( gd::toWString( matchesList.at( x ) ) );
|
||||
matches.emplace_back( gd::toWString( matchesList.at( x ) ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -496,6 +497,7 @@ void DictServerWordSearchRequest::run()
|
|||
disconnectFromServer( *socket );
|
||||
|
||||
delete socket;
|
||||
socket = nullptr;
|
||||
if ( !Utils::AtomicInt::loadAcquire( isCancelled ) )
|
||||
finish();
|
||||
}
|
||||
|
@ -503,8 +505,6 @@ void DictServerWordSearchRequest::run()
|
|||
void DictServerWordSearchRequest::cancel()
|
||||
{
|
||||
isCancelled.ref();
|
||||
|
||||
QMutexLocker _( &dataMutex );
|
||||
finish();
|
||||
}
|
||||
|
||||
|
@ -793,6 +793,7 @@ void DictServerArticleRequest::run()
|
|||
disconnectFromServer( *socket );
|
||||
|
||||
delete socket;
|
||||
socket = nullptr;
|
||||
if ( !Utils::AtomicInt::loadAcquire( isCancelled ) )
|
||||
finish();
|
||||
}
|
||||
|
@ -801,12 +802,10 @@ void DictServerArticleRequest::cancel()
|
|||
{
|
||||
isCancelled.ref();
|
||||
|
||||
QMutexLocker _( &dataMutex );
|
||||
finish();
|
||||
}
|
||||
|
||||
sptr< WordSearchRequest > DictServerDictionary::prefixMatch( wstring const & word, unsigned long maxResults )
|
||||
|
||||
{
|
||||
(void)maxResults;
|
||||
if ( word.size() > 80 ) {
|
||||
|
|
|
@ -163,17 +163,13 @@ class DslDictionary: public BtreeIndexing::BtreeDictionary
|
|||
|
||||
int optionalPartNom;
|
||||
quint8 articleNom;
|
||||
int maxPictureWidth;
|
||||
|
||||
wstring currentHeadword;
|
||||
string resourceDir1, resourceDir2;
|
||||
|
||||
public:
|
||||
|
||||
DslDictionary( string const & id,
|
||||
string const & indexFile,
|
||||
vector< string > const & dictionaryFiles,
|
||||
int maxPictureWidth_ );
|
||||
DslDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles );
|
||||
|
||||
void deferredInit() override;
|
||||
|
||||
|
@ -285,18 +281,14 @@ private:
|
|||
friend class DslFTSResultsRequest;
|
||||
};
|
||||
|
||||
DslDictionary::DslDictionary( string const & id,
|
||||
string const & indexFile,
|
||||
vector< string > const & dictionaryFiles,
|
||||
int maxPictureWidth_ ):
|
||||
DslDictionary::DslDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles ):
|
||||
BtreeDictionary( id, dictionaryFiles ),
|
||||
idx( indexFile, "rb" ),
|
||||
idxHeader( idx.read< IdxHeader >() ),
|
||||
dz( 0 ),
|
||||
deferredInitRunnableStarted( false ),
|
||||
optionalPartNom( 0 ),
|
||||
articleNom( 0 ),
|
||||
maxPictureWidth( maxPictureWidth_ )
|
||||
articleNom( 0 )
|
||||
{
|
||||
|
||||
ftsIdxName = indexFile + Dictionary::getFtsSuffix();
|
||||
|
@ -840,61 +832,10 @@ string DslDictionary::nodeToHtml( ArticleDom::Node const & node )
|
|||
url.setHost( QString::fromUtf8( getId().c_str() ) );
|
||||
url.setPath( Utils::Url::ensureLeadingSlash( QString::fromUtf8( filename.c_str() ) ) );
|
||||
|
||||
vector< char > imgdata;
|
||||
bool resize = false;
|
||||
string maxWidthStyle = " style=\"max-width:100%;\" ";
|
||||
|
||||
try {
|
||||
File::loadFromFile( n, imgdata );
|
||||
}
|
||||
catch ( File::exCantOpen & ) {
|
||||
try {
|
||||
n = resourceDir2 + filename;
|
||||
File::loadFromFile( n, imgdata );
|
||||
}
|
||||
catch ( File::exCantOpen & ) {
|
||||
try {
|
||||
n = getContainingFolder().toStdString() + Utils::Fs::separator() + filename;
|
||||
File::loadFromFile( n, imgdata );
|
||||
}
|
||||
catch ( File::exCantOpen & ) {
|
||||
// Try reading from zip file
|
||||
if ( resourceZip.isOpen() ) {
|
||||
QMutexLocker _( &resourceZipMutex );
|
||||
resourceZip.loadFile( Utf8::decode( filename ), imgdata );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( ... ) {
|
||||
}
|
||||
|
||||
if ( !imgdata.empty() ) {
|
||||
if ( Filetype::isNameOfSvg( filename ) ) {
|
||||
// We don't need to render svg file now
|
||||
|
||||
QSvgRenderer svg;
|
||||
svg.load( QByteArray::fromRawData( imgdata.data(), imgdata.size() ) );
|
||||
if ( svg.isValid() ) {
|
||||
QSize imgsize = svg.defaultSize();
|
||||
resize = maxPictureWidth > 0 && imgsize.width() > maxPictureWidth;
|
||||
}
|
||||
}
|
||||
else {
|
||||
QImage img = QImage::fromData( (unsigned char *)&imgdata.front(), imgdata.size() );
|
||||
|
||||
resize = maxPictureWidth > 0 && img.width() > maxPictureWidth;
|
||||
}
|
||||
}
|
||||
|
||||
if ( resize ) {
|
||||
string link( url.toEncoded().data() );
|
||||
link.replace( 0, 4, "gdpicture" );
|
||||
result += string( "<a href=\"" ) + link + "\">" + "<img src=\"" + url.toEncoded().data() + "\" alt=\""
|
||||
+ Html::escape( filename ) + "\"" + "width=\"" + QString::number( maxPictureWidth ).toStdString() + "\"/>"
|
||||
+ "</a>";
|
||||
}
|
||||
else
|
||||
result += string( "<img src=\"" ) + url.toEncoded().data() + "\" alt=\"" + Html::escape( filename ) + "\"/>";
|
||||
result += string( "<img src=\"" ) + url.toEncoded().data() + "\" " + maxWidthStyle + " alt=\""
|
||||
+ Html::escape( filename ) + "\"/>";
|
||||
}
|
||||
else if ( Filetype::isNameOfVideo( filename ) ) {
|
||||
QUrl url;
|
||||
|
@ -1126,14 +1067,15 @@ QString DslDictionary::getMainFilename()
|
|||
void DslDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration )
|
||||
{
|
||||
if ( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName )
|
||||
|| FtsHelpers::ftsIndexIsOldOrBad( this ) ) )
|
||||
|| FtsHelpers::ftsIndexIsOldOrBad( this ) ) ) {
|
||||
FTS_index_completed.ref();
|
||||
}
|
||||
|
||||
|
||||
if ( haveFTSIndex() )
|
||||
return;
|
||||
|
||||
if ( ensureInitDone().size() )
|
||||
if ( !ensureInitDone().empty() )
|
||||
return;
|
||||
|
||||
if ( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch )
|
||||
|
@ -1209,10 +1151,11 @@ void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword,
|
|||
size_t begin = pos;
|
||||
|
||||
pos = articleData.find_first_of( U"\n\r", begin );
|
||||
if ( pos == wstring::npos )
|
||||
pos = articleData.size();
|
||||
|
||||
if ( articleHeadword.empty() ) {
|
||||
// Process the headword
|
||||
|
||||
articleHeadword = wstring( articleData, begin, pos - begin );
|
||||
|
||||
if ( insidedCard && !articleHeadword.empty() && isDslWs( articleHeadword[ 0 ] ) ) {
|
||||
|
@ -1254,12 +1197,12 @@ void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword,
|
|||
if ( articleData[ pos ] == '\r' )
|
||||
++pos;
|
||||
|
||||
if ( pos != articleData.size() ) {
|
||||
if ( pos < articleData.size() ) {
|
||||
if ( articleData[ pos ] == '\n' )
|
||||
++pos;
|
||||
}
|
||||
|
||||
if ( pos == articleData.size() ) {
|
||||
if ( pos >= articleData.size() ) {
|
||||
// Ok, it's end of article
|
||||
break;
|
||||
}
|
||||
|
@ -1704,7 +1647,6 @@ sptr< Dictionary::DataRequest > DslDictionary::getSearchResults( QString const &
|
|||
vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames,
|
||||
string const & indicesDir,
|
||||
Dictionary::Initializing & initializing,
|
||||
int maxPictureWidth,
|
||||
unsigned int maxHeadwordSize )
|
||||
|
||||
{
|
||||
|
@ -2164,7 +2106,7 @@ vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & f
|
|||
|
||||
} // if need to rebuild
|
||||
|
||||
dictionaries.push_back( std::make_shared< DslDictionary >( dictId, indexFile, dictFiles, maxPictureWidth ) );
|
||||
dictionaries.push_back( std::make_shared< DslDictionary >( dictId, indexFile, dictFiles ) );
|
||||
}
|
||||
catch ( std::exception & e ) {
|
||||
gdWarning( "DSL dictionary reading failed: %s:%u, error: %s\n", fileName.c_str(), atLine, e.what() );
|
||||
|
|
|
@ -15,7 +15,6 @@ using std::string;
|
|||
vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames,
|
||||
string const & indicesDir,
|
||||
Dictionary::Initializing &,
|
||||
int maxPictureWidth,
|
||||
unsigned int maxHeadwordSize );
|
||||
|
||||
} // namespace Dsl
|
||||
|
|
|
@ -899,7 +899,7 @@ EB_Error_Code EpwingBook::forwardText( EB_Position & startPos )
|
|||
ret = eb_forward_text( &book, &appendix );
|
||||
while ( ret != EB_SUCCESS ) {
|
||||
|
||||
if ( startPos.page >= book.subbook_current->text.end_page )
|
||||
if ( ret == EB_ERR_END_OF_CONTENT || startPos.page >= book.subbook_current->text.end_page )
|
||||
return EB_ERR_END_OF_CONTENT;
|
||||
|
||||
const auto offset = startPos.offset + 2;
|
||||
|
|
|
@ -58,7 +58,6 @@ LoadDictionaries::LoadDictionaries( Config::Class const & cfg ):
|
|||
hunspell( cfg.hunspell ),
|
||||
transliteration( cfg.transliteration ),
|
||||
exceptionText( "Load did not finish" ), // Will be cleared upon success
|
||||
maxPictureWidth( cfg.maxPictureWidth ),
|
||||
maxHeadwordSize( cfg.maxHeadwordSize ),
|
||||
maxHeadwordToExpand( cfg.maxHeadwordsToExpand )
|
||||
{
|
||||
|
@ -167,8 +166,7 @@ void LoadDictionaries::handlePath( Config::Path const & path )
|
|||
addDicts( Bgl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
|
||||
addDicts( Stardict::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordToExpand ) );
|
||||
addDicts( Lsa::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
|
||||
addDicts(
|
||||
Dsl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxPictureWidth, maxHeadwordSize ) );
|
||||
addDicts( Dsl::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this, maxHeadwordSize ) );
|
||||
addDicts( DictdFiles::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
|
||||
addDicts( Xdxf::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
|
||||
addDicts( Sdict::makeDictionaries( allFiles, Config::getIndexDir().toStdString(), *this ) );
|
||||
|
|
|
@ -23,7 +23,6 @@ class LoadDictionaries: public QThread, public Dictionary::Initializing
|
|||
Config::Transliteration const & transliteration;
|
||||
std::vector< sptr< Dictionary::Class > > dictionaries;
|
||||
std::string exceptionText;
|
||||
int maxPictureWidth;
|
||||
unsigned int maxHeadwordSize;
|
||||
unsigned int maxHeadwordToExpand;
|
||||
|
||||
|
|
|
@ -749,18 +749,6 @@ void MddResourceRequest::run()
|
|||
const QString id = QString::fromUtf8( dict.getId().c_str() );
|
||||
|
||||
const QString unique_key = id + QString::fromStdString( u8ResourceName );
|
||||
if ( GlobalBroadcaster::instance()->cache.contains( unique_key ) ) {
|
||||
//take first ,then insert again . the object() method may become null anytime.
|
||||
auto bytes = GlobalBroadcaster::instance()->cache.take( unique_key );
|
||||
if ( bytes ) {
|
||||
hasAnyData = true;
|
||||
data.resize( bytes->size() );
|
||||
memcpy( &data.front(), bytes->constData(), bytes->size() );
|
||||
GlobalBroadcaster::instance()->insertCache( unique_key, bytes );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
dict.loadResourceFile( resourceName, data );
|
||||
|
||||
|
@ -789,8 +777,6 @@ void MddResourceRequest::run()
|
|||
|
||||
data.resize( bytes.size() );
|
||||
memcpy( &data.front(), bytes.constData(), bytes.size() );
|
||||
//cache the processed css result to avoid process again.
|
||||
GlobalBroadcaster::instance()->insertCache( unique_key, new QByteArray( bytes ) );
|
||||
}
|
||||
if ( Filetype::isNameOfTiff( u8ResourceName ) ) {
|
||||
// Convert it
|
||||
|
@ -908,7 +894,7 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
|
|||
QString linkType = allLinksMatch.captured( 1 ).toLower();
|
||||
QString newLink;
|
||||
|
||||
if ( !linkType.isEmpty() && linkType.at( 0 ) == 'a' ) {
|
||||
if ( linkType.compare( "a" ) == 0 || linkType.compare( "area" ) == 0 ) {
|
||||
newLink = linkTxt;
|
||||
|
||||
QRegularExpressionMatch match = RX::Mdx::audioRe.match( newLink );
|
||||
|
@ -956,12 +942,12 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
|
|||
else
|
||||
newLink = linkTxt.replace( RX::Mdx::stylesRe2, R"(\1"bres://)" + id + R"(/\2")" );
|
||||
}
|
||||
else if ( linkType.compare( "script" ) == 0 || linkType.compare( "img" ) == 0
|
||||
|| linkType.compare( "source" ) == 0 ) {
|
||||
else {
|
||||
//linkType in ("script","img","source","audio","video")
|
||||
// javascripts and images
|
||||
QRegularExpressionMatch match = RX::Mdx::inlineScriptRe.match( linkTxt );
|
||||
if ( linkType.at( 1 ) == 'c' // "script" tag
|
||||
&& match.hasMatch() && match.capturedLength() == linkTxt.length() ) {
|
||||
// "script" tag
|
||||
if ( linkType.compare( "script" ) == 0 && match.hasMatch() && match.capturedLength() == linkTxt.length() ) {
|
||||
// skip inline scripts
|
||||
articleNewText += linkTxt;
|
||||
match = RX::Mdx::closeScriptTagRe.match( article, linkPos );
|
||||
|
@ -972,26 +958,28 @@ void MdxDictionary::replaceLinks( QString & id, QString & article )
|
|||
continue;
|
||||
}
|
||||
else {
|
||||
//audio ,video ,html5 tags fall here.
|
||||
match = RX::Mdx::srcRe.match( linkTxt );
|
||||
if ( match.hasMatch() ) {
|
||||
QString newText;
|
||||
if ( linkType.at( 1 ) == 'o' ) // "source" tag
|
||||
{
|
||||
QString filename = match.captured( 3 );
|
||||
QString newName = getCachedFileName( filename );
|
||||
newName.replace( '\\', '/' );
|
||||
newText = match.captured( 1 ) + match.captured( 2 ) + "file:///" + newName + match.captured( 2 );
|
||||
QString scheme;
|
||||
// "source" tag
|
||||
if ( linkType.compare( "source" ) == 0 ) {
|
||||
scheme = "gdvideo://";
|
||||
}
|
||||
else {
|
||||
newText = match.captured( 1 ) + match.captured( 2 ) + "bres://" + id + "/" + match.captured( 3 )
|
||||
+ match.captured( 2 );
|
||||
scheme = "bres://";
|
||||
}
|
||||
newText =
|
||||
match.captured( 1 ) + match.captured( 2 ) + scheme + id + "/" + match.captured( 3 ) + match.captured( 2 );
|
||||
|
||||
newLink = linkTxt.replace( match.capturedStart(), match.capturedLength(), newText );
|
||||
}
|
||||
else
|
||||
newLink = linkTxt.replace( RX::Mdx::srcRe2, R"(\1"bres://)" + id + R"(/\2")" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !newLink.isEmpty() ) {
|
||||
articleNewText += newLink;
|
||||
}
|
||||
|
|
|
@ -137,7 +137,10 @@ MediaWikiWordSearchRequest::MediaWikiWordSearchRequest( wstring const & str,
|
|||
|
||||
Utils::Url::addQueryItem( reqUrl, "apprefix", QString::fromStdU32String( str ).replace( '+', "%2B" ) );
|
||||
|
||||
netReply = std::shared_ptr< QNetworkReply >( mgr.get( QNetworkRequest( reqUrl ) ) );
|
||||
QNetworkRequest req( reqUrl );
|
||||
//millseconds.
|
||||
req.setTransferTimeout( 2000 );
|
||||
netReply = std::shared_ptr< QNetworkReply >( mgr.get( req ) );
|
||||
|
||||
connect( netReply.get(), SIGNAL( finished() ), this, SLOT( downloadFinished() ) );
|
||||
|
||||
|
|
|
@ -26,13 +26,15 @@ const static std::string finish_mark = std::string( "dehsinif" );
|
|||
bool ftsIndexIsOldOrBad( BtreeIndexing::BtreeDictionary * dict )
|
||||
{
|
||||
try {
|
||||
Xapian::WritableDatabase db( dict->ftsIndexName() );
|
||||
Xapian::WritableDatabase const db( dict->ftsIndexName() );
|
||||
auto docid = db.get_lastdocid();
|
||||
auto document = db.get_document( docid );
|
||||
|
||||
qDebug() << document.get_data().c_str();
|
||||
string const lastDoc = document.get_data();
|
||||
bool const notFinished = lastDoc != finish_mark;
|
||||
qDebug() << dict->ftsIndexName().c_str() << document.get_data().c_str() << notFinished;
|
||||
//use a special document to mark the end of the index.
|
||||
return document.get_data() != finish_mark;
|
||||
return notFinished;
|
||||
}
|
||||
catch ( Xapian::Error & e ) {
|
||||
qWarning() << e.get_description().c_str();
|
||||
|
@ -47,7 +49,7 @@ bool ftsIndexIsOldOrBad( BtreeIndexing::BtreeDictionary * dict )
|
|||
|
||||
void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancelled )
|
||||
{
|
||||
QMutexLocker _( &dict->getFtsMutex() );
|
||||
QMutexLocker const _( &dict->getFtsMutex() );
|
||||
|
||||
//check the index again.
|
||||
if ( dict->haveFTSIndex() )
|
||||
|
@ -78,7 +80,7 @@ void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancell
|
|||
|
||||
QVector< uint32_t > offsets;
|
||||
offsets.resize( setOfOffsets.size() );
|
||||
uint32_t * ptr = &offsets.front();
|
||||
uint32_t * ptr = offsets.data();
|
||||
|
||||
for ( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); it != setOfOffsets.constEnd(); ++it ) {
|
||||
*ptr = *it;
|
||||
|
|
|
@ -40,7 +40,9 @@ void Indexing::run()
|
|||
sem.acquire();
|
||||
QFuture< void > const f = QtConcurrent::run( [ this, &sem, &dictionary ]() {
|
||||
QSemaphoreReleaser const _( sem );
|
||||
emit sendNowIndexingName( QString::fromUtf8( dictionary->getName().c_str() ) );
|
||||
const QString & dictionaryName = QString::fromUtf8( dictionary->getName().c_str() );
|
||||
qDebug() << "[FULLTEXT] checking fts for the dictionary:" << dictionaryName;
|
||||
emit sendNowIndexingName( dictionaryName );
|
||||
dictionary->makeFTSIndex( isCancelled, false );
|
||||
} );
|
||||
synchronizer.addFuture( f );
|
||||
|
@ -60,18 +62,26 @@ void Indexing::run()
|
|||
|
||||
void Indexing::timeout()
|
||||
{
|
||||
//display all the dictionary name in the following loop ,may result only one dictionary name been seen.
|
||||
//as the interval is so small.
|
||||
QString indexingDicts;
|
||||
for ( const auto & dictionary : dictionaries ) {
|
||||
if ( Utils::AtomicInt::loadAcquire( isCancelled ) )
|
||||
break;
|
||||
|
||||
//Finished, clear the msg.
|
||||
if ( dictionary->haveFTSIndex() ) {
|
||||
continue;
|
||||
}
|
||||
auto newProgress = dictionary->getIndexingFtsProgress();
|
||||
if ( newProgress > 0 && newProgress < 100 ) {
|
||||
emit sendNowIndexingName(
|
||||
if ( !indexingDicts.isEmpty() )
|
||||
indexingDicts.append( "," );
|
||||
indexingDicts.append(
|
||||
QString( "%1......%%2" ).arg( QString::fromStdString( dictionary->getName() ) ).arg( newProgress ) );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !indexingDicts.isEmpty() ) {
|
||||
emit sendNowIndexingName( indexingDicts );
|
||||
}
|
||||
}
|
||||
|
||||
FtsIndexing::FtsIndexing( std::vector< sptr< Dictionary::Class > > const & dicts ):
|
||||
|
|
|
@ -65,24 +65,19 @@ History::Item History::getItem( int index )
|
|||
|
||||
void History::addItem( Item const & item )
|
||||
{
|
||||
// qDebug() << "adding item " << item.word << ", enabled=" << enabled();
|
||||
if ( !enabled() )
|
||||
return;
|
||||
|
||||
if ( (unsigned)item.word.size() > getMaxItemLength() || item.word.isEmpty() ) {
|
||||
if ( item.word.isEmpty() ) {
|
||||
// The search looks bogus. Don't save it.
|
||||
return;
|
||||
}
|
||||
|
||||
//from the normal operation ,there should be only one item in the history at a time.
|
||||
if ( items.contains( item ) )
|
||||
items.removeAll( item );
|
||||
|
||||
// Special case: if this items differs from the previous one only by group,
|
||||
// remove it too.
|
||||
|
||||
if ( items.size() && items.first().word == item.word )
|
||||
items.pop_front();
|
||||
items.removeOne( item );
|
||||
|
||||
//TODO : The groupid has not used at all.
|
||||
items.push_front( item );
|
||||
|
||||
ensureSizeConstraints();
|
||||
|
|
12
src/main.cc
12
src/main.cc
|
@ -311,11 +311,14 @@ int main( int argc, char ** argv )
|
|||
// GoldenDict use lots of X11 functions and it currently cannot work
|
||||
// natively on Wayland. This workaround will force GoldenDict to use
|
||||
// XWayland.
|
||||
|
||||
if ( qEnvironmentVariableIsEmpty( "GOLDENDICT_FORCE_WAYLAND" ) ) {
|
||||
char * xdg_envc = getenv( "XDG_SESSION_TYPE" );
|
||||
QString xdg_session = xdg_envc ? QString::fromLatin1( xdg_envc ) : QString();
|
||||
if ( !QString::compare( xdg_session, QString( "wayland" ), Qt::CaseInsensitive ) ) {
|
||||
setenv( "QT_QPA_PLATFORM", "xcb", 1 );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
|
@ -405,12 +408,13 @@ int main( int argc, char ** argv )
|
|||
#endif
|
||||
|
||||
const QStringList localSchemes =
|
||||
{ "gdlookup", "gdau", "gico", "qrcx", "bres", "bword", "gdprg", "gdvideo", "gdpicture", "gdtts", "ifr", "entry" };
|
||||
{ "gdlookup", "gdau", "gico", "qrcx", "bres", "bword", "gdprg", "gdvideo", "gdtts", "ifr", "entry" };
|
||||
|
||||
for ( const auto & localScheme : localSchemes ) {
|
||||
QWebEngineUrlScheme webUiScheme( localScheme.toLatin1() );
|
||||
webUiScheme.setFlags( QWebEngineUrlScheme::SecureScheme | QWebEngineUrlScheme::LocalScheme
|
||||
| QWebEngineUrlScheme::LocalAccessAllowed | QWebEngineUrlScheme::CorsEnabled );
|
||||
webUiScheme.setSyntax( QWebEngineUrlScheme::Syntax::Host );
|
||||
webUiScheme.setFlags( QWebEngineUrlScheme::LocalScheme | QWebEngineUrlScheme::LocalAccessAllowed
|
||||
| QWebEngineUrlScheme::CorsEnabled );
|
||||
QWebEngineUrlScheme::registerScheme( webUiScheme );
|
||||
}
|
||||
|
||||
|
@ -534,7 +538,7 @@ int main( int argc, char ** argv )
|
|||
auto font = QApplication::font();
|
||||
if ( !cfg.preferences.interfaceFont.isEmpty() && font.family() != cfg.preferences.interfaceFont ) {
|
||||
font.setFamily( cfg.preferences.interfaceFont );
|
||||
app.setFont( font );
|
||||
QApplication::setFont( font );
|
||||
}
|
||||
|
||||
QLocale locale( localeName );
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
#if ( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) )
|
||||
#include <QMediaContent>
|
||||
#endif
|
||||
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
|
||||
#include <QAudioDevice>
|
||||
#endif
|
||||
#include "multimediaaudioplayer.hh"
|
||||
|
||||
MultimediaAudioPlayer::MultimediaAudioPlayer()
|
||||
|
@ -26,6 +29,15 @@ MultimediaAudioPlayer::MultimediaAudioPlayer()
|
|||
|
||||
connect( &player, &QMediaPlayer::errorChanged, this, &MultimediaAudioPlayer::onMediaPlayerError );
|
||||
#endif
|
||||
|
||||
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
|
||||
connect( &mediaDevices, &QMediaDevices::audioOutputsChanged, this, &MultimediaAudioPlayer::audioOutputChange );
|
||||
#endif
|
||||
}
|
||||
|
||||
void MultimediaAudioPlayer::audioOutputChange()
|
||||
{
|
||||
qDebug() << "audio device changed";
|
||||
}
|
||||
|
||||
QString MultimediaAudioPlayer::play( const char * data, int size )
|
||||
|
@ -37,11 +49,15 @@ QString MultimediaAudioPlayer::play( const char * data, int size )
|
|||
return tr( "Couldn't open audio buffer for reading." );
|
||||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
|
||||
player.setSourceDevice( audioBuffer );
|
||||
#if ( QT_VERSION > QT_VERSION_CHECK( 6, 2, 0 ) )
|
||||
audioOutput.setDevice( QMediaDevices::defaultAudioOutput() );
|
||||
player.setAudioOutput( &audioOutput );
|
||||
#endif
|
||||
#else
|
||||
player.setMedia( QMediaContent(), audioBuffer );
|
||||
#endif
|
||||
player.play();
|
||||
return QString();
|
||||
return {};
|
||||
}
|
||||
|
||||
void MultimediaAudioPlayer::stop()
|
||||
|
|
|
@ -12,6 +12,9 @@
|
|||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
|
||||
#include <QAudioOutput>
|
||||
#endif
|
||||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) )
|
||||
#include <QMediaDevices>
|
||||
#endif
|
||||
#include <QPointer>
|
||||
|
||||
class MultimediaAudioPlayer: public AudioPlayerInterface
|
||||
|
@ -26,13 +29,18 @@ public:
|
|||
|
||||
private slots:
|
||||
void onMediaPlayerError();
|
||||
void audioOutputChange();
|
||||
|
||||
|
||||
private:
|
||||
QPointer< QBuffer > audioBuffer;
|
||||
QMediaPlayer player; ///< Depends on audioBuffer.
|
||||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
|
||||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) )
|
||||
QAudioOutput audioOutput;
|
||||
#endif
|
||||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) )
|
||||
QMediaDevices mediaDevices;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // MAKE_QTMULTIMEDIA_PLAYER
|
||||
|
|
|
@ -7,26 +7,46 @@ ResourceSchemeHandler::ResourceSchemeHandler( ArticleNetworkAccessManager & arti
|
|||
}
|
||||
void ResourceSchemeHandler::requestStarted( QWebEngineUrlRequestJob * requestJob )
|
||||
{
|
||||
QUrl url = requestJob->requestUrl();
|
||||
const QUrl url = requestJob->requestUrl();
|
||||
QString content_type;
|
||||
const QMimeType mineType = db.mimeTypeForUrl( url );
|
||||
const sptr< Dictionary::DataRequest > reply = this->mManager.getResource( url, content_type );
|
||||
content_type = mineType.name();
|
||||
if ( reply->isFinished() ) {
|
||||
replyJob( reply, requestJob, content_type );
|
||||
}
|
||||
else
|
||||
connect( reply.get(), &Dictionary::DataRequest::finished, requestJob, [ = ]() {
|
||||
replyJob( reply, requestJob, content_type );
|
||||
} );
|
||||
}
|
||||
|
||||
QNetworkRequest request;
|
||||
request.setUrl( url );
|
||||
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
|
||||
QNetworkReply * reply = this->mManager.getArticleReply( request );
|
||||
connect( reply, &QNetworkReply::finished, requestJob, [ = ]() {
|
||||
if ( reply->error() == QNetworkReply::ContentNotFoundError ) {
|
||||
|
||||
void ResourceSchemeHandler::replyJob( sptr< Dictionary::DataRequest > reply,
|
||||
QWebEngineUrlRequestJob * requestJob,
|
||||
QString content_type )
|
||||
{
|
||||
if ( !reply.get() ) {
|
||||
requestJob->fail( QWebEngineUrlRequestJob::UrlNotFound );
|
||||
return;
|
||||
}
|
||||
if ( reply->error() != QNetworkReply::NoError ) {
|
||||
qDebug() << "resource handler failed:" << reply->error() << ":" << reply->request().url();
|
||||
requestJob->fail( QWebEngineUrlRequestJob::RequestFailed );
|
||||
const auto & data = reply->getFullData();
|
||||
if ( data.empty() ) {
|
||||
requestJob->fail( QWebEngineUrlRequestJob::UrlNotFound );
|
||||
return;
|
||||
}
|
||||
QMimeType mineType = db.mimeTypeForUrl( url );
|
||||
QString contentType = mineType.name();
|
||||
QByteArray * ba = new QByteArray( data.data(), data.size() );
|
||||
QBuffer * buffer = new QBuffer( ba );
|
||||
buffer->open( QBuffer::ReadOnly );
|
||||
buffer->seek( 0 );
|
||||
|
||||
// Reply segment
|
||||
requestJob->reply( contentType.toLatin1(), reply );
|
||||
requestJob->reply( content_type.toLatin1(), buffer );
|
||||
|
||||
connect( requestJob, &QObject::destroyed, buffer, [ = ]() {
|
||||
buffer->close();
|
||||
ba->clear();
|
||||
delete ba;
|
||||
buffer->deleteLater();
|
||||
} );
|
||||
connect( requestJob, &QObject::destroyed, reply, &QObject::deleteLater );
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ public:
|
|||
void requestStarted( QWebEngineUrlRequestJob * requestJob );
|
||||
|
||||
protected:
|
||||
void replyJob( sptr< Dictionary::DataRequest > reply, QWebEngineUrlRequestJob * requestJob, QString content_type );
|
||||
|
||||
private:
|
||||
ArticleNetworkAccessManager & mManager;
|
||||
|
|
|
@ -1068,22 +1068,6 @@ div.xdxf {
|
|||
}
|
||||
/* the left column width is specified in class .portlet */
|
||||
|
||||
/* Font size:
|
||||
** We take advantage of keyword scaling- browsers won't go below 9px
|
||||
** More at http://www.w3.org/2003/07/30-font-size
|
||||
** http://style.cleverchimp.com/font_size_intervals/altintervals.html
|
||||
*/
|
||||
|
||||
/*
|
||||
body {
|
||||
font: x-small sans-serif;
|
||||
background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
|
||||
color: black;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/* scale back up to a sane default */
|
||||
.mwiki #globalWrapper {
|
||||
font-size: 127%;
|
||||
|
@ -1220,7 +1204,6 @@ body {
|
|||
list-style-type: square;
|
||||
margin: 0.3em 0 0 1.5em;
|
||||
padding: 0;
|
||||
list-style-image: url(bullet.gif);
|
||||
}
|
||||
.mwiki ol {
|
||||
line-height: 1.5em;
|
||||
|
@ -1614,38 +1597,7 @@ in the bottom-right corner of the content area */
|
|||
** keep the whitespace in front of the ^=, hides rule from konqueror
|
||||
** this is css3, the validator doesn't like it when validating as css2
|
||||
*/
|
||||
.mwiki #bodyContent a.external,
|
||||
.mwiki #bodyContent a[href ^="gopher://"]
|
||||
{
|
||||
background: url(external.png) center right no-repeat;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="https://"],
|
||||
.mwiki .link-https {
|
||||
background: url(lock_icon.gif) center right no-repeat;
|
||||
padding-right: 16px;
|
||||
}
|
||||
.mwiki #bodyContent a[href^="mailto:"],
|
||||
.mwiki .link-mailto {
|
||||
background: url(mail_icon.gif) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="news://"]
|
||||
{
|
||||
background: url(news_icon.png) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="ftp://"],
|
||||
.mwiki .link-ftp {
|
||||
background: url(file_icon.gif) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="irc://"],
|
||||
.mwiki #bodyContent a.extiw[href ^="irc://"],
|
||||
.mwiki .link-irc {
|
||||
background: url(discussionitem_icon.gif) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
|
||||
.mwiki #bodyContent a.external[href$=".ogg"],
|
||||
.mwiki #bodyContent a.external[href$=".OGG"],
|
||||
.mwiki #bodyContent a.external[href$=".oga"],
|
||||
|
@ -1661,7 +1613,7 @@ in the bottom-right corner of the content area */
|
|||
.mwiki #bodyContent a.external[href$=".wma"],
|
||||
.mwiki #bodyContent a.external[href$=".WMA"],
|
||||
.mwiki .link-audio {
|
||||
background: url("audio.png") center right no-repeat;
|
||||
background: url("qrc:///icons/audio.png") center right no-repeat;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.mwiki #bodyContent a.external[href$=".ogm"],
|
||||
|
@ -1673,7 +1625,7 @@ in the bottom-right corner of the content area */
|
|||
.mwiki #bodyContent a.external[href$=".mpg"],
|
||||
.mwiki #bodyContent a.external[href$=".MPG"],
|
||||
.mwiki .link-video {
|
||||
background: url("video.png") center right no-repeat;
|
||||
background: url("qrc:///icons/video.png") center right no-repeat;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.mwiki #bodyContent a.external[href$=".pdf"],
|
||||
|
@ -1683,7 +1635,7 @@ in the bottom-right corner of the content area */
|
|||
.mwiki #bodyContent a.external[href*=".pdf?"],
|
||||
.mwiki #bodyContent a.external[href*=".PDF?"],
|
||||
.mwiki .link-document {
|
||||
background: url("document.png") center right no-repeat;
|
||||
background: url("qrc:///icons/document.png") center right no-repeat;
|
||||
padding-right: 12px;
|
||||
}
|
||||
|
||||
|
@ -1763,7 +1715,6 @@ special external link styling */
|
|||
.mwiki .portlet ul {
|
||||
line-height: 1.5em;
|
||||
list-style-type: square;
|
||||
list-style-image: url(bullet.gif);
|
||||
font-size: 95%;
|
||||
}
|
||||
.mwiki .portlet li {
|
||||
|
@ -1899,7 +1850,6 @@ in bg url to hide it from iemac */
|
|||
.mwiki li#pt-userpage,
|
||||
.mwiki li#pt-anonuserpage,
|
||||
.mwiki li#pt-login {
|
||||
background: url(user.gif) top left no-repeat;
|
||||
padding-left: 20px;
|
||||
text-transform: none;
|
||||
}
|
||||
|
@ -2980,8 +2930,7 @@ table#sv-hooks,
|
|||
/****** Wiktionary-specific excerpts *********/
|
||||
|
||||
.mwiki .audiolink a {
|
||||
background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/16px-Loudspeaker.svg.png")
|
||||
center left no-repeat !important;
|
||||
background: url("qrc:///icons/audio.png") center left no-repeat !important;
|
||||
padding-left: 20px !important;
|
||||
padding-right: 0 !important;
|
||||
}
|
||||
|
|
|
@ -5,18 +5,20 @@ html {
|
|||
}
|
||||
|
||||
body {
|
||||
font-family:
|
||||
-apple-system,
|
||||
BlinkMacSystemFont,
|
||||
Tahoma, Verdana, "Lucida Sans Unicode","Palatino Linotype", "Arial Unicode MS",
|
||||
"Segoe UI",
|
||||
Roboto,
|
||||
Oxygen,
|
||||
Ubuntu,
|
||||
Cantarell,
|
||||
"Open Sans",
|
||||
"Helvetica Neue",
|
||||
sans-serif;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||
Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Apple Color Emoji",
|
||||
"Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
|
||||
}
|
||||
|
||||
.ipa,
|
||||
.phon,
|
||||
.phone,
|
||||
.pron,
|
||||
.audio-gb,
|
||||
.audio-us {
|
||||
font-family: "Segoe UI", "Lucida Grande", "Lucida Sans", "Droid Sans Mono",
|
||||
"Droid Sans", "Arial Unicode MS", "Charis SIL", "Open Sans", Roboto,
|
||||
Helvetica, Arial, normal;
|
||||
}
|
||||
|
||||
h1,
|
||||
|
@ -1093,12 +1095,6 @@ div.xdxf {
|
|||
font-size: smaller;
|
||||
}
|
||||
|
||||
/* feed links */
|
||||
.mwiki a.feedlink {
|
||||
background: url("images/feed-icon.png") center left no-repeat;
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
/************ monobook/main.css **************/
|
||||
|
||||
/*
|
||||
|
@ -1134,23 +1130,6 @@ div.xdxf {
|
|||
border-right: none;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
/* the left column width is specified in class .portlet */
|
||||
|
||||
/* Font size:
|
||||
** We take advantage of keyword scaling- browsers won't go below 9px
|
||||
** More at http://www.w3.org/2003/07/30-font-size
|
||||
** http://style.cleverchimp.com/font_size_intervals/altintervals.html
|
||||
*/
|
||||
|
||||
/*
|
||||
body {
|
||||
font: x-small sans-serif;
|
||||
background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
|
||||
color: black;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/* scale back up to a sane default */
|
||||
.mwiki #globalWrapper {
|
||||
|
@ -1288,7 +1267,6 @@ body {
|
|||
list-style-type: square;
|
||||
margin: 0.3em 0 0 1.5em;
|
||||
padding: 0;
|
||||
list-style-image: url(bullet.gif);
|
||||
}
|
||||
.mwiki ol {
|
||||
line-height: 1.5em;
|
||||
|
@ -1682,38 +1660,7 @@ in the bottom-right corner of the content area */
|
|||
** keep the whitespace in front of the ^=, hides rule from konqueror
|
||||
** this is css3, the validator doesn't like it when validating as css2
|
||||
*/
|
||||
.mwiki #bodyContent a.external,
|
||||
.mwiki #bodyContent a[href ^="gopher://"]
|
||||
{
|
||||
background: url(external.png) center right no-repeat;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="https://"],
|
||||
.mwiki .link-https {
|
||||
background: url(lock_icon.gif) center right no-repeat;
|
||||
padding-right: 16px;
|
||||
}
|
||||
.mwiki #bodyContent a[href^="mailto:"],
|
||||
.mwiki .link-mailto {
|
||||
background: url(mail_icon.gif) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="news://"]
|
||||
{
|
||||
background: url(news_icon.png) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="ftp://"],
|
||||
.mwiki .link-ftp {
|
||||
background: url(file_icon.gif) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
.mwiki #bodyContent a[href ^="irc://"],
|
||||
.mwiki #bodyContent a.extiw[href ^="irc://"],
|
||||
.mwiki .link-irc {
|
||||
background: url(discussionitem_icon.gif) center right no-repeat;
|
||||
padding-right: 18px;
|
||||
}
|
||||
|
||||
.mwiki #bodyContent a.external[href$=".ogg"],
|
||||
.mwiki #bodyContent a.external[href$=".OGG"],
|
||||
.mwiki #bodyContent a.external[href$=".oga"],
|
||||
|
@ -1729,7 +1676,7 @@ in the bottom-right corner of the content area */
|
|||
.mwiki #bodyContent a.external[href$=".wma"],
|
||||
.mwiki #bodyContent a.external[href$=".WMA"],
|
||||
.mwiki .link-audio {
|
||||
background: url("audio.png") center right no-repeat;
|
||||
background: url("qrc:///icons/audio.png") center right no-repeat;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.mwiki #bodyContent a.external[href$=".ogm"],
|
||||
|
@ -1741,7 +1688,7 @@ in the bottom-right corner of the content area */
|
|||
.mwiki #bodyContent a.external[href$=".mpg"],
|
||||
.mwiki #bodyContent a.external[href$=".MPG"],
|
||||
.mwiki .link-video {
|
||||
background: url("video.png") center right no-repeat;
|
||||
background: url("qrc:///icons/video.png") center right no-repeat;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.mwiki #bodyContent a.external[href$=".pdf"],
|
||||
|
@ -1751,7 +1698,7 @@ in the bottom-right corner of the content area */
|
|||
.mwiki #bodyContent a.external[href*=".pdf?"],
|
||||
.mwiki #bodyContent a.external[href*=".PDF?"],
|
||||
.mwiki .link-document {
|
||||
background: url("document.png") center right no-repeat;
|
||||
background: url("qrc:///icons/document.png") center right no-repeat;
|
||||
padding-right: 12px;
|
||||
}
|
||||
|
||||
|
@ -1831,7 +1778,6 @@ special external link styling */
|
|||
.mwiki .portlet ul {
|
||||
line-height: 1.5em;
|
||||
list-style-type: square;
|
||||
list-style-image: url(bullet.gif);
|
||||
font-size: 95%;
|
||||
}
|
||||
.mwiki .portlet li {
|
||||
|
@ -1967,7 +1913,6 @@ in bg url to hide it from iemac */
|
|||
.mwiki li#pt-userpage,
|
||||
.mwiki li#pt-anonuserpage,
|
||||
.mwiki li#pt-login {
|
||||
background: url(user.gif) top left no-repeat;
|
||||
padding-left: 20px;
|
||||
text-transform: none;
|
||||
}
|
||||
|
@ -3048,8 +2993,7 @@ table#sv-hooks,
|
|||
/****** Wiktionary-specific excerpts *********/
|
||||
|
||||
.mwiki .audiolink a {
|
||||
background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/16px-Loudspeaker.svg.png")
|
||||
center left no-repeat !important;
|
||||
background: url("qrc:///icons/audio.png") center left no-repeat !important;
|
||||
padding-left: 20px !important;
|
||||
padding-right: 0 !important;
|
||||
}
|
||||
|
@ -3073,7 +3017,7 @@ table#sv-hooks,
|
|||
height: 16px;
|
||||
vertical-align: text-bottom;
|
||||
background-size: contain;
|
||||
content: url("qrc://localhost/icons/arrow.png");
|
||||
content: url("qrc:///icons/arrow.png");
|
||||
}
|
||||
|
||||
.gdcollapseicon {
|
||||
|
@ -3082,7 +3026,7 @@ table#sv-hooks,
|
|||
height: 16px;
|
||||
vertical-align: text-bottom;
|
||||
background-size: contain;
|
||||
content: url("qrc://localhost/icons/downarrow.png");
|
||||
content: url("qrc:///icons/downarrow.png");
|
||||
}
|
||||
|
||||
/********** Slob dictionaries ***********/
|
||||
|
|
|
@ -242,7 +242,9 @@ ArticleView::ArticleView( QWidget * parent,
|
|||
settings->setAttribute( QWebEngineSettings::PrintElementBackgrounds, false );
|
||||
#endif
|
||||
|
||||
webview->load( QUrl( "gdlookup://localhost?word=(untitled)&blank=1" ) );
|
||||
auto html = articleNetMgr.getHtml( ResourceType::UNTITLE );
|
||||
|
||||
webview->setHtml( QString::fromStdString( html ) );
|
||||
|
||||
expandOptionalParts = cfg.preferences.alwaysExpandOptionalParts;
|
||||
|
||||
|
@ -355,16 +357,14 @@ void ArticleView::showDefinition( QString const & word,
|
|||
if ( mutedDicts.size() )
|
||||
Utils::Url::addQueryItem( req, "muted", mutedDicts );
|
||||
|
||||
// Update headwords history
|
||||
emit sendWordToHistory( word );
|
||||
|
||||
// Any search opened is probably irrelevant now
|
||||
closeSearch();
|
||||
|
||||
load( req );
|
||||
|
||||
//QApplication::setOverrideCursor( Qt::WaitCursor );
|
||||
webview->setCursor( Qt::WaitCursor );
|
||||
load( req );
|
||||
|
||||
// Update headwords history
|
||||
emit sendWordToHistory( word );
|
||||
}
|
||||
|
||||
void ArticleView::showDefinition( QString const & word,
|
||||
|
@ -399,18 +399,17 @@ void ArticleView::showDefinition( QString const & word,
|
|||
if ( ignoreDiacritics )
|
||||
Utils::Url::addQueryItem( req, "ignore_diacritics", "1" );
|
||||
|
||||
// Update headwords history
|
||||
emit sendWordToHistory( word );
|
||||
|
||||
// Any search opened is probably irrelevant now
|
||||
closeSearch();
|
||||
|
||||
// Clear highlight all button selection
|
||||
searchPanel->highlightAll->setChecked( false );
|
||||
webview->setCursor( Qt::WaitCursor );
|
||||
|
||||
load( req );
|
||||
|
||||
webview->setCursor( Qt::WaitCursor );
|
||||
// Update headwords history
|
||||
emit sendWordToHistory( word );
|
||||
}
|
||||
|
||||
void ArticleView::sendToAnki( QString const & word, QString const & dict_definition, QString const & sentence )
|
||||
|
@ -734,18 +733,8 @@ bool ArticleView::eventFilter( QObject * obj, QEvent * ev )
|
|||
}
|
||||
|
||||
if ( obj == webview ) {
|
||||
if ( ev->type() == QEvent::MouseButtonPress ) {
|
||||
auto event = static_cast< QMouseEvent * >( ev );
|
||||
if ( event->button() == Qt::XButton1 ) {
|
||||
back();
|
||||
return true;
|
||||
}
|
||||
if ( event->button() == Qt::XButton2 ) {
|
||||
forward();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if ( ev->type() == QEvent::KeyPress ) {
|
||||
|
||||
if ( ev->type() == QEvent::KeyPress ) {
|
||||
auto keyEvent = static_cast< QKeyEvent * >( ev );
|
||||
|
||||
if ( keyEvent->modifiers() & ( Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier ) )
|
||||
|
@ -860,9 +849,6 @@ void ArticleView::linkHovered( const QString & link )
|
|||
else if ( url.scheme() == "gdtts" ) {
|
||||
msg = tr( "TTS Voice" );
|
||||
}
|
||||
else if ( url.scheme() == "gdpicture" ) {
|
||||
msg = tr( "Picture" );
|
||||
}
|
||||
else if ( url.scheme() == "gdvideo" ) {
|
||||
if ( url.path().isEmpty() ) {
|
||||
msg = tr( "Video" );
|
||||
|
@ -965,9 +951,7 @@ void ArticleView::openLink( QUrl const & url, QUrl const & ref, QString const &
|
|||
|
||||
Contexts contexts( contexts_ );
|
||||
|
||||
if ( url.scheme().compare( "gdpicture" ) == 0 )
|
||||
load( url );
|
||||
else if ( url.scheme().compare( "ankisearch" ) == 0 ) {
|
||||
if ( url.scheme().compare( "ankisearch" ) == 0 ) {
|
||||
ankiConnector->ankiSearch( url.path() );
|
||||
return;
|
||||
}
|
||||
|
@ -1354,9 +1338,7 @@ void ArticleView::updateMutedContents()
|
|||
|
||||
bool ArticleView::canGoBack()
|
||||
{
|
||||
// First entry in a history is always an empty page,
|
||||
// so we skip it.
|
||||
return webview->history()->currentItemIndex() > 1;
|
||||
return webview->history()->canGoBack();
|
||||
}
|
||||
|
||||
bool ArticleView::canGoForward()
|
||||
|
@ -2107,7 +2089,6 @@ bool ArticleView::closeSearch()
|
|||
else if ( ftsSearchIsOpened ) {
|
||||
firstAvailableText.clear();
|
||||
uniqueMatches.clear();
|
||||
ftsPosition = 0;
|
||||
ftsSearchIsOpened = false;
|
||||
|
||||
ftsSearchPanel->hide();
|
||||
|
@ -2309,6 +2290,12 @@ void ArticleView::on_ftsSearchNext_clicked()
|
|||
{
|
||||
performFtsFindOperation( false );
|
||||
}
|
||||
void ArticleView::clearContent()
|
||||
{
|
||||
auto html = articleNetMgr.getHtml( ResourceType::BLANK );
|
||||
|
||||
webview->setHtml( QString::fromStdString( html ) );
|
||||
}
|
||||
|
||||
ResourceToSaveHandler::ResourceToSaveHandler( ArticleView * view, QString fileName ):
|
||||
QObject( view ),
|
||||
|
|
|
@ -88,7 +88,6 @@ class ArticleView: public QWidget
|
|||
QStringList uniqueMatches;
|
||||
bool ftsSearchIsOpened = false;
|
||||
bool ftsSearchMatchCase = false;
|
||||
int ftsPosition = 0;
|
||||
|
||||
QString delayedHighlightText;
|
||||
|
||||
|
@ -116,6 +115,7 @@ public:
|
|||
unsigned getCurrentGroupId();
|
||||
|
||||
virtual QSize minimumSizeHint() const;
|
||||
void clearContent();
|
||||
|
||||
~ArticleView();
|
||||
|
||||
|
|
|
@ -80,7 +80,8 @@ bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
|
|||
singleClickAction( pe );
|
||||
} );
|
||||
}
|
||||
mousePressEvent( pe );
|
||||
if ( pe->buttons() & Qt::MiddleButton )
|
||||
midButtonPressed = true;
|
||||
}
|
||||
if ( ev->type() == QEvent::MouseButtonRelease ) {
|
||||
auto pe = dynamic_cast< QMouseEvent * >( ev );
|
||||
|
@ -102,19 +103,6 @@ bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
|
|||
return QWebEngineView::eventFilter( obj, ev );
|
||||
}
|
||||
|
||||
void ArticleWebView::mousePressEvent( QMouseEvent * event )
|
||||
{
|
||||
if ( event->buttons() & Qt::MiddleButton )
|
||||
midButtonPressed = true;
|
||||
|
||||
if ( event->buttons() & Qt::XButton1 ) {
|
||||
back();
|
||||
}
|
||||
if ( event->buttons() & Qt::XButton2 ) {
|
||||
forward();
|
||||
}
|
||||
}
|
||||
|
||||
void ArticleWebView::singleClickAction( QMouseEvent * event )
|
||||
{
|
||||
if ( !singleClickToDbClick )
|
||||
|
@ -146,14 +134,6 @@ void ArticleWebView::sendCustomMouseEvent( QEvent::Type type )
|
|||
}
|
||||
}
|
||||
|
||||
void ArticleWebView::mouseReleaseEvent( QMouseEvent * event )
|
||||
{
|
||||
bool noMidButton = !( event->buttons() & Qt::MiddleButton );
|
||||
|
||||
// if ( midButtonPressed & noMidButton )
|
||||
// midButtonPressed = false;
|
||||
}
|
||||
|
||||
void ArticleWebView::doubleClickAction( QMouseEvent * event )
|
||||
{
|
||||
if ( Qt::MouseEventSynthesizedByApplication != event->source() ) {
|
||||
|
|
|
@ -55,8 +55,6 @@ protected:
|
|||
bool event( QEvent * event ) override;
|
||||
void singleClickAction( QMouseEvent * event );
|
||||
void sendCustomMouseEvent( QEvent::Type type );
|
||||
void mousePressEvent( QMouseEvent * event ) override;
|
||||
void mouseReleaseEvent( QMouseEvent * event ) override;
|
||||
void doubleClickAction( QMouseEvent * event );
|
||||
void wheelEvent( QWheelEvent * event ) override;
|
||||
|
||||
|
|
|
@ -182,14 +182,15 @@ MainWindow::MainWindow( Config::Class & cfg_ ):
|
|||
GlobalBroadcaster::instance()->setPreference( &cfg.preferences );
|
||||
|
||||
localSchemeHandler = new LocalSchemeHandler( articleNetMgr, this );
|
||||
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "gdlookup", localSchemeHandler );
|
||||
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "bword", localSchemeHandler );
|
||||
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "entry", localSchemeHandler );
|
||||
QStringList htmlScheme = { "gdlookup", "bword", "entry" };
|
||||
for ( const auto & localScheme : htmlScheme ) {
|
||||
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( localScheme.toLatin1(), localSchemeHandler );
|
||||
}
|
||||
|
||||
iframeSchemeHandler = new IframeSchemeHandler( this );
|
||||
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( "ifr", iframeSchemeHandler );
|
||||
|
||||
QStringList localSchemes = { "gdau", "gico", "qrcx", "bres", "gdprg", "gdvideo", "gdpicture", "gdtts" };
|
||||
QStringList localSchemes = { "gdau", "gico", "qrcx", "bres", "gdprg", "gdvideo", "gdtts" };
|
||||
resourceSchemeHandler = new ResourceSchemeHandler( articleNetMgr, this );
|
||||
for ( const auto & localScheme : localSchemes ) {
|
||||
QWebEngineProfile::defaultProfile()->installUrlSchemeHandler( localScheme.toLatin1(), resourceSchemeHandler );
|
||||
|
@ -1224,8 +1225,9 @@ void MainWindow::commitData()
|
|||
for ( auto & file : entries ) {
|
||||
QString const fileName = file.fileName();
|
||||
|
||||
if ( dictMap.contains( fileName.toStdString() ) )
|
||||
continue;
|
||||
//remove both normal index and fts index.
|
||||
if ( !dictMap.contains( fileName.toStdString() ) ) {
|
||||
auto filePath = file.absoluteFilePath();
|
||||
qDebug() << "remove invalid index files & fts dirs";
|
||||
|
||||
|
@ -1236,7 +1238,6 @@ void MainWindow::commitData()
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
|
@ -2855,6 +2856,12 @@ void MainWindow::toggleMainWindow( bool onlyShow )
|
|||
|
||||
void MainWindow::installHotKeys()
|
||||
{
|
||||
#if defined( Q_OS_LINUX )
|
||||
if ( !qEnvironmentVariableIsEmpty( "GOLDENDICT_FORCE_WAYLAND" ) ) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
hotkeyWrapper.reset(); // Remove the old one
|
||||
|
||||
if ( cfg.preferences.enableMainWindowHotkey || cfg.preferences.enableClipboardHotkey ) {
|
||||
|
@ -3290,8 +3297,8 @@ void MainWindow::on_saveArticle_triggered()
|
|||
|
||||
if ( complete ) {
|
||||
QString folder = fi.absoluteDir().absolutePath() + "/" + fi.baseName() + "_files";
|
||||
QRegExp rx1( "\"((?:bres|gico|gdau|qrcx|gdvideo)://[^\"]+)\"" );
|
||||
QRegExp rx2( "'((?:bres|gico|gdau|qrcx|gdvideo)://[^']+)'" );
|
||||
QRegExp rx1( "\"((?:bres|gico|gdau|qrcx|qrc|gdvideo)://[^\"]+)\"" );
|
||||
QRegExp rx2( "'((?:bres|gico|gdau|qrcx|qrc|gdvideo)://[^']+)'" );
|
||||
set< QByteArray > resourceIncluded;
|
||||
vector< pair< QUrl, QString > > downloadResources;
|
||||
|
||||
|
@ -3499,9 +3506,12 @@ void MainWindow::applyWordsZoomLevel()
|
|||
font.setPointSize( ps );
|
||||
}
|
||||
|
||||
if ( translateLine->font().pointSize() != ps )
|
||||
if ( translateLine->font().pointSize() != ps ) {
|
||||
translateLine->setFont( font );
|
||||
|
||||
translateBox->completerWidget()->setFont( font );
|
||||
}
|
||||
|
||||
font = groupListDefaultFont;
|
||||
|
||||
ps = font.pointSize();
|
||||
|
|
|
@ -354,7 +354,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
|
||||
//Misc
|
||||
ui.removeInvalidIndexOnExit->setChecked( p.removeInvalidIndexOnExit );
|
||||
ui.dictionaryDebug->setChecked( p.dictionaryDebug );
|
||||
|
||||
// Add-on styles
|
||||
ui.addonStylesLabel->setVisible( ui.addonStyles->count() > 1 );
|
||||
|
@ -519,7 +518,6 @@ Config::Preferences Preferences::getPreferences()
|
|||
p.clearNetworkCacheOnExit = ui.clearNetworkCacheOnExit->isChecked();
|
||||
|
||||
p.removeInvalidIndexOnExit = ui.removeInvalidIndexOnExit->isChecked();
|
||||
p.dictionaryDebug = ui.dictionaryDebug->isChecked();
|
||||
|
||||
p.addonStyle = ui.addonStyles->getCurrentStyle();
|
||||
|
||||
|
|
|
@ -1987,16 +1987,6 @@ from Stardict, Babylon and GLS dictionaries</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="dictionaryDebug">
|
||||
<property name="toolTip">
|
||||
<string>When debugging with dictionary css/js, disable certain cache to make it easier.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Dictionary debug</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
@ -275,9 +275,6 @@ ScanPopup::ScanPopup( QWidget * parent,
|
|||
|
||||
void ScanPopup::refresh()
|
||||
{
|
||||
|
||||
// TODO: GroupCombox's update should be moved inside GroupCombox
|
||||
|
||||
// currentIndexChanged() signal is very trigger-happy. To avoid triggering
|
||||
// it, we disconnect it while we're clearing and filling back groups.
|
||||
disconnect( ui.groupList, &GroupComboBox::currentIndexChanged, this, &ScanPopup::currentGroupChanged );
|
||||
|
@ -341,8 +338,9 @@ void ScanPopup::applyWordsZoomLevel()
|
|||
font.setPointSize( ps );
|
||||
}
|
||||
|
||||
if ( ui.translateBox->completerWidget()->font().pointSize() != ps )
|
||||
if ( ui.translateBox->completerWidget()->font().pointSize() != ps ) {
|
||||
ui.translateBox->completerWidget()->setFont( font );
|
||||
}
|
||||
|
||||
font = translateLineDefaultFont;
|
||||
ps = font.pointSize();
|
||||
|
@ -626,13 +624,7 @@ void ScanPopup::updateSuggestionList( QString const & text )
|
|||
// An empty request always results in an empty result
|
||||
wordFinder.cancel();
|
||||
|
||||
// Reset the noResults mark if it's on right now
|
||||
if ( ui.translateBox->translateLine()->property( "noResults" ).toBool() ) {
|
||||
auto translateLine = ui.translateBox->translateLine();
|
||||
translateLine->setProperty( "noResults", false );
|
||||
|
||||
Utils::Widget::setNoResultColor( translateLine, false );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -850,19 +842,10 @@ void ScanPopup::enterEvent( QEvent * event )
|
|||
}
|
||||
}
|
||||
|
||||
void ScanPopup::requestWindowFocus()
|
||||
{
|
||||
// One of the rare, actually working workarounds for requesting a user keyboard focus on X11,
|
||||
// works for Qt::Popup windows, exactly like our Scan Popup (in unpinned state).
|
||||
// Modern window managers actively resist to automatically focus pop-up windows.
|
||||
}
|
||||
|
||||
void ScanPopup::showEvent( QShowEvent * ev )
|
||||
{
|
||||
QMainWindow::showEvent( ev );
|
||||
|
||||
QTimer::singleShot( 100, this, &ScanPopup::requestWindowFocus );
|
||||
|
||||
if ( groups.size() <= 1 ) // Only the default group? Hide then.
|
||||
ui.groupList->hide();
|
||||
|
||||
|
@ -907,6 +890,10 @@ void ScanPopup::prefixMatchFinished()
|
|||
_results << fst;
|
||||
}
|
||||
|
||||
// Reset the noResults mark if it's on right now
|
||||
auto translateLine = ui.translateBox->translateLine();
|
||||
|
||||
Utils::Widget::setNoResultColor( translateLine, _results.isEmpty() );
|
||||
ui.translateBox->setModel( _results );
|
||||
}
|
||||
}
|
||||
|
@ -1016,6 +1003,7 @@ void ScanPopup::hideWindow()
|
|||
ui.translateBox->setPopupEnabled( false );
|
||||
ui.translateBox->translateLine()->deselect();
|
||||
hide();
|
||||
definition->clearContent();
|
||||
}
|
||||
|
||||
void ScanPopup::interceptMouse()
|
||||
|
|
|
@ -88,7 +88,6 @@ signals:
|
|||
#endif
|
||||
|
||||
public slots:
|
||||
void requestWindowFocus();
|
||||
|
||||
void inspectElementWhenPinned( QWebEnginePage * page );
|
||||
/// Translates the word from the clipboard, showing the window etc.
|
||||
|
|
|
@ -468,7 +468,7 @@ of the appropriate groups to use them.</string>
|
|||
<item>
|
||||
<widget class="QLabel" name="label_17">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>Prouncations provied by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></string>
|
||||
<string><html><head/><body><p>Pronunciations provided by <a href="https://lingualibre.org"><span style=" text-decoration: underline; color:#2980b9;">Lingua Libre</span></a>, a collaborative linguistic media library of Wikimedia France. </p></body></html></string>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
|
@ -891,8 +891,8 @@ Not implemented yet in GoldenDict.</string>
|
|||
<tabstop>paths</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../../resources.qrc"/>
|
||||
<include location="../../icons/flags.qrc"/>
|
||||
<include location="../../resources.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
|
@ -111,7 +111,7 @@ QLineEdit * TranslateBox::translateLine()
|
|||
|
||||
QWidget * TranslateBox::completerWidget()
|
||||
{
|
||||
return completer->widget();
|
||||
return completer->popup();
|
||||
}
|
||||
|
||||
void TranslateBox::rightButtonClicked()
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue