Localizzazione EN di default: qsTr() su tutte le stringhe QML, catalogo italiano translations/harbour-calibreweb_it.ts, lrelease+install .qm nello spec (pattern quill), .pro aggiornato
This commit is contained in:
@@ -27,10 +27,18 @@ OTHER_FILES += \
|
|||||||
qml/cover/*.qml \
|
qml/cover/*.qml \
|
||||||
rpm/harbour-calibreweb.spec \
|
rpm/harbour-calibreweb.spec \
|
||||||
rpm/harbour-calibreweb.desktop \
|
rpm/harbour-calibreweb.desktop \
|
||||||
rpm/harbour-calibreweb.yaml
|
rpm/harbour-calibreweb.yaml \
|
||||||
|
translations/harbour-calibreweb_it.ts
|
||||||
|
|
||||||
DISTFILES += $$OTHER_FILES
|
DISTFILES += $$OTHER_FILES
|
||||||
|
|
||||||
|
# Translations are NOT handled by the sailfishapp_i18n template on the 5.1 kit
|
||||||
|
# (the .qm is never generated/installed reliably). The spec builds the .qm
|
||||||
|
# with lrelease and installs it into /usr/share/translations directly;
|
||||||
|
# libsailfishapp loads harbour-calibreweb_<locale>.qm automatically.
|
||||||
|
# Source strings are ENGLISH (default language); harbour-calibreweb_it.ts
|
||||||
|
# provides the Italian catalogue.
|
||||||
|
|
||||||
# Icone installate via make install (struttura standard Sailfish: icons/<size>/<name>.png)
|
# Icone installate via make install (struttura standard Sailfish: icons/<size>/<name>.png)
|
||||||
icons86.path = /usr/share/icons/hicolor/86x86/apps
|
icons86.path = /usr/share/icons/hicolor/86x86/apps
|
||||||
icons86.files = $$PWD/icons/86x86/harbour-calibreweb.png
|
icons86.files = $$PWD/icons/86x86/harbour-calibreweb.png
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ CoverBackground {
|
|||||||
|
|
||||||
Label {
|
Label {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: "Calibre Web"
|
text: qsTr("Calibre Web")
|
||||||
color: Theme.primaryColor
|
color: Theme.primaryColor
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ Page {
|
|||||||
|
|
||||||
Button {
|
Button {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: "Leggi (EPUB)"
|
text: qsTr("Read (EPUB)")
|
||||||
visible: page.hasEpubFormat()
|
visible: page.hasEpubFormat()
|
||||||
enabled: !page.downloading
|
enabled: !page.downloading
|
||||||
onClicked: startReading()
|
onClicked: startReading()
|
||||||
@@ -57,7 +57,7 @@ Page {
|
|||||||
visible: text.length > 0
|
visible: text.length > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeader { text: "Formati" }
|
SectionHeader { text: qsTr("Formats") }
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
model: bookData.formats
|
model: bookData.formats
|
||||||
@@ -109,7 +109,7 @@ Page {
|
|||||||
}
|
}
|
||||||
Label {
|
Label {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: "Download in corso…"
|
text: qsTr("Downloading…")
|
||||||
color: Theme.secondaryColor
|
color: Theme.secondaryColor
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
}
|
}
|
||||||
@@ -258,12 +258,12 @@ Page {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
page.downloadError = ""
|
page.downloadError = ""
|
||||||
page.downloadNotice = "Salvato in " + path
|
page.downloadNotice = qsTr("Saved to ") + path
|
||||||
hideNoticeTimer.restart()
|
hideNoticeTimer.restart()
|
||||||
} else {
|
} else {
|
||||||
page.downloadNotice = ""
|
page.downloadNotice = ""
|
||||||
page.readingNow = false
|
page.readingNow = false
|
||||||
page.downloadError = "Errore: " + error
|
page.downloadError = qsTr("Error: ") + error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Dialog {
|
|||||||
|
|
||||||
SilicaListView {
|
SilicaListView {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
header: DialogHeader { title: "Indice" }
|
header: DialogHeader { title: qsTr("Table of contents") }
|
||||||
model: dialog.model
|
model: dialog.model
|
||||||
|
|
||||||
delegate: ListItem {
|
delegate: ListItem {
|
||||||
@@ -35,7 +35,7 @@ Dialog {
|
|||||||
|
|
||||||
ViewPlaceholder {
|
ViewPlaceholder {
|
||||||
enabled: dialog.model.length === 0
|
enabled: dialog.model.length === 0
|
||||||
text: "Nessun capitolo"
|
text: qsTr("No chapters")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,18 +88,18 @@ Page {
|
|||||||
|
|
||||||
PullDownMenu {
|
PullDownMenu {
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Aggiorna"
|
text: qsTr("Refresh")
|
||||||
onClicked: reload()
|
onClicked: reload()
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Impostazioni"
|
text: qsTr("Settings")
|
||||||
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewPlaceholder {
|
ViewPlaceholder {
|
||||||
enabled: feedModel.count === 0 && !page.loading
|
enabled: feedModel.count === 0 && !page.loading
|
||||||
text: page.errorMessage.length > 0 ? page.errorMessage : "Nessun risultato"
|
text: page.errorMessage.length > 0 ? page.errorMessage : qsTr("No results")
|
||||||
}
|
}
|
||||||
|
|
||||||
BusyIndicator {
|
BusyIndicator {
|
||||||
@@ -168,7 +168,7 @@ Page {
|
|||||||
}
|
}
|
||||||
page.nextUrl = nextUrl
|
page.nextUrl = nextUrl
|
||||||
if (feedModel.count === 0 && page.errorMessage.length === 0)
|
if (feedModel.count === 0 && page.errorMessage.length === 0)
|
||||||
page.errorMessage = "Nessun risultato"
|
page.errorMessage = qsTr("No results")
|
||||||
}
|
}
|
||||||
onFeedError: {
|
onFeedError: {
|
||||||
page.loading = false
|
page.loading = false
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ Page {
|
|||||||
SilicaListView {
|
SilicaListView {
|
||||||
id: listView
|
id: listView
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
header: PageHeader { title: "Calibre Web" }
|
header: PageHeader { title: qsTr("Calibre Web") }
|
||||||
model: sectionModel
|
model: sectionModel
|
||||||
|
|
||||||
delegate: ListItem {
|
delegate: ListItem {
|
||||||
@@ -40,15 +40,15 @@ Page {
|
|||||||
|
|
||||||
PullDownMenu {
|
PullDownMenu {
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Cerca"
|
text: qsTr("Search")
|
||||||
onClicked: pageStack.push(Qt.resolvedUrl("SearchPage.qml"))
|
onClicked: pageStack.push(Qt.resolvedUrl("SearchPage.qml"))
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Impostazioni"
|
text: qsTr("Settings")
|
||||||
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Aggiorna"
|
text: qsTr("Refresh")
|
||||||
onClicked: loadIndex()
|
onClicked: loadIndex()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ Page {
|
|||||||
enabled: sectionModel.count === 0 && !page.loading
|
enabled: sectionModel.count === 0 && !page.loading
|
||||||
text: page.errorMessage.length > 0
|
text: page.errorMessage.length > 0
|
||||||
? page.errorMessage
|
? page.errorMessage
|
||||||
: "Apri le impostazioni e inserisci l'indirizzo del tuo Calibre Web"
|
: qsTr("Open the settings and enter your Calibre Web address")
|
||||||
}
|
}
|
||||||
|
|
||||||
BusyIndicator {
|
BusyIndicator {
|
||||||
@@ -74,7 +74,7 @@ Page {
|
|||||||
function loadIndex() {
|
function loadIndex() {
|
||||||
var base = appSettings.baseUrl
|
var base = appSettings.baseUrl
|
||||||
if (base.length === 0) {
|
if (base.length === 0) {
|
||||||
page.errorMessage = "Server non configurato"
|
page.errorMessage = qsTr("Server not configured")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
page.loading = true
|
page.loading = true
|
||||||
@@ -97,7 +97,7 @@ Page {
|
|||||||
sectionModel.append({ title: e.title, linkUrl: e.linkUrl })
|
sectionModel.append({ title: e.title, linkUrl: e.linkUrl })
|
||||||
}
|
}
|
||||||
if (sectionModel.count === 0)
|
if (sectionModel.count === 0)
|
||||||
page.errorMessage = "Nessuna sezione trovata nel feed OPDS"
|
page.errorMessage = qsTr("No sections found in the OPDS feed")
|
||||||
}
|
}
|
||||||
onFeedError: {
|
onFeedError: {
|
||||||
page.loading = false
|
page.loading = false
|
||||||
|
|||||||
@@ -22,14 +22,14 @@ Dialog {
|
|||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
||||||
DialogHeader {
|
DialogHeader {
|
||||||
title: "Margini del testo"
|
title: qsTr("Text margins")
|
||||||
acceptText: "Applica"
|
acceptText: qsTr("Apply")
|
||||||
}
|
}
|
||||||
|
|
||||||
Slider {
|
Slider {
|
||||||
id: lrSlider
|
id: lrSlider
|
||||||
width: parent.width
|
width: parent.width
|
||||||
label: "Margini laterali"
|
label: qsTr("Side margins")
|
||||||
minimumValue: 0
|
minimumValue: 0
|
||||||
maximumValue: 80
|
maximumValue: 80
|
||||||
stepSize: 4
|
stepSize: 4
|
||||||
@@ -44,7 +44,7 @@ Dialog {
|
|||||||
Slider {
|
Slider {
|
||||||
id: tbSlider
|
id: tbSlider
|
||||||
width: parent.width
|
width: parent.width
|
||||||
label: "Alto e basso"
|
label: qsTr("Top and bottom")
|
||||||
minimumValue: 0
|
minimumValue: 0
|
||||||
maximumValue: 80
|
maximumValue: 80
|
||||||
stepSize: 4
|
stepSize: 4
|
||||||
@@ -59,7 +59,7 @@ Dialog {
|
|||||||
Label {
|
Label {
|
||||||
x: Theme.horizontalPageMargin
|
x: Theme.horizontalPageMargin
|
||||||
width: parent.width - 2 * Theme.horizontalPageMargin
|
width: parent.width - 2 * Theme.horizontalPageMargin
|
||||||
text: "Le modifiche si applicano subito al testo. Conferma per salvarle per tutti i libri."
|
text: qsTr("Changes apply immediately. Confirm to save them for all books.")
|
||||||
color: Theme.secondaryColor
|
color: Theme.secondaryColor
|
||||||
wrapMode: Text.Wrap
|
wrapMode: Text.Wrap
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ Page {
|
|||||||
// il PullDownMenu va DENTRO una vista Silica, non a livello di Page
|
// il PullDownMenu va DENTRO una vista Silica, non a livello di Page
|
||||||
PullDownMenu {
|
PullDownMenu {
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Indice capitoli"
|
text: qsTr("Table of contents")
|
||||||
onClicked: showChapterList()
|
onClicked: showChapterList()
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Margini del testo"
|
text: qsTr("Text margins")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
var dlg = pageStack.push(Qt.resolvedUrl("MarginDialog.qml"), {
|
var dlg = pageStack.push(Qt.resolvedUrl("MarginDialog.qml"), {
|
||||||
marginLr: appSettings.readerMargin,
|
marginLr: appSettings.readerMargin,
|
||||||
@@ -50,11 +50,11 @@ Page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Impostazioni"
|
text: qsTr("Settings")
|
||||||
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Chiudi libro"
|
text: qsTr("Close book")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
page.maybeSave(true)
|
page.maybeSave(true)
|
||||||
pageStack.popTo(null)
|
pageStack.popTo(null)
|
||||||
@@ -164,7 +164,7 @@ Page {
|
|||||||
interval: 15000
|
interval: 15000
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
if (!web.loaded && !page.ready) {
|
if (!web.loaded && !page.ready) {
|
||||||
page.errorMessage = "Il lettore non risponde (WebView). Il file EPUB potrebbe essere danneggiato."
|
page.errorMessage = qsTr("The reader is not responding (WebView). The EPUB file may be damaged.")
|
||||||
page.ready = true
|
page.ready = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,7 +287,7 @@ Page {
|
|||||||
var html = book.chapterHtml(page.currentChapter, page.fontPx(),
|
var html = book.chapterHtml(page.currentChapter, page.fontPx(),
|
||||||
appSettings.readerMargin, appSettings.readerMarginV)
|
appSettings.readerMargin, appSettings.readerMarginV)
|
||||||
if (html.length === 0) {
|
if (html.length === 0) {
|
||||||
page.errorMessage = "Capitolo non leggibile"
|
page.errorMessage = qsTr("Chapter unreadable")
|
||||||
page.ready = true
|
page.ready = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -336,7 +336,7 @@ Page {
|
|||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
page.ready = false
|
page.ready = false
|
||||||
if (!book.open(page.epubPath)) {
|
if (!book.open(page.epubPath)) {
|
||||||
page.errorMessage = "Impossibile aprire il libro EPUB"
|
page.errorMessage = qsTr("Unable to open the EPUB file")
|
||||||
page.ready = true
|
page.ready = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,19 +12,19 @@ Page {
|
|||||||
id: column
|
id: column
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
||||||
PageHeader { title: "Cerca" }
|
PageHeader { title: qsTr("Search") }
|
||||||
|
|
||||||
SearchField {
|
SearchField {
|
||||||
id: searchField
|
id: searchField
|
||||||
width: parent.width
|
width: parent.width
|
||||||
placeholderText: "Titolo o autore…"
|
placeholderText: qsTr("Title or author…")
|
||||||
EnterKey.enabled: text.length > 0
|
EnterKey.enabled: text.length > 0
|
||||||
EnterKey.onClicked: search()
|
EnterKey.onClicked: search()
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: "Cerca"
|
text: qsTr("Search")
|
||||||
enabled: searchField.text.length > 0
|
enabled: searchField.text.length > 0
|
||||||
onClicked: search()
|
onClicked: search()
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ Page {
|
|||||||
Label {
|
Label {
|
||||||
x: Theme.horizontalPageMargin
|
x: Theme.horizontalPageMargin
|
||||||
width: parent.width - 2 * Theme.horizontalPageMargin
|
width: parent.width - 2 * Theme.horizontalPageMargin
|
||||||
text: "La ricerca usa il motore del server (OPDS search)."
|
text: qsTr("Search uses the server engine (OPDS search).")
|
||||||
color: Theme.secondaryColor
|
color: Theme.secondaryColor
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
wrapMode: Text.Wrap
|
wrapMode: Text.Wrap
|
||||||
@@ -47,6 +47,6 @@ Page {
|
|||||||
return
|
return
|
||||||
var url = base + "/opds/search?query=" + encodeURIComponent(query)
|
var url = base + "/opds/search?query=" + encodeURIComponent(query)
|
||||||
pageStack.push(Qt.resolvedUrl("FeedPage.qml"),
|
pageStack.push(Qt.resolvedUrl("FeedPage.qml"),
|
||||||
{ feedUrl: url, pageTitle: "Risultati: " + query })
|
{ feedUrl: url, pageTitle: qsTr("Results: ") + query })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-15
@@ -16,15 +16,15 @@ Page {
|
|||||||
id: column
|
id: column
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
||||||
PageHeader { title: "Impostazioni" }
|
PageHeader { title: qsTr("Settings") }
|
||||||
|
|
||||||
SectionHeader { text: "Server" }
|
SectionHeader { text: qsTr("Server") }
|
||||||
|
|
||||||
TextField {
|
TextField {
|
||||||
id: serverField
|
id: serverField
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
label: "Indirizzo Calibre Web"
|
label: qsTr("Calibre Web address")
|
||||||
placeholderText: "https://calibre.example.com"
|
placeholderText: "https://calibre.example.com"
|
||||||
text: appSettings.serverUrl
|
text: appSettings.serverUrl
|
||||||
inputMethodHints: Qt.ImhUrlCharactersOnly
|
inputMethodHints: Qt.ImhUrlCharactersOnly
|
||||||
@@ -35,7 +35,7 @@ Page {
|
|||||||
id: userField
|
id: userField
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
label: "Utente (vuoto = accesso anonimo)"
|
label: qsTr("User (empty = anonymous access)")
|
||||||
text: appSettings.username
|
text: appSettings.username
|
||||||
onTextChanged: appSettings.username = text
|
onTextChanged: appSettings.username = text
|
||||||
}
|
}
|
||||||
@@ -44,25 +44,25 @@ Page {
|
|||||||
id: passField
|
id: passField
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
label: "Password"
|
label: qsTr("Password")
|
||||||
text: appSettings.password
|
text: appSettings.password
|
||||||
echoMode: TextInput.Password
|
echoMode: TextInput.Password
|
||||||
onTextChanged: appSettings.password = text
|
onTextChanged: appSettings.password = text
|
||||||
}
|
}
|
||||||
|
|
||||||
TextSwitch {
|
TextSwitch {
|
||||||
text: "Ignora errori certificato SSL"
|
text: qsTr("Ignore SSL certificate errors")
|
||||||
description: "Da attivare se il server usa un certificato autofirmato"
|
description: qsTr("Enable if the server uses a self-signed certificate")
|
||||||
checked: appSettings.ignoreSslErrors
|
checked: appSettings.ignoreSslErrors
|
||||||
onCheckedChanged: appSettings.ignoreSslErrors = checked
|
onCheckedChanged: appSettings.ignoreSslErrors = checked
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeader { text: "Lettore" }
|
SectionHeader { text: qsTr("Reader") }
|
||||||
|
|
||||||
Slider {
|
Slider {
|
||||||
id: marginSlider
|
id: marginSlider
|
||||||
width: parent.width
|
width: parent.width
|
||||||
label: "Margini laterali"
|
label: qsTr("Side margins")
|
||||||
minimumValue: 0
|
minimumValue: 0
|
||||||
maximumValue: 80
|
maximumValue: 80
|
||||||
stepSize: 4
|
stepSize: 4
|
||||||
@@ -74,7 +74,7 @@ Page {
|
|||||||
Slider {
|
Slider {
|
||||||
id: marginVSlider
|
id: marginVSlider
|
||||||
width: parent.width
|
width: parent.width
|
||||||
label: "Margine alto e basso"
|
label: qsTr("Top and bottom margin")
|
||||||
minimumValue: 0
|
minimumValue: 0
|
||||||
maximumValue: 80
|
maximumValue: 80
|
||||||
stepSize: 4
|
stepSize: 4
|
||||||
@@ -83,11 +83,11 @@ Page {
|
|||||||
onValueChanged: appSettings.readerMarginV = value
|
onValueChanged: appSettings.readerMarginV = value
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeader { text: "Connessione" }
|
SectionHeader { text: qsTr("Connection") }
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: "Prova connessione"
|
text: qsTr("Test connection")
|
||||||
enabled: !page.testing
|
enabled: !page.testing
|
||||||
onClicked: testConnection()
|
onClicked: testConnection()
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ Page {
|
|||||||
function testConnection() {
|
function testConnection() {
|
||||||
var base = appSettings.serverUrl.trim()
|
var base = appSettings.serverUrl.trim()
|
||||||
if (base.length === 0) {
|
if (base.length === 0) {
|
||||||
page.testResult = "Inserisci l'indirizzo del server"
|
page.testResult = qsTr("Enter the server address")
|
||||||
page.testOk = false
|
page.testOk = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -127,7 +127,7 @@ Page {
|
|||||||
base = "https://" + base
|
base = "https://" + base
|
||||||
appSettings.serverUrl = base
|
appSettings.serverUrl = base
|
||||||
page.testing = true
|
page.testing = true
|
||||||
page.testResult = "Verifica in corso…"
|
page.testResult = qsTr("Testing…")
|
||||||
apiClient.getFeed(base + "/opds")
|
apiClient.getFeed(base + "/opds")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ Page {
|
|||||||
return
|
return
|
||||||
page.testing = false
|
page.testing = false
|
||||||
page.testOk = true
|
page.testOk = true
|
||||||
page.testResult = "Connessione OK: " + entries.length + " sezioni trovate"
|
page.testResult = qsTr("Connection OK: %1 sections found").arg(entries.length)
|
||||||
}
|
}
|
||||||
onFeedError: {
|
onFeedError: {
|
||||||
if (pageStack.currentPage !== page)
|
if (pageStack.currentPage !== page)
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ in locale.
|
|||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Wed Aug 19 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.2.0-1
|
* Wed Aug 19 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.2.0-1
|
||||||
|
- Localizzazione: lingua di default inglese (qsTr ovunque), catalogo
|
||||||
|
italiano harbour-calibreweb_it.ts/.qm installato in /usr/share/translations
|
||||||
- Fix configurazione persa: file di configurazione unico e fisso
|
- Fix configurazione persa: file di configurazione unico e fisso
|
||||||
(/home/nemo/.config/harbour/calibreweb.conf) indipendente dall'utente
|
(/home/nemo/.config/harbour/calibreweb.conf) indipendente dall'utente
|
||||||
che avvia l'app (launcher nemo / debug SSH defaultuser), con migrazione
|
che avvia l'app (launcher nemo / debug SSH defaultuser), con migrazione
|
||||||
@@ -46,12 +48,32 @@ in locale.
|
|||||||
%qmake5
|
%qmake5
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
|
# Translation catalogue: generated explicitly with lrelease (the sailfishapp_i18n
|
||||||
|
# template does not produce the .qm reliably on the 5.1 kit). The .ts lives in
|
||||||
|
# the source tree; sfdk uses the sources live (shadow build), so locate it
|
||||||
|
# across the possible layouts.
|
||||||
|
if [ -f %{_builddir}/../%{name}-%{version}/translations/%{name}_it.ts ]; then
|
||||||
|
TS=%{_builddir}/../%{name}-%{version}/translations/%{name}_it.ts
|
||||||
|
elif [ -f %{_builddir}/%{name}-%{version}/translations/%{name}_it.ts ]; then
|
||||||
|
TS=%{_builddir}/%{name}-%{version}/translations/%{name}_it.ts
|
||||||
|
elif [ -f %{_builddir}/translations/%{name}_it.ts ]; then
|
||||||
|
TS=%{_builddir}/translations/%{name}_it.ts
|
||||||
|
else
|
||||||
|
echo "ERROR: %{name}_it.ts not found" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
lrelease "$TS" -qm %{_builddir}/%{name}_it.qm
|
||||||
|
|
||||||
%install
|
%install
|
||||||
make install INSTALL_ROOT=%{buildroot}
|
make install INSTALL_ROOT=%{buildroot}
|
||||||
mkdir -p %{buildroot}%{_datadir}/applications
|
mkdir -p %{buildroot}%{_datadir}/applications
|
||||||
install -m 0644 %{SOURCE1} %{buildroot}%{_datadir}/applications/%{name}.desktop
|
install -m 0644 %{SOURCE1} %{buildroot}%{_datadir}/applications/%{name}.desktop
|
||||||
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop || true
|
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop || true
|
||||||
|
|
||||||
|
# Italian translation: installed from the spec, like the desktop file.
|
||||||
|
mkdir -p %{buildroot}/usr/share/translations
|
||||||
|
install -m 0644 %{_builddir}/%{name}_it.qm %{buildroot}/usr/share/translations/
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
%{_bindir}/%{name}
|
%{_bindir}/%{name}
|
||||||
@@ -59,3 +81,4 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop || tr
|
|||||||
%{_datadir}/icons/hicolor/86x86/apps/%{name}.png
|
%{_datadir}/icons/hicolor/86x86/apps/%{name}.png
|
||||||
%{_datadir}/icons/hicolor/108x108/apps/%{name}.png
|
%{_datadir}/icons/hicolor/108x108/apps/%{name}.png
|
||||||
%{_datadir}/%{name}/qml
|
%{_datadir}/%{name}/qml
|
||||||
|
/usr/share/translations/%{name}*.qm
|
||||||
|
|||||||
@@ -0,0 +1,277 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<TS version="2.1" language="it_IT">
|
||||||
|
<context>
|
||||||
|
<name>BookDetailPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/BookDetailPage.qml" line="36" />
|
||||||
|
<source>Read (EPUB)</source>
|
||||||
|
<translation type="finished">Leggi (EPUB)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/BookDetailPage.qml" line="60" />
|
||||||
|
<source>Formats</source>
|
||||||
|
<translation type="finished">Formati</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/BookDetailPage.qml" line="112" />
|
||||||
|
<source>Downloading…</source>
|
||||||
|
<translation type="finished">Download in corso…</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/BookDetailPage.qml" line="261" />
|
||||||
|
<source>Saved to </source>
|
||||||
|
<translation type="finished">Salvato in </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/BookDetailPage.qml" line="266" />
|
||||||
|
<source>Error: </source>
|
||||||
|
<translation type="finished">Errore: </translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>ChapterListDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ChapterListDialog.qml" line="12" />
|
||||||
|
<source>Table of contents</source>
|
||||||
|
<translation type="finished">Indice capitoli</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ChapterListDialog.qml" line="38" />
|
||||||
|
<source>No chapters</source>
|
||||||
|
<translation type="finished">Nessun capitolo</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CoverPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/cover/CoverPage.qml" line="18" />
|
||||||
|
<source>Calibre Web</source>
|
||||||
|
<translation type="finished">Calibre Web</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>FeedPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/FeedPage.qml" line="91" />
|
||||||
|
<source>Refresh</source>
|
||||||
|
<translation type="finished">Aggiorna</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/FeedPage.qml" line="95" />
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation type="finished">Impostazioni</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/FeedPage.qml" line="102" />
|
||||||
|
<location filename="../qml/pages/FeedPage.qml" line="171" />
|
||||||
|
<source>No results</source>
|
||||||
|
<translation type="finished">Nessun risultato</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>MainPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="13" />
|
||||||
|
<source>Calibre Web</source>
|
||||||
|
<translation type="finished">Calibre Web</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="43" />
|
||||||
|
<source>Search</source>
|
||||||
|
<translation type="finished">Cerca</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="47" />
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation type="finished">Impostazioni</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="51" />
|
||||||
|
<source>Refresh</source>
|
||||||
|
<translation type="finished">Aggiorna</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="60" />
|
||||||
|
<source>Open the settings and enter your Calibre Web address</source>
|
||||||
|
<translation type="finished">Apri le impostazioni e inserisci l'indirizzo del tuo Calibre Web</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="77" />
|
||||||
|
<source>Server not configured</source>
|
||||||
|
<translation type="finished">Server non configurato</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="100" />
|
||||||
|
<source>No sections found in the OPDS feed</source>
|
||||||
|
<translation type="finished">Nessuna sezione trovata nel feed OPDS</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>MarginDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MarginDialog.qml" line="25" />
|
||||||
|
<source>Text margins</source>
|
||||||
|
<translation type="finished">Margini del testo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MarginDialog.qml" line="26" />
|
||||||
|
<source>Apply</source>
|
||||||
|
<translation type="finished">Applica</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MarginDialog.qml" line="32" />
|
||||||
|
<source>Side margins</source>
|
||||||
|
<translation type="finished">Margini laterali</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MarginDialog.qml" line="47" />
|
||||||
|
<source>Top and bottom</source>
|
||||||
|
<translation type="finished">Alto e basso</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MarginDialog.qml" line="62" />
|
||||||
|
<source>Changes apply immediately. Confirm to save them for all books.</source>
|
||||||
|
<translation type="finished">Le modifiche si applicano subito al testo. Conferma per salvarle per tutti i libri.</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>ReaderPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="35" />
|
||||||
|
<source>Table of contents</source>
|
||||||
|
<translation type="finished">Indice capitoli</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="39" />
|
||||||
|
<source>Text margins</source>
|
||||||
|
<translation type="finished">Margini del testo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="53" />
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation type="finished">Impostazioni</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="57" />
|
||||||
|
<source>Close book</source>
|
||||||
|
<translation type="finished">Chiudi libro</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="167" />
|
||||||
|
<source>The reader is not responding (WebView). The EPUB file may be damaged.</source>
|
||||||
|
<translation type="finished">Il lettore non risponde (WebView). Il file EPUB potrebbe essere danneggiato.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="290" />
|
||||||
|
<source>Chapter unreadable</source>
|
||||||
|
<translation type="finished">Capitolo non leggibile</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/ReaderPage.qml" line="339" />
|
||||||
|
<source>Unable to open the EPUB file</source>
|
||||||
|
<translation type="finished">Impossibile aprire il libro EPUB</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SearchPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SearchPage.qml" line="15" />
|
||||||
|
<location filename="../qml/pages/SearchPage.qml" line="27" />
|
||||||
|
<source>Search</source>
|
||||||
|
<translation type="finished">Cerca</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SearchPage.qml" line="20" />
|
||||||
|
<source>Title or author…</source>
|
||||||
|
<translation type="finished">Titolo o autore…</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SearchPage.qml" line="35" />
|
||||||
|
<source>Search uses the server engine (OPDS search).</source>
|
||||||
|
<translation type="finished">La ricerca usa il motore del server (OPDS search).</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SearchPage.qml" line="50" />
|
||||||
|
<source>Results: </source>
|
||||||
|
<translation type="finished">Risultati: </translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SettingsPage</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="19" />
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation type="finished">Impostazioni</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="21" />
|
||||||
|
<source>Server</source>
|
||||||
|
<translation type="finished">Server</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="27" />
|
||||||
|
<source>Calibre Web address</source>
|
||||||
|
<translation type="finished">Indirizzo Calibre Web</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="38" />
|
||||||
|
<source>User (empty = anonymous access)</source>
|
||||||
|
<translation type="finished">Utente (vuoto = accesso anonimo)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="47" />
|
||||||
|
<source>Password</source>
|
||||||
|
<translation type="finished">Password</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="54" />
|
||||||
|
<source>Ignore SSL certificate errors</source>
|
||||||
|
<translation type="finished">Ignora errori certificato SSL</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="55" />
|
||||||
|
<source>Enable if the server uses a self-signed certificate</source>
|
||||||
|
<translation type="finished">Da attivare se il server usa un certificato autofirmato</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="60" />
|
||||||
|
<source>Reader</source>
|
||||||
|
<translation type="finished">Lettore</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="65" />
|
||||||
|
<source>Side margins</source>
|
||||||
|
<translation type="finished">Margini laterali</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="77" />
|
||||||
|
<source>Top and bottom margin</source>
|
||||||
|
<translation type="finished">Margine alto e basso</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="86" />
|
||||||
|
<source>Connection</source>
|
||||||
|
<translation type="finished">Connessione</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="90" />
|
||||||
|
<source>Test connection</source>
|
||||||
|
<translation type="finished">Prova connessione</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="121" />
|
||||||
|
<source>Enter the server address</source>
|
||||||
|
<translation type="finished">Inserisci l'indirizzo del server</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="130" />
|
||||||
|
<source>Testing…</source>
|
||||||
|
<translation type="finished">Verifica in corso…</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/SettingsPage.qml" line="141" />
|
||||||
|
<source>Connection OK: %1 sections found</source>
|
||||||
|
<translation type="finished">Connessione OK: %1 sezioni trovate</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
||||||
Reference in New Issue
Block a user