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