@@ -8,6 +8,10 @@
|
||||
setup.iss
|
||||
novelwriter.desktop
|
||||
novelWriter.pyw
|
||||
|
||||
# Translations
|
||||
/nw/assets/i18n/*.qm
|
||||
.qmake.stash
|
||||
i18n/*.qm
|
||||
i18n/*.qph
|
||||
|
||||
|
||||
@@ -39,6 +39,10 @@ Contributions to this project are welcome. However, please read the
|
||||
[Contributing Guide](https://github.com/vkbo/novelWriter/blob/main/CONTRIBUTING.md) before
|
||||
submitting larger additions or changes.
|
||||
|
||||
If you want to help translating novelWriter into another language, please see the
|
||||
[README](https://github.com/vkbo/novelWriter/blob/main/i18n/README.md) in the `nw/assets/i18n`
|
||||
folder.
|
||||
|
||||
## Key Features
|
||||
|
||||
Some key features of novelWriter are listed below. Consult the
|
||||
|
||||
+32
-34
@@ -1,58 +1,56 @@
|
||||
# novelWriter Internationalisation
|
||||
|
||||
The `i18n` folder contains the internationalisation files for novelWriter.
|
||||
There are two types of files. The `nw_XX.ts` / `nw_XX.qm` files are for
|
||||
localisation of the main GUI, and the `project_XX.json` files are JSON files
|
||||
with translation maps for the novelWriter projects, used by the Build Novel
|
||||
Project tool.
|
||||
The `i18n` folder contains the translation files for the Qt5 GUI. There are two types of files
|
||||
involved: the `nw_XX.ts` and the `nw_XX.qm` files. The `nw_XX.ts` files are located in the `i18n`
|
||||
folder at the root of the repository, and the `nw_XX.qm` together with the `project_XX.json` files
|
||||
are located in `nw/assets/i18n`. The latter are JSON files translation maps for the novelWriter
|
||||
projects, used by the Build Novel Project tool.
|
||||
|
||||
## GUI Localisation
|
||||
## Qt GUI Localisation
|
||||
|
||||
The `.qm` files are the actual files used by the application to translate the
|
||||
GUI into another language other than the default British English. The files are
|
||||
not generated by default. They can be built with:
|
||||
The `.qm` files are the actual files used by the application to translate the GUI into another
|
||||
language other than the default British English. The files are not generated by default. They can
|
||||
be built with:
|
||||
```bash
|
||||
python3 setup.py qtlrelease
|
||||
```
|
||||
|
||||
To add a new translation file, first add a new entry in the `novelWriter.pro`
|
||||
file under the `TRANSLATIONS` variable. Please use the underscore syntax for
|
||||
file names as the importer expects this format.
|
||||
To add a new translation file, first add a new entry in the `novelWriter.pro` file under the
|
||||
`TRANSLATIONS` variable. Please use the underscore syntax for file names as the importer expects
|
||||
this format.
|
||||
|
||||
After adding the entry in the `.pro` file, run:
|
||||
```bash
|
||||
python3 setup.py qtlupdate
|
||||
```
|
||||
|
||||
This will build a new `nw_XX.ts` file for the language you just added. The file
|
||||
can then be edited with the Qt 5 Linguist application provided by Qt. This is
|
||||
by far easier than manually editing the `.ts` file. Please select "English" and
|
||||
"United Kingdom" as the source langauge when prompted by Qt 5 Linguist.
|
||||
This will build a new `i18n/nw_XX.ts` file for the language you just added. The file can then be
|
||||
edited with the Qt 5 Linguist application provided by Qt. This is by far easier than manually
|
||||
editing the `.ts` file. Please select "English" and "United Kingdom" as the source langauge when
|
||||
prompted by Qt 5 Linguist.
|
||||
|
||||
When you're done editing, you can build the `nw_XX.qm` file and test it in
|
||||
novelWriter. The Preferences dialog should list the newly added language, and
|
||||
you can select it and test it.
|
||||
When you're done editing, you can build the `nw/assets/i18n/nw_XX.qm` file and test it in
|
||||
novelWriter. The Preferences dialog should list the newly added language, and you can select it and
|
||||
test it.
|
||||
|
||||
Please do not submit the `.qm` files to the repository. Only the `.ts` files
|
||||
Please do not submit the `.qm` files to the repository. Only the `.ts` files in the `i18n` folder
|
||||
are needed.
|
||||
|
||||
**Note:** This requires that you have the tools Qt 5 Linguist and `pylupdate5`
|
||||
**Note:** This requires that you have the tools Qt 5 Linguist and the PyQt5 tool `pylupdate5`
|
||||
installed on your system.
|
||||
|
||||
## Project Localisation
|
||||
|
||||
Projects can have a different language setting than the GUI itself. The files
|
||||
with format `project_XX.json` are simple translation maps for text that goes
|
||||
into the exported documents generated by the Build Novel Project tool.
|
||||
Projects can have a different language setting than the GUI itself. The files with format
|
||||
`project_XX.json` in `nw/assets/i18n` are simple translation maps for text that goes into the
|
||||
exported documents generated by the Build Novel Project tool.
|
||||
|
||||
The files are loaded based on the language setting on the build tool. At the
|
||||
present time, no other parts of the application use these files. Since these
|
||||
are used as replacement lookups, they are maintained as plain JSON files. The
|
||||
main usage is to generate chapter headers as number words.
|
||||
The files are loaded based on the language setting in the build tool. At the present time, no other
|
||||
parts of the application use these files. Since these are used as replacement lookups, they are
|
||||
maintained as plain JSON files. The main usage is to generate chapter headers as number words.
|
||||
|
||||
There is no trick to using these files. Just copy the `project_en.json` file,
|
||||
rename it to the appropriate language coded filename, and edit it. Please use
|
||||
the underscore as separator if a language needs to be localised to a specific
|
||||
country under a language. The importer will for instance look for `en_US`
|
||||
first, then use `en` if it is not found. If there are no matching files, the
|
||||
project falls back to using English.
|
||||
Adding new translations for these files is easy. Just copy the `project_en.json` file, rename it to
|
||||
the appropriate language coded filename, and edit it. Please use the underscore as separator if a
|
||||
language needs to be localised to a specific country under a language. The importer will for
|
||||
instance look for `en_US` first, then use `en` if it is not found. If there are no matching files,
|
||||
the project falls back to using English.
|
||||
|
||||
+6
-11
@@ -757,22 +757,17 @@
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="860"/>
|
||||
<location filename="../nw/tools/build.py" line="858"/>
|
||||
<source>Save Document As</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="998"/>
|
||||
<source>Unknown format</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1002"/>
|
||||
<location filename="../nw/tools/build.py" line="1001"/>
|
||||
<source>{0} file successfully written to:</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1009"/>
|
||||
<location filename="../nw/tools/build.py" line="1008"/>
|
||||
<source>Failed to write {0} file. {1}</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
@@ -780,17 +775,17 @@
|
||||
<context>
|
||||
<name>GuiBuildNovelDocView</name>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1209"/>
|
||||
<location filename="../nw/tools/build.py" line="1208"/>
|
||||
<source>This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1358"/>
|
||||
<location filename="../nw/tools/build.py" line="1357"/>
|
||||
<source>Unknown</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1360"/>
|
||||
<location filename="../nw/tools/build.py" line="1359"/>
|
||||
<source><b>Build Time:</b> {0}</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
|
||||
+6
-11
@@ -757,22 +757,17 @@
|
||||
<translation>PDF</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="860"/>
|
||||
<location filename="../nw/tools/build.py" line="858"/>
|
||||
<source>Save Document As</source>
|
||||
<translation>Enregistrer le document sous</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="998"/>
|
||||
<source>Unknown format</source>
|
||||
<translation>Format inconnu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1002"/>
|
||||
<location filename="../nw/tools/build.py" line="1001"/>
|
||||
<source>{0} file successfully written to:</source>
|
||||
<translation>Fichier {0} écrit dans :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1009"/>
|
||||
<location filename="../nw/tools/build.py" line="1008"/>
|
||||
<source>Failed to write {0} file. {1}</source>
|
||||
<translation>Erreur lors de l'écriture du fichier {0}. {1}</translation>
|
||||
</message>
|
||||
@@ -780,17 +775,17 @@
|
||||
<context>
|
||||
<name>GuiBuildNovelDocView</name>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1209"/>
|
||||
<location filename="../nw/tools/build.py" line="1208"/>
|
||||
<source>This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content.</source>
|
||||
<translation>Dans cette zone s'affichera le contenu du document à exporter ou à imprimer. Utilisez le bouton "Construire l'aperçu" pour générer le contenu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1358"/>
|
||||
<location filename="../nw/tools/build.py" line="1357"/>
|
||||
<source>Unknown</source>
|
||||
<translation>Inconnu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1360"/>
|
||||
<location filename="../nw/tools/build.py" line="1359"/>
|
||||
<source><b>Build Time:</b> {0}</source>
|
||||
<translation><b>Durée de construction :</b> {0}</translation>
|
||||
</message>
|
||||
|
||||
+6
-11
@@ -742,22 +742,17 @@
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="860"/>
|
||||
<location filename="../nw/tools/build.py" line="858"/>
|
||||
<source>Save Document As</source>
|
||||
<translation>Lagre dokumentet som</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="998"/>
|
||||
<source>Unknown format</source>
|
||||
<translation>Ukjent format</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1002"/>
|
||||
<location filename="../nw/tools/build.py" line="1001"/>
|
||||
<source>{0} file successfully written to:</source>
|
||||
<translation>Lagring av {0} var vellykket, og filen ble skrevet til:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1009"/>
|
||||
<location filename="../nw/tools/build.py" line="1008"/>
|
||||
<source>Failed to write {0} file. {1}</source>
|
||||
<translation>Misslykkes i å skrive {0} til. {1}</translation>
|
||||
</message>
|
||||
@@ -780,17 +775,17 @@
|
||||
<context>
|
||||
<name>GuiBuildNovelDocView</name>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1209"/>
|
||||
<location filename="../nw/tools/build.py" line="1208"/>
|
||||
<source>This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content.</source>
|
||||
<translation>Dette området vil vise innholdet av dokumentet som skal eksporteres. Trykk på knappen merket med "Lag forhåndsvisning" for å oppdatere innholdet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1358"/>
|
||||
<location filename="../nw/tools/build.py" line="1357"/>
|
||||
<source>Unknown</source>
|
||||
<translation>Ukjent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1360"/>
|
||||
<location filename="../nw/tools/build.py" line="1359"/>
|
||||
<source><b>Build Time:</b> {0}</source>
|
||||
<translation><b>Generert den:</b> {0}</translation>
|
||||
</message>
|
||||
|
||||
+6
-11
@@ -451,11 +451,6 @@
|
||||
<source>Plain HTML</source>
|
||||
<translation>HTML Simples</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="998"/>
|
||||
<source>Unknown format</source>
|
||||
<translation>Formato desconhecido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="450"/>
|
||||
<source>novelWriter HTML (.htm)</source>
|
||||
@@ -592,17 +587,17 @@
|
||||
<translation>Fechar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="860"/>
|
||||
<location filename="../nw/tools/build.py" line="858"/>
|
||||
<source>Save Document As</source>
|
||||
<translation>Salvar Documento Como</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1002"/>
|
||||
<location filename="../nw/tools/build.py" line="1001"/>
|
||||
<source>{0} file successfully written to:</source>
|
||||
<translation>Arquivo {0} escrito com sucesso para:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1009"/>
|
||||
<location filename="../nw/tools/build.py" line="1008"/>
|
||||
<source>Failed to write {0} file. {1}</source>
|
||||
<translation>Falhou para escrever o arquivo {0}. {1}</translation>
|
||||
</message>
|
||||
@@ -780,17 +775,17 @@
|
||||
<context>
|
||||
<name>GuiBuildNovelDocView</name>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1358"/>
|
||||
<location filename="../nw/tools/build.py" line="1357"/>
|
||||
<source>Unknown</source>
|
||||
<translation>Desconhecido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1209"/>
|
||||
<location filename="../nw/tools/build.py" line="1208"/>
|
||||
<source>This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content.</source>
|
||||
<translation>Esta área vai mostrar o conteúdo do documento a ser exportado ou impresso. Clique no botão "Construir Prévia" para gerar o conteúdo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../nw/tools/build.py" line="1360"/>
|
||||
<location filename="../nw/tools/build.py" line="1359"/>
|
||||
<source><b>Build Time:</b> {0}</source>
|
||||
<translation><b>Tempo de Construção:</b> {0}</translation>
|
||||
</message>
|
||||
|
||||
+1
-1
@@ -307,7 +307,7 @@ class Config:
|
||||
self.appIcon = os.path.join(self.iconPath, "novelwriter.svg")
|
||||
|
||||
# Internationalisation
|
||||
self.nwLangPath = os.path.join(self.appRoot, "i18n")
|
||||
self.nwLangPath = os.path.join(self.assetPath, "i18n")
|
||||
|
||||
logger.verbose("App path: %s" % self.appPath)
|
||||
logger.verbose("Last path: %s" % self.lastPath)
|
||||
|
||||
@@ -217,12 +217,36 @@ def buildQtDocs():
|
||||
def buildQtI18n():
|
||||
"""Build the lang.qm files for Qt Linguist.
|
||||
"""
|
||||
print("")
|
||||
print("Building Qt Localisation Files")
|
||||
print("==============================")
|
||||
print("")
|
||||
|
||||
try:
|
||||
subprocess.call(["lrelease", "-verbose", "novelWriter.pro"])
|
||||
except Exception as e:
|
||||
print("QtI18n Release Error:")
|
||||
print(str(e))
|
||||
|
||||
print("")
|
||||
print("Moving QM Files to Assets")
|
||||
print("")
|
||||
|
||||
langDir = os.path.join("nw", "assets", "i18n")
|
||||
for langFile in os.listdir("i18n"):
|
||||
langPath = os.path.join("i18n", langFile)
|
||||
if not os.path.isfile(langPath):
|
||||
continue
|
||||
|
||||
if langFile.endswith(".qm"):
|
||||
destPath = os.path.join(langDir, langFile)
|
||||
os.rename(langPath, destPath)
|
||||
print("Moved: %s -> %s" % (langPath, destPath))
|
||||
|
||||
print("")
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
# Qt Linguist TS Builder (qtlupdate)
|
||||
##
|
||||
@@ -230,12 +254,21 @@ def buildQtI18n():
|
||||
def buildQtI18nTS():
|
||||
"""Build the lang.ts files for Qt Linguist.
|
||||
"""
|
||||
print("")
|
||||
print("Building Qt Translation Files")
|
||||
print("=============================")
|
||||
print("")
|
||||
|
||||
try:
|
||||
subprocess.call(["pylupdate5", "-verbose", "-noobsolete", "novelWriter.pro"])
|
||||
except Exception as e:
|
||||
print("QtI18n Release Error:")
|
||||
print(str(e))
|
||||
|
||||
print("")
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
# Sample Project ZIP File Builder (sample)
|
||||
##
|
||||
|
||||
Reference in New Issue
Block a user