Merge pull request #387 from kiwix/wiki-translate

Prepare string files for Translatewiki
This commit is contained in:
Matthieu Gautier 2020-04-07 15:47:13 +02:00 committed by GitHub
commit c8ed41dea5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 365 additions and 557 deletions

View File

@ -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
View 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.

View File

@ -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&apos;onglet</translation>
</message>
<message>
<location filename="../../src/kiwixapp.cpp" line="272"/>
<source>Reopen closed tab</source>
<translation>Rouvrir l&apos;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&apos;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&apos;onglet</translation>
</message>
<message>
<source>Reopen closed tab</source>
<translation>Rouvrir l&apos;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&apos;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>

View File

@ -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);
});

View File

@ -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
View 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;
}

View File

@ -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>

View 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">

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/">
<file>i18n/kiwix-desktop_fr.qm</file>
<file>i18n/en.json</file>
</qresource>
</RCC>

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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);

View File

@ -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); });

View File

@ -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,

View File

@ -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;"

View File

@ -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);
}

View File

@ -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

View File

@ -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();
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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

View File

@ -15,6 +15,7 @@ ReadingListBar::ReadingListBar(QWidget *parent) :
this, &ReadingListBar::on_itemActivated);
setupList();
ui->label->setText(gt("reading-list-title"));
}
ReadingListBar::~ReadingListBar()

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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
View 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
View 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

View File

@ -24,9 +24,7 @@
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-weight:600;&quot;&gt;Local Kiwix server&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-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;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu';&quot;&gt;Starting a server allows other computers in the local network to access your Kiwix library with a standard web browser.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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/>