mirror of
https://github.com/kiwix/kiwix-desktop.git
synced 2025-09-23 03:58:56 -04:00
Merge pull request #387 from kiwix/wiki-translate
Prepare string files for Translatewiki
This commit is contained in:
commit
c8ed41dea5
@ -46,6 +46,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
SOURCES += \
|
||||
src/findinpagebar.cpp \
|
||||
src/translation.cpp \
|
||||
src/main.cpp \
|
||||
src/mainwindow.cpp \
|
||||
src/kiwixapp.cpp \
|
||||
@ -75,6 +76,7 @@ SOURCES += \
|
||||
|
||||
HEADERS += \
|
||||
src/findinpagebar.h \
|
||||
src/translation.h \
|
||||
src/mainwindow.h \
|
||||
src/kiwixapp.h \
|
||||
src/kprofile.h \
|
||||
|
90
resources/i18n/en.json
Normal file
90
resources/i18n/en.json
Normal file
@ -0,0 +1,90 @@
|
||||
{
|
||||
"@metadata": {
|
||||
"authors": [
|
||||
]
|
||||
},
|
||||
"name":"English",
|
||||
"error-downloader-window-title":"Cannot create downloader",
|
||||
"error-downloader-launch-message":"Impossible to launch downloader, Kiwix-desktop will start but all download functions will not working !",
|
||||
"open-zim":"Open Zim",
|
||||
"local-kiwix-server":"Local Kiwix Server",
|
||||
"random-article":"Random Article",
|
||||
"home-page":"Home page",
|
||||
"print":"Print",
|
||||
"new-tab":"New tab",
|
||||
"close-tab":"Close tab",
|
||||
"reopen-closed-tab":"Reopen closed tab",
|
||||
"browse-library":"Browse library",
|
||||
"open-file":"Open file",
|
||||
"open-recent":"Open recent",
|
||||
"search-article":"Search arcticle",
|
||||
"search-in-library":"Search in library",
|
||||
"find-in-page":"Find in page",
|
||||
"set-fullscreen":"Set fullscreen",
|
||||
"quit-fullscreen":"Quit fullScreen",
|
||||
"table-of-content":"Table of content",
|
||||
"reading-list":"Reading list",
|
||||
"reading-list-title":"Reading List",
|
||||
"zoom-in":"Zoom in",
|
||||
"zoom-out":"Zoom out",
|
||||
"zoom-reset":"Zoom reset",
|
||||
"help":"Help",
|
||||
"feedback":"Feedback",
|
||||
"report-a-bug":"Report a bug",
|
||||
"request-a-feature":"Request a feature",
|
||||
"about-kiwix":"About Kiwix",
|
||||
"donate-to-support-kiwix":"Donate to support Kiwix",
|
||||
"exit":"Exit",
|
||||
"save-file-as-window-title":"Save File as",
|
||||
"download-finished-message":"The document has been downloaded.",
|
||||
"file":"File",
|
||||
"edit":"Edit",
|
||||
"view":"View",
|
||||
"tools":"Tools",
|
||||
"window-title":"Library - Kiwix",
|
||||
"search":"Search",
|
||||
"browse-directory":"Browse Directory",
|
||||
"settings":"Settings",
|
||||
"back":"Back",
|
||||
"forward":"Forward",
|
||||
"search-files":"Search files",
|
||||
"title":"Title",
|
||||
"size":"Size",
|
||||
"date":"Date",
|
||||
"content-type":"Content type",
|
||||
"reset-sort":"reset sort",
|
||||
"open":"Open",
|
||||
"delete":"Delete",
|
||||
"download":"Download",
|
||||
"resume":"Resume",
|
||||
"pause":"Pause",
|
||||
"cancel":"Cancel",
|
||||
"apply":"Apply",
|
||||
"port-for-local-kiwix-server-setting":"Port for local Kiwix server :",
|
||||
"zoom-level-setting":"Zoom level :",
|
||||
"download-directory-setting":"Download directory :",
|
||||
"reset":"Reset",
|
||||
"browse":"Browse",
|
||||
"kiwix-desktop-description":"Kiwix enables you to have the whole Wikipedia at hand wherever you go! On a boat, in the middle of nowhere or in jail, Kiwix gives you access to the whole human knowledge. You don't need Internet, everything is store on your computer.",
|
||||
"learn-more-about-kiwix":"Learn more about Kiwix",
|
||||
"release":"Release",
|
||||
"source-code":"This software is released under the terms of the GNU General Public License version 3. View the source code on",
|
||||
"version":"Version",
|
||||
"build-date":"Build date",
|
||||
"reporting-problem":"Reporting problem",
|
||||
"report-issue-1/3":"To open an issue, visit",
|
||||
"report-issue-2/3":"and open an issue describing your problem.",
|
||||
"report-issue-3/3":"Please mention the version and the build date in the issue.",
|
||||
"libraries":"Libraries",
|
||||
"kiwix-server-running-message":"The Kiwix Server is running and can be accessed in the local network at :",
|
||||
"kiwix-server-description":"Starting a server allows other computers in the local network to access your Kiwix library with a standard web browser.",
|
||||
"fullscreen-notification":"You are now in full screen mode. Press ESC to quit!",
|
||||
"all-files":"All Files",
|
||||
"local-files":"Local Files",
|
||||
"browse-by-category":"Browse By Category",
|
||||
"browse-by-language":"Browse By Language",
|
||||
"hide":"Hide",
|
||||
"open-in-browser":"Open in browser",
|
||||
"start-kiwix-server":"Start Kiwix Server",
|
||||
"stop-kiwix-server":"Stop Kiwix Server"
|
||||
}
|
Binary file not shown.
@ -1,448 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="fr">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<location filename="../../ui/about.ui" line="20"/>
|
||||
<source>About</source>
|
||||
<translation>À propos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../ui/about.ui" line="69"/>
|
||||
<source>qrc:/texts/about.html</source>
|
||||
<translation>qrc:/texts/about.html</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KiwixApp</name>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="123"/>
|
||||
<source>Open Zim</source>
|
||||
<translation>Ouvrir un Zim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="252"/>
|
||||
<source>Local Kiwix Server</source>
|
||||
<translation>Serveur local Kiwix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="256"/>
|
||||
<source>Random Article</source>
|
||||
<translation>Article au hasard</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="261"/>
|
||||
<source>Print</source>
|
||||
<translation>Imprimer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="266"/>
|
||||
<source>New tab</source>
|
||||
<translation>Nouvel onglet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="269"/>
|
||||
<source>Close tab</source>
|
||||
<translation>Fermer l'onglet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="272"/>
|
||||
<source>Reopen closed tab</source>
|
||||
<translation>Rouvrir l'onglet fermé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="276"/>
|
||||
<source>Browse library</source>
|
||||
<translation>Parcourir la bibliothèque</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="280"/>
|
||||
<source>Open file</source>
|
||||
<translation>Ouvrir un fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="285"/>
|
||||
<source>Open recent</source>
|
||||
<translation>Fichiers récemment ouverts</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="288"/>
|
||||
<source>Save page as ...</source>
|
||||
<translation>Enregister sous...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="292"/>
|
||||
<source>Search article</source>
|
||||
<translation>Chercher un article</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="296"/>
|
||||
<source>Search in library</source>
|
||||
<translation>Chercher dans la bibliothèque</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="300"/>
|
||||
<source>Find in page</source>
|
||||
<translation>Chercher dans la page</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Find next</source>
|
||||
<translation>Trouver le suivant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Find previous</source>
|
||||
<translation>Trouver le précédent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="305"/>
|
||||
<location filename="../../src/kiwixapp.cpp" line="312"/>
|
||||
<source>Set fullScreen</source>
|
||||
<translation>Mode plein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="312"/>
|
||||
<source>Quit fullScreen</source>
|
||||
<translation>Quitter le plein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="316"/>
|
||||
<source>Table of content</source>
|
||||
<translation>Table des matières</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="320"/>
|
||||
<source>Reading list</source>
|
||||
<translation>Liste de lecture</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="330"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Agrandir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="333"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Réduire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="336"/>
|
||||
<source>Zoom reset</source>
|
||||
<translation>Réinitialisation du zoom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="339"/>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="343"/>
|
||||
<source>Feedback</source>
|
||||
<translation>Retour d'information</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="346"/>
|
||||
<source>Repost a bug</source>
|
||||
<translation>Déclarer un bogue</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="349"/>
|
||||
<source>Request a feature</source>
|
||||
<translation>Demander une nouvelle fonctionnalité</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="352"/>
|
||||
<source>About Kiwix</source>
|
||||
<translation>À propos de Kiwix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="354"/>
|
||||
<source>Settings</source>
|
||||
<translation>Paramètres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="358"/>
|
||||
<source>Donate to support Kiwix</source>
|
||||
<translation>Faire un don pour soutenir Kiwix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/kiwixapp.cpp" line="362"/>
|
||||
<source>Exit</source>
|
||||
<translation>Quitter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainMenu</name>
|
||||
<message>
|
||||
<location filename="../../src/mainmenu.cpp" line="18"/>
|
||||
<source>File</source>
|
||||
<translation>Fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/mainmenu.cpp" line="28"/>
|
||||
<source>Edit</source>
|
||||
<translation>Édition</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/mainmenu.cpp" line="34"/>
|
||||
<source>View</source>
|
||||
<translation>Affichage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/mainmenu.cpp" line="43"/>
|
||||
<source>Tools</source>
|
||||
<translation>Outils</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/mainmenu.cpp" line="47"/>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../../ui/mainwindow.ui" line="14"/>
|
||||
<source>MainWindow</source>
|
||||
<translation>Fenêtre principale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Find in page</source>
|
||||
<translation>Chercher dans la page</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/mainwindow.cpp" line="30"/>
|
||||
<source>Library</source>
|
||||
<translation>Bibliothèque</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<source>Open Zim</source>
|
||||
<translation>Ouvrir un Zim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Local Kiwix Server</source>
|
||||
<translation>Serveur local Kiwix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Random Article</source>
|
||||
<translation>Article au hasard</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print</source>
|
||||
<translation>Imprimer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tab</source>
|
||||
<translation>Nouvel onglet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close tab</source>
|
||||
<translation>Fermer l'onglet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reopen closed tab</source>
|
||||
<translation>Rouvrir l'onglet fermé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse library</source>
|
||||
<translation>Parcourir la bibliothèque</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open file</source>
|
||||
<translation>Ouvrir un fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open recent</source>
|
||||
<translation>Fichiers récemment ouverts</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save page as ...</source>
|
||||
<translation>Enregister sous...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search article</source>
|
||||
<translation>Chercher un article</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search in library</source>
|
||||
<translation>Chercher dans la bibliothèque</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Find in page</source>
|
||||
<translation>Chercher dans la page</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set fullScreen</source>
|
||||
<translation>Mode plein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quit fullScreen</source>
|
||||
<translation>Quitter le pein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Table of content</source>
|
||||
<translation>Table des matières</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reading list</source>
|
||||
<translation>Liste de lecture</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zoom in</source>
|
||||
<translation>Agrandir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zoom out</source>
|
||||
<translation>Réduire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zoom reset</source>
|
||||
<translation>Réinitialisation du zoom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Feedback</source>
|
||||
<translation>Retour d'information</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Repost a bug</source>
|
||||
<translation>Déclarer un bogue</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Request a feature</source>
|
||||
<translation>Demander une nouvelle fonctionnalité</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>About Kiwix</source>
|
||||
<translation>À propos de Kiwix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Settings</source>
|
||||
<translation>Paramètres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Donate to support Kiwix</source>
|
||||
<translation>Faire un don pour soutenir Kiwix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exit</source>
|
||||
<translation>Quitter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File</source>
|
||||
<translation>Fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit</source>
|
||||
<translation>Édition</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View</source>
|
||||
<translation>Affichage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tools</source>
|
||||
<translation>Outils</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search</source>
|
||||
<translation>Recherche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>back</source>
|
||||
<translation>Précédent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>forward</source>
|
||||
<translation>Suivant</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SearchBar</name>
|
||||
<message>
|
||||
<location filename="../../src/searchbar.cpp" line="62"/>
|
||||
<source>Search</source>
|
||||
<translation>Rechercher</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TocSideBar</name>
|
||||
<message>
|
||||
<location filename="../../src/tocsidebar.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/tocsidebar.ui" line="49"/>
|
||||
<source>Hide</source>
|
||||
<translation>Masquer</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TopWidget</name>
|
||||
<message>
|
||||
<location filename="../../src/topwidget.cpp" line="15"/>
|
||||
<location filename="../../src/topwidget.cpp" line="16"/>
|
||||
<source>back</source>
|
||||
<translation>Précédent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/topwidget.cpp" line="24"/>
|
||||
<location filename="../../src/topwidget.cpp" line="25"/>
|
||||
<source>forward</source>
|
||||
<translation>Suivant</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>contentmanagerside</name>
|
||||
<message>
|
||||
<location filename="../../src/contentmanagerside.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/contentmanagerside.ui" line="68"/>
|
||||
<source>All Files</source>
|
||||
<translation>Tous les fichiers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/contentmanagerside.ui" line="75"/>
|
||||
<source>Local Files</source>
|
||||
<translation>Fichiers locaux</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/contentmanagerside.ui" line="85"/>
|
||||
<source>Browse By Language</source>
|
||||
<translation>Parcourir par langues</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/contentmanagerside.ui" line="123"/>
|
||||
<source>Browse By Category</source>
|
||||
<translation>Parcourir par catégories</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/contentmanagerside.ui" line="158"/>
|
||||
<source>Content Type</source>
|
||||
<translation>Type de contenu</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>readinglistbar</name>
|
||||
<message>
|
||||
<location filename="../../src/readinglistbar.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../src/readinglistbar.ui" line="37"/>
|
||||
<source>Reading List</source>
|
||||
<translation>Liste de lecture</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -18,13 +18,10 @@ function getIndexById(id) {
|
||||
return index;
|
||||
}
|
||||
|
||||
function createDict(keys, values) {
|
||||
var d = {}
|
||||
for(var i=0; i<keys.length; i++) {
|
||||
d[keys[i]] = values[i];
|
||||
}
|
||||
return d;
|
||||
function setTranslations(translations) {
|
||||
app.translations = createDict(TRANSLATION_KEYS, translations);
|
||||
}
|
||||
|
||||
const BOOK_KEYS = ["id", "name", "path", "url", "size", "description", "title", "tags", "date", "faviconUrl", "faviconMimeType", "downloadId"];
|
||||
function addBook(values) {
|
||||
var b = createDict(BOOK_KEYS, values);
|
||||
@ -92,6 +89,18 @@ function displayLoadIcon(display) {
|
||||
document.getElementById("bookList").classList.remove("do-not-display")
|
||||
}
|
||||
}
|
||||
const TRANSLATION_KEYS = ["search-files",
|
||||
"title",
|
||||
"size",
|
||||
"date",
|
||||
"content-type",
|
||||
"reset-sort",
|
||||
"open",
|
||||
"delete",
|
||||
"download",
|
||||
"resume",
|
||||
"pause",
|
||||
"cancel"];
|
||||
|
||||
function init() {
|
||||
new QWebChannel(qt.webChannelTransport, function(channel) {
|
||||
@ -104,9 +113,13 @@ function init() {
|
||||
books: [],
|
||||
downloads: {},
|
||||
activeSortType:"",
|
||||
sortOrderAsc:true
|
||||
sortOrderAsc:true,
|
||||
translations:{}
|
||||
},
|
||||
methods: {
|
||||
gt : function(key) {
|
||||
return this.translations[key];
|
||||
},
|
||||
openBook : function(book) {
|
||||
contentManager.openBook(book.id, function() {});
|
||||
},
|
||||
@ -195,6 +208,7 @@ function init() {
|
||||
contentManager.oneBookChanged.connect(onOneBookChanged);
|
||||
contentManager.bookRemoved.connect(onBookRemoved);
|
||||
contentManager.pendingRequest.connect(displayLoadIcon);
|
||||
contentManager.getTranslations(TRANSLATION_KEYS, setTranslations);
|
||||
onBooksChanged();
|
||||
displayLoadIcon(false);
|
||||
});
|
||||
|
@ -23,6 +23,18 @@ function validDownloadDir (dir) {
|
||||
settingsManager.validDownloadDir(dir);
|
||||
}
|
||||
|
||||
function setTranslations(translations) {
|
||||
app.translations = createDict(TRANSLATION_KEYS, translations);
|
||||
}
|
||||
|
||||
const TRANSLATION_KEYS = ["settings",
|
||||
"apply",
|
||||
"port-for-local-kiwix-server-setting",
|
||||
"zoom-level-setting",
|
||||
"download-directory-setting",
|
||||
"reset",
|
||||
"browse"];
|
||||
|
||||
function init() {
|
||||
new QWebChannel(qt.webChannelTransport, function(channel) {
|
||||
settingsManager = channel.objects.settingsManager;
|
||||
@ -33,8 +45,12 @@ function init() {
|
||||
kiwixServerPort: settingsManager.kiwixServerPort,
|
||||
zoomFactor: Math.floor(settingsManager.zoomFactor * 100),
|
||||
downloadDir: settingsManager.downloadDir,
|
||||
translations:{}
|
||||
},
|
||||
methods: {
|
||||
gt : function(key) {
|
||||
return this.translations[key];
|
||||
},
|
||||
saveSettings : function() {
|
||||
if (!validPort(this.kiwixServerPort)) {
|
||||
alert("Invalid port");
|
||||
@ -53,5 +69,6 @@ function init() {
|
||||
});
|
||||
settingsManager.downloadDirChanged.connect(onDownloadDirChanged)
|
||||
settingsManager.settingsChecked.connect(onSettingsChecked)
|
||||
settingsManager.getTranslations(TRANSLATION_KEYS, setTranslations);
|
||||
});
|
||||
}
|
7
resources/js/tools.js
Normal file
7
resources/js/tools.js
Normal file
@ -0,0 +1,7 @@
|
||||
function createDict(keys, values) {
|
||||
var d = {}
|
||||
for(var i=0; i<keys.length; i++) {
|
||||
d[keys[i]] = values[i];
|
||||
}
|
||||
return d;
|
||||
}
|
@ -61,8 +61,6 @@
|
||||
<file>fonts/SegoeUI/seguisb.ttf</file>
|
||||
<file>fonts/SegoeUI/segoeui.ttf</file>
|
||||
<file>texts/about.html</file>
|
||||
<file>texts/kiwixServerText.html</file>
|
||||
<file>texts/kiwixServerRunningText.html</file>
|
||||
<file>icons/search_backward.svg</file>
|
||||
<file>icons/search_forward.svg</file>
|
||||
<file>icons/kiwix-app-icons-square.svg</file>
|
||||
@ -72,6 +70,7 @@
|
||||
<file>icons/new-tab-icon.svg</file>
|
||||
<file>icons/library-icon.svg</file>
|
||||
<file>icons/open-file.svg</file>
|
||||
<file>js/tools.js</file>
|
||||
</qresource>
|
||||
<qresource lang="fr" prefix="/">
|
||||
<file alias="texts/about.html">texts/fr/about.html</file>
|
||||
|
@ -4,36 +4,37 @@
|
||||
<script src="qrc:///js/vue.js"></script>
|
||||
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
|
||||
<script src="qrc:///js/_contentManager.js"></script>
|
||||
<script src="qrc:///js/tools.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="qrc:///css/_contentManager.css"/>
|
||||
</head>
|
||||
<body onload="init()">
|
||||
<div id="app">
|
||||
<div id="searchBar">
|
||||
<form>
|
||||
<input id="searchInput" type="text" placeholder="Search files" oninput="setSearch(this.value)"/>
|
||||
<input id="searchInput" type="text" :placeholder="gt('search-files')" oninput="setSearch(this.value)"/>
|
||||
</form>
|
||||
</div>
|
||||
<div id="bookTable">
|
||||
<div class="header">
|
||||
<span class="tablecell cell0"></span>
|
||||
<span v-on:click="sortBookBy('title')" :class="{ sortableBold: isActive('title') }" class="tablecell cell1 sortable"><i :class="{ arrowDown: isUpOrDown('title', true), arrowUp: isUpOrDown('title', false) }"></i> Title</span>
|
||||
<span v-on:click="sortBookBy('size')" :class="{ sortableBold: isActive('size') }" class="tablecell cell2 sortable"><i :class="{ arrowDown: isUpOrDown('size', true), arrowUp: isUpOrDown('size', false) }"></i> Size</span>
|
||||
<span v-on:click="sortBookBy('date')" :class="{ sortableBold: isActive('date') }" class="tablecell cell3 sortable"><i :class="{ arrowDown: isUpOrDown('date', true), arrowUp: isUpOrDown('date', false) }"></i> Date</span>
|
||||
<span class="tablecell cell4">Content type</span>
|
||||
<span v-on:click="sortBookBy('title')" :class="{ sortableBold: isActive('title') }" class="tablecell cell1 sortable"><i :class="{ arrowDown: isUpOrDown('title', true), arrowUp: isUpOrDown('title', false) }"></i> {{ gt("title") }}</span>
|
||||
<span v-on:click="sortBookBy('size')" :class="{ sortableBold: isActive('size') }" class="tablecell cell2 sortable"><i :class="{ arrowDown: isUpOrDown('size', true), arrowUp: isUpOrDown('size', false) }"></i> {{ gt("size") }} </span>
|
||||
<span v-on:click="sortBookBy('date')" :class="{ sortableBold: isActive('date') }" class="tablecell cell3 sortable"><i :class="{ arrowDown: isUpOrDown('date', true), arrowUp: isUpOrDown('date', false) }"></i> {{ gt("date") }} </span>
|
||||
<span class="tablecell cell4"> {{ gt("content-type") }} </span>
|
||||
<span class="tablecell cell5 tablerow">
|
||||
<button v-on:click="resetSort()">reset sort</button>
|
||||
<button v-on:click="resetSort()"> {{ gt("reset-sort") }} </button>
|
||||
</span>
|
||||
</div>
|
||||
<div id="load-icon" class="loader"></div>
|
||||
<div id="bookList" onscroll=scrolled(this)>
|
||||
<div id="menu" class="menu">
|
||||
<ul class="menu-options">
|
||||
<li v-on:click="openBook(getBookFromMousePosition())" class="menu-option local-option">Open</li>
|
||||
<li v-on:click="eraseBook(getBookFromMousePosition())" class="menu-option local-option">Delete</li>
|
||||
<li v-on:click="downloadBook(getBookFromMousePosition())" class="menu-option download-option">Download</li>
|
||||
<li v-on:click="resumeBook(getBookFromMousePosition())" class="menu-option resume-option">Resume</li>
|
||||
<li v-on:click="pauseBook(getBookFromMousePosition())" class="menu-option pause-option">Pause</li>
|
||||
<li v-on:click="cancelBook(getBookFromMousePosition())" class="menu-option cancel-option">Cancel</li>
|
||||
<li v-on:click="openBook(getBookFromMousePosition())" class="menu-option local-option">{{ gt("open") }}</li>
|
||||
<li v-on:click="eraseBook(getBookFromMousePosition())" class="menu-option local-option">{{ gt("delete") }}</li>
|
||||
<li v-on:click="downloadBook(getBookFromMousePosition())" class="menu-option download-option">{{ gt("download") }}</li>
|
||||
<li v-on:click="resumeBook(getBookFromMousePosition())" class="menu-option resume-option">{{ gt("resume") }}</li>
|
||||
<li v-on:click="pauseBook(getBookFromMousePosition())" class="menu-option pause-option">{{ gt("pause") }}</li>
|
||||
<li v-on:click="cancelBook(getBookFromMousePosition())" class="menu-option cancel-option">{{ gt("cancel") }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<details v-for="book in displayedBooks(books, displayedBooksNb)" class="book">
|
||||
|
@ -4,27 +4,28 @@
|
||||
<script src="qrc:///js/vue.js"></script>
|
||||
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
|
||||
<script src="qrc:///js/_settingsManager.js"></script>
|
||||
<script src="qrc:///js/tools.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="qrc:///css/_settingsManager.css"/>
|
||||
</head>
|
||||
<body onload="init()">
|
||||
<div id="settings">
|
||||
<div id="header">
|
||||
<h1>Settings</h1>
|
||||
<input id="save-button" type="button" value="Apply" v-on:click="saveSettings()">
|
||||
<h1>{{ gt("settings") }}</h1>
|
||||
<input id="save-button" type="button" :value="gt('apply')" v-on:click="saveSettings()">
|
||||
</div>
|
||||
<div class="row">
|
||||
<label>Port for local Kiwix server : </label>
|
||||
<label>{{ gt("port-for-local-kiwix-server-setting") }}</label>
|
||||
<input type="number" min="1" max="65535" v-model="kiwixServerPort" >
|
||||
</div>
|
||||
<div class="row">
|
||||
<label>Zoom level : </label>
|
||||
<label>{{ gt("zoom-level-setting") }}</label>
|
||||
<div class="percentage-symbol"><input type="number" step="10" min="30" max="500" v-model="zoomFactor" ></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label>Download directory : </label>
|
||||
<label>{{ gt("download-directory-setting") }}</label>
|
||||
<input style="flex: 1;" type="text" v-model="downloadDir" >
|
||||
<input type="button" value="Reset" v-on:click="resetDownloadDir()">
|
||||
<input type="button" value="Browse" v-on:click="browseDownloadDir()">
|
||||
<input type="button" :value="gt('reset')" v-on:click="resetDownloadDir()">
|
||||
<input type="button" :value="gt('browse')" v-on:click="browseDownloadDir()">
|
||||
</div>
|
||||
</div>
|
||||
</body></html>
|
||||
|
@ -3,18 +3,18 @@
|
||||
<body>
|
||||
<img src="qrc:/icons/kiwix/app_icon.svg" height="240" width="240" style="float:right"/>
|
||||
<h1>Kiwix Desktop</h1>
|
||||
<p>Kiwix enables you to have the whole Wikipedia at hand wherever you go! On a boat, in the middle of nowhere or in jail, Kiwix gives you access to the whole human knowledge. You don't need Internet, everything is store on your computer.</p>
|
||||
<p><a href="http://kiwix.org">Learn more About Kiwix</a></p>
|
||||
<h2>Release</h2>
|
||||
<p>%%KIWIX_DESKTOP_DESCRIPTION%%</p>
|
||||
<p><a href="http://kiwix.org">%%LEARN_MORE_ABOUT_KIWIX%%</a></p>
|
||||
<h2>%%RELEASE%%</h2>
|
||||
<p>
|
||||
This software is released under the terms of the GNU General Public License version 3. View the source code on <a href="https://github.com/kiwix/kiwix-desktop">Github</a>.
|
||||
%%SOURCE_CODE%% <a href="https://github.com/kiwix/kiwix-desktop">Github</a>.
|
||||
</p>
|
||||
<p>Version : %%VERSION%%</p>
|
||||
<p>Build date : %%BUILD_DATE%%</p>
|
||||
<h2>Reporting problem</h2>
|
||||
<p>To open an issue, visit <a href="https://github.com/kiwix/kiwix-desktop/issues">Kiwix-desktop issue</a> and open an issue describing your problem.</p>
|
||||
<p>Please mention the version and the build date in the issue.</p>
|
||||
<h2>Libraries</h2>
|
||||
<p>%%VERSION_LABEL%% : %%VERSION%%</p>
|
||||
<p>%%BUILD_DATE_LABEL%% : %%BUILD_DATE%%</p>
|
||||
<h2>%%REPORTING_PROBLEM%%</h2>
|
||||
<p>%%REPORT_ISSUE_1%% <a href="https://github.com/kiwix/kiwix-desktop/issues">Kiwix-desktop issue</a> %%REPORT_ISSUE_2%%</p>
|
||||
<p>%%REPORT_ISSUE_3%%</p>
|
||||
<h2>%%LIBRARIES%%</h2>
|
||||
<ul>
|
||||
<li>Libzim - GPLv3 (<a href="http://www.openzim.org">openzim.org</a>)</li>
|
||||
<li>Libkiwix - GPLv3 (<a href="https://github.com/kiwix/kiwix-lib">https://github.com/kiwix/kiwix-lib</a>)</li>
|
||||
|
@ -1,7 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Local Kiwix server</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Kiwix Server is running and can be accessed in the local network at :</p></body></html>
|
@ -1,7 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Local Kiwix server</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Starting a server allows other computers in the local network to access your Kiwix library with a standard web browser.</p></body></html>
|
@ -1,5 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>i18n/kiwix-desktop_fr.qm</file>
|
||||
<file>i18n/en.json</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "about.h"
|
||||
#include "ui_about.h"
|
||||
#include "kiwixapp.h"
|
||||
|
||||
#define _STR(...) # __VA_ARGS__
|
||||
#define STR(X) _STR(X)
|
||||
@ -10,8 +11,19 @@ About::About(QWidget *parent) :
|
||||
{
|
||||
ui->setupUi(this);
|
||||
auto htmlText = ui->aboutText->toHtml();
|
||||
htmlText = htmlText.replace("%%KIWIX_DESKTOP_DESCRIPTION%%", gt("kiwix-desktop-description"));
|
||||
htmlText = htmlText.replace("%%LEARN_MORE_ABOUT_KIWIX%%", gt("learn-more-about-kiwix"));
|
||||
htmlText = htmlText.replace("%%RELEASE%%", gt("release"));
|
||||
htmlText = htmlText.replace("%%SOURCE_CODE%%", gt("source-code"));
|
||||
htmlText = htmlText.replace("%%VERSION_LABEL%%", gt("version"));
|
||||
htmlText = htmlText.replace("%%VERSION%%", STR(GIT_VERSION));
|
||||
htmlText = htmlText.replace("%%BUILD_DATE_LABEL%%", gt("build-date"));
|
||||
htmlText = htmlText.replace("%%BUILD_DATE%%", STR(BUILD_DATE));
|
||||
htmlText = htmlText.replace("%%REPORTING_PROBLEM%%", gt("reporting-problem"));
|
||||
htmlText = htmlText.replace("%%REPORT_ISSUE_1%%", gt("report-issue-1/3"));
|
||||
htmlText = htmlText.replace("%%REPORT_ISSUE_2%%", gt("report-issue-2/3"));
|
||||
htmlText = htmlText.replace("%%REPORT_ISSUE_3%%", gt("report-issue-3/3"));
|
||||
htmlText = htmlText.replace("%%LIBRARIES%%", gt("Libraries"));
|
||||
ui->aboutText->setHtml(htmlText);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,16 @@ void ContentManager::setLocal(bool local) {
|
||||
emit(filterParamsChanged());
|
||||
}
|
||||
|
||||
QStringList ContentManager::getTranslations(const QStringList &keys)
|
||||
{
|
||||
QStringList translations;
|
||||
|
||||
for(auto& key: keys) {
|
||||
translations.append(KiwixApp::instance()->getText(key));
|
||||
}
|
||||
return translations;
|
||||
}
|
||||
|
||||
#define ADD_V(KEY, METH) {if(key==KEY) values.append(QString::fromStdString((b->METH())));}
|
||||
QStringList ContentManager::getBookInfos(QString id, const QStringList &keys)
|
||||
{
|
||||
|
@ -52,6 +52,7 @@ signals:
|
||||
void pendingRequest(const bool);
|
||||
|
||||
public slots:
|
||||
QStringList getTranslations(const QStringList &keys);
|
||||
QStringList getBookInfos(QString id, const QStringList &keys);
|
||||
void openBook(const QString& id);
|
||||
QStringList updateDownloadInfos(QString id, const QStringList& keys);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "contentmanagerside.h"
|
||||
#include "ui_contentmanagerside.h"
|
||||
#include "kiwixapp.h"
|
||||
|
||||
#include <QLocale>
|
||||
|
||||
@ -22,6 +23,10 @@ ContentManagerSide::ContentManagerSide(QWidget *parent) :
|
||||
checked ?"*{font-weight: bold}" : "");});
|
||||
mp_ui->localFileButton->setStyleSheet("*{font-weight: bold}");
|
||||
|
||||
mp_ui->allFileButton->setText(gt("all-files"));
|
||||
mp_ui->localFileButton ->setText(gt("local-files"));
|
||||
mp_ui->languageButton->setText(gt("browse-by-language"));
|
||||
mp_ui->categoryButton->setText(gt("browse-by-category"));
|
||||
mp_languageButton = mp_ui->languageButton;
|
||||
mp_languageSelector = mp_ui->languageSelector;
|
||||
connect(mp_languageButton, &QCheckBox::toggled, this, [=](bool checked) { mp_languageSelector->setHidden(!checked); });
|
||||
|
@ -8,6 +8,7 @@ FindInPageBar::FindInPageBar(QWidget *parent) :
|
||||
{
|
||||
mp_ui->setupUi(this);
|
||||
mp_findLineEdit = mp_ui->findEdit;
|
||||
mp_ui->hideButton->setText(gt("hide"));
|
||||
connect(mp_ui->hideButton, &QPushButton::released,
|
||||
this, &FindInPageBar::findClose);
|
||||
connect(mp_ui->fNextButton, &QPushButton::released,
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "fullscreennotification.h"
|
||||
#include "kiwixapp.h"
|
||||
#include <QSequentialAnimationGroup>
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
@ -7,7 +8,7 @@ FullScreenNotification::FullScreenNotification(QWidget *parent)
|
||||
: QLabel(parent)
|
||||
, m_previouslyVisible(false)
|
||||
{
|
||||
setText(tr("You are now in full screen mode. Press ESC to quit!"));
|
||||
setText(gt("fullscreen-notification"));
|
||||
setStyleSheet(
|
||||
"font-size: 24px;"
|
||||
"color: white;"
|
||||
|
@ -24,6 +24,12 @@ KiwixApp::KiwixApp(int& argc, char *argv[])
|
||||
appendToDirectory(m_libraryDirectory.toStdString(),"library.xml"),
|
||||
m_settingsManager.getKiwixServerPort()))
|
||||
{
|
||||
try {
|
||||
m_translation.setTranslation(QLocale());
|
||||
} catch (exception& e) {
|
||||
QMessageBox::critical(nullptr, "Translation error", e.what());
|
||||
return;
|
||||
}
|
||||
m_qtTranslator.load(QLocale(), "qt", "_",
|
||||
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
|
||||
installTranslator(&m_qtTranslator);
|
||||
@ -34,8 +40,8 @@ KiwixApp::KiwixApp(int& argc, char *argv[])
|
||||
try {
|
||||
mp_downloader = new kiwix::Downloader();
|
||||
} catch (exception& e) {
|
||||
QMessageBox::critical(nullptr, tr("Cannot create downloader"),
|
||||
tr("Impossible to launch downloader, Kiwix-desktop will start but all download functions will not working !<br><br>") + e.what());
|
||||
QMessageBox::critical(nullptr, gt("error-downloader-window-title"),
|
||||
gt("error-downloader-launch-message") + "<br><br>" + e.what());
|
||||
}
|
||||
mp_manager = new ContentManager(&m_library, mp_downloader);
|
||||
|
||||
@ -126,13 +132,17 @@ KiwixApp *KiwixApp::instance()
|
||||
return static_cast<KiwixApp*>(QApplication::instance());
|
||||
}
|
||||
|
||||
QString gt(const QString &key) {
|
||||
return KiwixApp::instance()->getText(key);
|
||||
}
|
||||
|
||||
void KiwixApp::openZimFile(const QString &zimfile)
|
||||
{
|
||||
QString _zimfile = zimfile;
|
||||
if (_zimfile.isEmpty()) {
|
||||
_zimfile = QFileDialog::getOpenFileName(
|
||||
getMainWindow(),
|
||||
tr("Open Zim"),
|
||||
gt("open-zim"),
|
||||
QString(),
|
||||
"ZimFile (*.zim*)");
|
||||
_zimfile = QDir::toNativeSeparators(_zimfile);
|
||||
@ -260,43 +270,43 @@ bool KiwixApp::isCurrentArticleBookmarked()
|
||||
|
||||
void KiwixApp::createAction()
|
||||
{
|
||||
CREATE_ACTION_ICON(KiwixServeAction, "share", tr("Local Kiwix Server"));
|
||||
CREATE_ACTION_ICON(KiwixServeAction, "share", gt("local-kiwix-server"));
|
||||
SET_SHORTCUT(KiwixServeAction, QKeySequence(Qt::CTRL+Qt::Key_I));
|
||||
|
||||
CREATE_ACTION_ICON(RandomArticleAction, "random", tr("Random Article"));
|
||||
CREATE_ACTION_ICON(RandomArticleAction, "random", gt("random-article"));
|
||||
SET_SHORTCUT(RandomArticleAction, QKeySequence(Qt::CTRL+Qt::Key_R));
|
||||
connect(mpa_actions[RandomArticleAction], &QAction::triggered,
|
||||
this, [=]() { this->openRandomUrl(false); });
|
||||
|
||||
CREATE_ACTION(OpenHomePageAction, tr("Home page"));
|
||||
CREATE_ACTION(OpenHomePageAction, gt("random-article"));
|
||||
SET_SHORTCUT(OpenHomePageAction, QKeySequence(Qt::ALT + Qt::Key_Home));
|
||||
|
||||
CREATE_ACTION_ICON(PrintAction, "print", tr("Print"));
|
||||
CREATE_ACTION_ICON(PrintAction, "print", gt("print"));
|
||||
SET_SHORTCUT(PrintAction, QKeySequence::Print);
|
||||
connect(mpa_actions[PrintAction], &QAction::triggered,
|
||||
this, &KiwixApp::printPage);
|
||||
|
||||
CREATE_ACTION(NewTabAction, tr("New tab"));
|
||||
CREATE_ACTION(NewTabAction, gt("new-tab"));
|
||||
SET_SHORTCUT(NewTabAction, QKeySequence::AddTab);
|
||||
|
||||
CREATE_ACTION_ICON(CloseTabAction, "close", tr("Close tab"));
|
||||
CREATE_ACTION_ICON(CloseTabAction, "close", gt("close-tab"));
|
||||
SET_SHORTCUT(CloseTabAction, QKeySequence::Close);
|
||||
mpa_actions[CloseTabAction]->setIconVisibleInMenu(false);
|
||||
|
||||
CREATE_ACTION(ReopenClosedTabAction, tr("Reopen closed tab"));
|
||||
CREATE_ACTION(ReopenClosedTabAction, gt("reopen-closed-tab"));
|
||||
SET_SHORTCUT(ReopenClosedTabAction, QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_T));
|
||||
HIDE_ACTION(ReopenClosedTabAction);
|
||||
|
||||
CREATE_ACTION(BrowseLibraryAction, tr("Browse library"));
|
||||
CREATE_ACTION(BrowseLibraryAction, gt("browse-library"));
|
||||
SET_SHORTCUT(BrowseLibraryAction, QKeySequence(Qt::CTRL+Qt::Key_E));
|
||||
HIDE_ACTION(BrowseLibraryAction);
|
||||
|
||||
CREATE_ACTION_ICON(OpenFileAction, "open-file", tr("Open file"));
|
||||
CREATE_ACTION_ICON(OpenFileAction, "open-file", gt("open-file"));
|
||||
SET_SHORTCUT(OpenFileAction, QKeySequence::Open);
|
||||
connect(mpa_actions[OpenFileAction], &QAction::triggered,
|
||||
this, [=]() { openZimFile(); });
|
||||
|
||||
CREATE_ACTION(OpenRecentAction, tr("Open recent"));
|
||||
CREATE_ACTION(OpenRecentAction, gt("open-recent"));
|
||||
HIDE_ACTION(OpenRecentAction);
|
||||
|
||||
/* TODO See https://github.com/kiwix/kiwix-desktop/issues/77
|
||||
@ -305,35 +315,35 @@ void KiwixApp::createAction()
|
||||
HIDE_ACTION(SavePageAsAction);
|
||||
*/
|
||||
|
||||
CREATE_ACTION(SearchArticleAction, tr("Search article"));
|
||||
CREATE_ACTION(SearchArticleAction, gt("search-article"));
|
||||
SET_SHORTCUT(SearchArticleAction, QKeySequence(Qt::CTRL+Qt::Key_L));
|
||||
HIDE_ACTION(SearchArticleAction);
|
||||
|
||||
CREATE_ACTION(SearchLibraryAction, tr("Search in library"));
|
||||
CREATE_ACTION(SearchLibraryAction, gt("search-in-library"));
|
||||
SET_SHORTCUT(SearchLibraryAction, QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_R));
|
||||
HIDE_ACTION(SearchLibraryAction);
|
||||
|
||||
CREATE_ACTION(FindInPageAction, tr("Find in page"));
|
||||
CREATE_ACTION(FindInPageAction, gt("find-in-page"));
|
||||
mpa_actions[FindInPageAction]->setShortcuts({QKeySequence::Find, Qt::Key_F3});
|
||||
connect(mpa_actions[FindInPageAction], &QAction::triggered,
|
||||
this, [=]() { mp_tabWidget->openFindInPageBar(); });
|
||||
|
||||
CREATE_ACTION_ICON(ToggleFullscreenAction, "full-screen-enter", tr("Set fullScreen"));
|
||||
CREATE_ACTION_ICON(ToggleFullscreenAction, "full-screen-enter", gt("set-fullscreen"));
|
||||
SET_SHORTCUT(ToggleFullscreenAction, QKeySequence::FullScreen);
|
||||
connect(mpa_actions[ToggleFullscreenAction], &QAction::toggled,
|
||||
this, [=](bool checked) {
|
||||
auto action = mpa_actions[ToggleFullscreenAction];
|
||||
action->setIcon(
|
||||
QIcon(checked ? ":/icons/full-screen-exit.svg" : ":/icons/full-screen-enter.svg"));
|
||||
action->setText(checked ? tr("Quit fullScreen") : tr("Set fullScreen"));
|
||||
action->setText(checked ? gt("quit-fullscreen") : gt("set-fullscreen"));
|
||||
});
|
||||
mpa_actions[ToggleFullscreenAction]->setCheckable(true);
|
||||
|
||||
CREATE_ACTION(ToggleTOCAction, tr("Table of content"));
|
||||
CREATE_ACTION(ToggleTOCAction, gt("table-of-content"));
|
||||
SET_SHORTCUT(ToggleTOCAction, QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_1));
|
||||
HIDE_ACTION(ToggleTOCAction);
|
||||
|
||||
CREATE_ACTION_ICON(ToggleReadingListAction, "reading-list" ,tr("Reading list"));
|
||||
CREATE_ACTION_ICON(ToggleReadingListAction, "reading-list" ,gt("reading-list"));
|
||||
SET_SHORTCUT(ToggleReadingListAction, QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_2));
|
||||
connect(mpa_actions[ToggleReadingListAction], &QAction::triggered,
|
||||
this, [=]() { toggleSideBar(READINGLIST_BAR); });
|
||||
@ -343,37 +353,37 @@ void KiwixApp::createAction()
|
||||
QIcon((type == READINGLIST_BAR) ? ":/icons/reading-list-active.svg" : ":/icons/reading-list.svg"));
|
||||
});
|
||||
|
||||
CREATE_ACTION(ZoomInAction, tr("Zoom in"));
|
||||
CREATE_ACTION(ZoomInAction, gt("zoom-in"));
|
||||
SET_SHORTCUT(ZoomInAction, QKeySequence::ZoomIn);
|
||||
|
||||
CREATE_ACTION(ZoomOutAction, tr("Zoom out"));
|
||||
CREATE_ACTION(ZoomOutAction, gt("zoom-out"));
|
||||
SET_SHORTCUT(ZoomOutAction, QKeySequence::ZoomOut);
|
||||
|
||||
CREATE_ACTION(ZoomResetAction, tr("Zoom reset"));
|
||||
CREATE_ACTION(ZoomResetAction, gt("zoom-reset"));
|
||||
SET_SHORTCUT(ZoomResetAction, QKeySequence(Qt::CTRL+Qt::Key_0));
|
||||
|
||||
CREATE_ACTION(HelpAction, tr("Help"));
|
||||
CREATE_ACTION(HelpAction, gt("help"));
|
||||
SET_SHORTCUT(HelpAction, QKeySequence::HelpContents);
|
||||
HIDE_ACTION(HelpAction);
|
||||
|
||||
CREATE_ACTION(FeedbackAction, tr("Feedback"));
|
||||
CREATE_ACTION(FeedbackAction, gt("feedback"));
|
||||
HIDE_ACTION(FeedbackAction);
|
||||
|
||||
CREATE_ACTION(ReportBugAction, tr("Repost a bug"));
|
||||
CREATE_ACTION(ReportBugAction, gt("report-a-bug"));
|
||||
HIDE_ACTION(ReportBugAction);
|
||||
|
||||
CREATE_ACTION(RequestFeatureAction, tr("Request a feature"));
|
||||
CREATE_ACTION(RequestFeatureAction, gt("request-a-feature"));
|
||||
HIDE_ACTION(RequestFeatureAction);
|
||||
|
||||
CREATE_ACTION(AboutAction, tr("About Kiwix"));
|
||||
CREATE_ACTION(AboutAction, gt("about-kiwix"));
|
||||
|
||||
CREATE_ACTION_ICON(SettingAction, "settings", tr("Settings"));
|
||||
CREATE_ACTION_ICON(SettingAction, "settings", gt("settings"));
|
||||
SET_SHORTCUT(SettingAction, QKeySequence(Qt::Key_F12));
|
||||
|
||||
CREATE_ACTION_ICON(DonateAction, "donate", tr("Donate to support Kiwix"));
|
||||
CREATE_ACTION_ICON(DonateAction, "donate", gt("donate-to-support-kiwix"));
|
||||
SET_SHORTCUT(DonateAction, QKeySequence(Qt::CTRL+Qt::Key_D));
|
||||
|
||||
CREATE_ACTION_ICON(ExitAction, "exit", tr("Exit"));
|
||||
CREATE_ACTION_ICON(ExitAction, "exit", gt("exit"));
|
||||
SET_SHORTCUT(ExitAction, QKeySequence::Quit);
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "kprofile.h"
|
||||
#include "urlschemehandler.h"
|
||||
#include "settingsmanager.h"
|
||||
#include "translation.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QErrorMessage>
|
||||
@ -77,6 +78,7 @@ public:
|
||||
kiwix::KiwixServe* getLocalServer() { return mp_server; }
|
||||
SettingsManager* getSettingsManager() { return &m_settingsManager; };
|
||||
SideBarType getSideType() { return m_currentSideType; }
|
||||
QString getText(const QString &key) { return m_translation.getText(key); };
|
||||
|
||||
bool isCurrentArticleBookmarked();
|
||||
|
||||
@ -110,10 +112,13 @@ private:
|
||||
SideBarType m_currentSideType;
|
||||
QErrorMessage* mp_errorDialog;
|
||||
kiwix::KiwixServe* mp_server;
|
||||
Translation m_translation;
|
||||
|
||||
QAction* mpa_actions[MAX_ACTION];
|
||||
|
||||
QString findLibraryDirectory();
|
||||
};
|
||||
|
||||
QString gt(const QString &key);
|
||||
|
||||
#endif // KIWIXAPP_H
|
||||
|
@ -17,7 +17,7 @@ void KProfile::startDownload(QWebEngineDownloadItem* download)
|
||||
{
|
||||
QString defaultFileName = download->url().fileName();
|
||||
QString fileName = QFileDialog::getSaveFileName(KiwixApp::instance()->getMainWindow(),
|
||||
tr("Save File as"), defaultFileName);
|
||||
gt("save-file-as-window-title"), defaultFileName);
|
||||
if (fileName.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
@ -33,6 +33,6 @@ void KProfile::startDownload(QWebEngineDownloadItem* download)
|
||||
void KProfile::downloadFinished()
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("The document has been downloaded."));
|
||||
msgBox.setText(gt("download-finished-message"));
|
||||
msgBox.exec();
|
||||
}
|
||||
|
@ -32,6 +32,11 @@ LocalKiwixServer::LocalKiwixServer(QWidget *parent) :
|
||||
break;
|
||||
}
|
||||
}
|
||||
ui->label->setText(gt("local-kiwix-server"));
|
||||
ui->label->setStyleSheet("font-weight: bold;");
|
||||
ui->KiwixServerText->setText(gt("kiwix-server-description"));
|
||||
ui->OpenInBrowserButton->setText(gt("open-in-browser"));
|
||||
ui->KiwixServerButton->setText(gt("start-kiwix-server"));
|
||||
ui->OpenInBrowserButton->setVisible(false);
|
||||
ui->IpAddress->setVisible(false);
|
||||
}
|
||||
@ -69,15 +74,13 @@ void LocalKiwixServer::runOrStopServer()
|
||||
}
|
||||
|
||||
if (m_active) {
|
||||
ui->KiwixServerButton->setText("Stop Kiwix Server");
|
||||
QUrl url("qrc:/texts/kiwixServerRunningText.html");
|
||||
ui->KiwixServerText->setSource(url);
|
||||
ui->KiwixServerButton->setText(gt("stop-kiwix-server"));
|
||||
ui->KiwixServerText->setText(gt("kiwix-server-running-message"));
|
||||
ui->OpenInBrowserButton->setVisible(true);
|
||||
ui->IpAddress->setVisible(true);
|
||||
} else {
|
||||
ui->KiwixServerButton->setText("Start Kiwix Server");
|
||||
QUrl url("qrc:/texts/kiwixServerText.html");
|
||||
ui->KiwixServerText->setSource(url);
|
||||
ui->KiwixServerButton->setText(gt("start-kiwix-server"));
|
||||
ui->KiwixServerText->setText(gt("kiwix-server-description"));
|
||||
ui->OpenInBrowserButton->setVisible(false);
|
||||
ui->IpAddress->setVisible(false);
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ MainMenu::MainMenu(QWidget *parent) :
|
||||
ADD_ACTION(PrintAction);
|
||||
addSeparator();
|
||||
|
||||
m_fileMenu.setTitle(tr("File"));
|
||||
m_fileMenu.setTitle(gt("file"));
|
||||
m_fileMenu.ADD_ACTION(NewTabAction);
|
||||
m_fileMenu.ADD_ACTION(CloseTabAction);
|
||||
m_fileMenu.ADD_ACTION(ReopenClosedTabAction);
|
||||
@ -31,13 +31,13 @@ MainMenu::MainMenu(QWidget *parent) :
|
||||
|
||||
addMenu(&m_fileMenu);
|
||||
|
||||
m_editMenu.setTitle(tr("Edit"));
|
||||
m_editMenu.setTitle(gt("edit"));
|
||||
m_editMenu.ADD_ACTION(SearchArticleAction);
|
||||
m_editMenu.ADD_ACTION(SearchLibraryAction);
|
||||
m_editMenu.ADD_ACTION(FindInPageAction);
|
||||
addMenu(&m_editMenu);
|
||||
|
||||
m_viewMenu.setTitle(tr("View"));
|
||||
m_viewMenu.setTitle(gt("view"));
|
||||
m_viewMenu.ADD_ACTION(ToggleFullscreenAction);
|
||||
m_viewMenu.ADD_ACTION(ToggleTOCAction);
|
||||
m_viewMenu.ADD_ACTION(ToggleReadingListAction);
|
||||
@ -46,11 +46,11 @@ MainMenu::MainMenu(QWidget *parent) :
|
||||
m_viewMenu.ADD_ACTION(ZoomResetAction);
|
||||
addMenu(&m_viewMenu);
|
||||
|
||||
m_toolsMenu.setTitle(tr("Tools"));
|
||||
m_toolsMenu.setTitle(gt("tools"));
|
||||
// m_toolsMenu.addAction();
|
||||
// addMenu(&m_toolsMenu);
|
||||
|
||||
m_helpMenu.setTitle(tr("Help"));
|
||||
m_helpMenu.setTitle(gt("help"));
|
||||
m_helpMenu.ADD_ACTION(HelpAction);
|
||||
m_helpMenu.ADD_ACTION(FeedbackAction);
|
||||
m_helpMenu.ADD_ACTION(ReportBugAction);
|
||||
|
@ -32,7 +32,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
if (!title.isEmpty() && !title.startsWith("zim://"))
|
||||
setWindowTitle(title + " - Kiwix");
|
||||
else
|
||||
setWindowTitle(tr("Library") + " - Kiwix");
|
||||
setWindowTitle(gt("window-title"));
|
||||
});
|
||||
addAction(app->getAction(KiwixApp::OpenHomePageAction));
|
||||
#if !SYSTEMTITLEBAR
|
||||
|
@ -15,6 +15,7 @@ ReadingListBar::ReadingListBar(QWidget *parent) :
|
||||
this, &ReadingListBar::on_itemActivated);
|
||||
setupList();
|
||||
|
||||
ui->label->setText(gt("reading-list-title"));
|
||||
}
|
||||
|
||||
ReadingListBar::~ReadingListBar()
|
||||
|
@ -62,7 +62,7 @@ SearchBar::SearchBar(QWidget *parent) :
|
||||
m_completer(&m_completionModel, this),
|
||||
m_button(this)
|
||||
{
|
||||
setPlaceholderText(tr("Search"));
|
||||
setPlaceholderText(gt("search"));
|
||||
m_completer.setCompletionMode(QCompleter::UnfilteredPopupCompletion);
|
||||
m_completer.setCaseSensitivity(Qt::CaseInsensitive);
|
||||
setCompleter(&m_completer);
|
||||
|
@ -85,12 +85,22 @@ void SettingsManager::resetDownloadDir()
|
||||
void SettingsManager::browseDownloadDir()
|
||||
{
|
||||
QString dir = QFileDialog::getExistingDirectory(KiwixApp::instance()->getMainWindow(),
|
||||
tr("Browse Directory"),
|
||||
gt("browse-directory"),
|
||||
QString(),
|
||||
QFileDialog::ShowDirsOnly);
|
||||
emit(downloadDirChanged(dir));
|
||||
}
|
||||
|
||||
QStringList SettingsManager::getTranslations(const QStringList &keys)
|
||||
{
|
||||
QStringList translations;
|
||||
|
||||
for(auto& key: keys) {
|
||||
translations.append(KiwixApp::instance()->getText(key));
|
||||
}
|
||||
return translations;
|
||||
}
|
||||
|
||||
void SettingsManager::initSettings()
|
||||
{
|
||||
m_kiwixServerPort = m_settings.value("localKiwixServer/port", 8181).toInt();
|
||||
|
@ -25,6 +25,7 @@ public:
|
||||
qreal getZoomFactorByZimId(const QString &id);
|
||||
|
||||
public slots:
|
||||
QStringList getTranslations(const QStringList &keys);
|
||||
void setKiwixServerPort(int port);
|
||||
int getKiwixServerPort() { return m_kiwixServerPort; };
|
||||
void setZoomFactor(qreal zoomFactor);
|
||||
|
@ -52,7 +52,7 @@ TabBar::TabBar(QWidget *parent) :
|
||||
m_settingsIndex = index;
|
||||
auto view = KiwixApp::instance()->getSettingsManager()->getView();
|
||||
mp_stackedWidget->insertWidget(index, view);
|
||||
insertTab(index,QIcon(":/icons/settings.svg"), tr("Settings"));
|
||||
insertTab(index,QIcon(":/icons/settings.svg"), gt("settings"));
|
||||
QToolButton *tb = new QToolButton(this);
|
||||
tb->setDefaultAction(KiwixApp::instance()->getAction(KiwixApp::CloseTabAction));
|
||||
setTabButton(index, QTabBar::RightSide, tb);
|
||||
|
@ -12,8 +12,8 @@ TopWidget::TopWidget(QWidget *parent) :
|
||||
{
|
||||
mp_historyBackAction = new QAction(this);
|
||||
mp_historyBackAction->setIcon(QIcon(":/icons/back.svg"));
|
||||
mp_historyBackAction->setText(tr("back"));
|
||||
mp_historyBackAction->setToolTip(tr("back"));
|
||||
mp_historyBackAction->setText(gt("back"));
|
||||
mp_historyBackAction->setToolTip(gt("back"));
|
||||
mp_historyBackAction->setEnabled(false);
|
||||
connect(mp_historyBackAction, &QAction::triggered, [](){
|
||||
KiwixApp::instance()->getTabWidget()->triggerWebPageAction(QWebEnginePage::Back);
|
||||
@ -22,8 +22,8 @@ TopWidget::TopWidget(QWidget *parent) :
|
||||
widgetForAction(mp_historyBackAction)->setObjectName("backButton");
|
||||
mp_historyForwardAction = new QAction(this);
|
||||
mp_historyForwardAction->setIcon(QIcon(":/icons/forward.svg"));
|
||||
mp_historyForwardAction->setText(tr("forward"));
|
||||
mp_historyForwardAction->setToolTip(tr("forward"));
|
||||
mp_historyForwardAction->setText(gt("forward"));
|
||||
mp_historyForwardAction->setToolTip(gt("forward"));
|
||||
mp_historyForwardAction->setEnabled(false);
|
||||
connect(mp_historyForwardAction, &QAction::triggered, [](){
|
||||
KiwixApp::instance()->getTabWidget()->triggerWebPageAction(QWebEnginePage::Forward);
|
||||
|
51
src/translation.cpp
Normal file
51
src/translation.cpp
Normal file
@ -0,0 +1,51 @@
|
||||
#include "translation.h"
|
||||
#include <QFile>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QDebug>
|
||||
|
||||
Translation::Translation()
|
||||
{
|
||||
}
|
||||
|
||||
void Translation::setTranslation(QLocale locale)
|
||||
{
|
||||
auto defaultText = JsonFileToQMap(":/i18n/en.json");
|
||||
if (defaultText.isEmpty()) {
|
||||
throw std::runtime_error("Invalid translation file");
|
||||
}
|
||||
if (locale.bcp47Name() == "en") {
|
||||
m_translations = defaultText;
|
||||
return;
|
||||
}
|
||||
m_translations = JsonFileToQMap(":/i18n/" + locale.bcp47Name() + ".json");
|
||||
for (auto &key : defaultText.keys()) {
|
||||
if (!m_translations.contains(key) || m_translations.value(key).isEmpty()) {
|
||||
m_translations.insert(key, defaultText.value(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QMap<QString, QString> Translation::JsonFileToQMap(const QString &filePath)
|
||||
{
|
||||
QMap<QString, QString> translations;
|
||||
QFile file(filePath);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
return translations;
|
||||
}
|
||||
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
|
||||
file.close();
|
||||
if (doc.isNull()) {
|
||||
return translations;
|
||||
}
|
||||
auto jsonObj = doc.object();
|
||||
for (auto &key : jsonObj.keys()) {
|
||||
translations.insert(key, jsonObj.value(key).toString());
|
||||
}
|
||||
return translations;
|
||||
}
|
||||
|
||||
QString Translation::getText(const QString &key)
|
||||
{
|
||||
return (m_translations.contains(key)) ? m_translations.value(key) : key;
|
||||
}
|
23
src/translation.h
Normal file
23
src/translation.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef TRANSLATION_H
|
||||
#define TRANSLATION_H
|
||||
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
#include <QLocale>
|
||||
|
||||
class Translation
|
||||
{
|
||||
public:
|
||||
Translation();
|
||||
|
||||
void setTranslation(QLocale locale);
|
||||
QString getText(const QString &key);
|
||||
|
||||
private:
|
||||
QMap<QString, QString> JsonFileToQMap(const QString &filePath);
|
||||
|
||||
private:
|
||||
QMap<QString, QString> m_translations;
|
||||
};
|
||||
|
||||
#endif // TRANSLATION_H
|
@ -24,9 +24,7 @@
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-weight:600;">Local Kiwix server</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-weight:600;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu';">Starting a server allows other computers in the local network to access your Kiwix library with a standard web browser.</span></p></body></html></string>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -98,6 +96,13 @@ p, li { white-space: pre-wrap; }
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Local Kiwix Server</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user