mirror of
https://github.com/fergalmoran/picard.git
synced 2025-12-22 17:28:58 +00:00
Merge pull request #1618 from phw/PICARD-1929-nsis-translation-transifex
PICARD-1929: Translate NSIS with Transifex
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -23,6 +23,7 @@ build/
|
||||
coverage.xml
|
||||
dist/
|
||||
installer/picard-setup.nsi
|
||||
installer/i18n/out/*.nsh
|
||||
locale/
|
||||
org.musicbrainz.Picard.appdata.xml
|
||||
picard.egg-info
|
||||
|
||||
@@ -15,6 +15,12 @@ source_file = po/appstream/picard-appstream.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[musicbrainz.picard_installer]
|
||||
file_filter = installer/i18n/sources/<lang>.json
|
||||
source_file = installer/i18n/sources/en.json
|
||||
source_lang = en
|
||||
type = KEYVALUEJSON
|
||||
|
||||
[musicbrainz.countries]
|
||||
file_filter = po/countries/<lang>.po
|
||||
source_file = po/countries/countries.pot
|
||||
|
||||
@@ -52,7 +52,7 @@ git ls-tree --full-tree -r HEAD --name-only |while read f; do sed -i '1s/^\xEF\x
|
||||
## Get latest translations from Transifex
|
||||
|
||||
```bash
|
||||
python setup.py get_po_files && git diff --quiet || git commit -m 'Update .po files' -- po/
|
||||
python setup.py pull_translations && git diff --quiet || git commit -m 'Update .po files' -- po/
|
||||
```
|
||||
|
||||
## Synchronize generated consts
|
||||
|
||||
74
installer/i18n/json2nsh.py
Executable file
74
installer/i18n/json2nsh.py
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Picard, the next-generation MusicBrainz tagger
|
||||
#
|
||||
# Copyright (C) 2020 Philipp Wolfer
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
import glob
|
||||
import json
|
||||
import os.path
|
||||
|
||||
import nshutil as nsh
|
||||
|
||||
|
||||
def language_from_filename(path):
|
||||
lang = os.path.splitext(os.path.basename(path))[0]
|
||||
return (nsh.code_to_language(lang), lang)
|
||||
|
||||
|
||||
def write_langstring(f, language, identifier, text):
|
||||
langstring = nsh.make_langstring(language, identifier, text)
|
||||
f.write(langstring)
|
||||
|
||||
|
||||
def merge_translations(*translations):
|
||||
merged = {}
|
||||
for trans in translations:
|
||||
for k, v in trans.items():
|
||||
if v:
|
||||
merged[k] = v
|
||||
return merged
|
||||
|
||||
|
||||
def main():
|
||||
scriptdir = os.path.dirname(os.path.abspath(__file__))
|
||||
sourcesdir = os.path.join(scriptdir, 'sources')
|
||||
outdir = os.path.join(scriptdir, 'out')
|
||||
os.makedirs(outdir, exist_ok=True)
|
||||
|
||||
# Read the english sources for defaults
|
||||
with open(os.path.join(sourcesdir, 'en.json'), 'r', encoding='utf-8') as infile:
|
||||
data_en = json.loads(infile.read())
|
||||
|
||||
for path in glob.glob(os.path.join(sourcesdir, '*.json')):
|
||||
language, language_code = language_from_filename(path)
|
||||
if not language:
|
||||
print(f'Unknown language code "{language_code}", skipping')
|
||||
continue
|
||||
target_file = os.path.join(outdir, f'{language}.nsh')
|
||||
print(f'{path} => {target_file}')
|
||||
with open(path, 'r', encoding='utf-8') as infile:
|
||||
data = json.loads(infile.read())
|
||||
data = merge_translations(data_en, data)
|
||||
with open(target_file, 'w+', encoding='utf-8') as outfile:
|
||||
for identifier, text in data.items():
|
||||
write_langstring(outfile, language, identifier, text)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
63
installer/i18n/nsh2json.py
Executable file
63
installer/i18n/nsh2json.py
Executable file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Picard, the next-generation MusicBrainz tagger
|
||||
#
|
||||
# Copyright (C) 2020 Philipp Wolfer
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
import glob
|
||||
import json
|
||||
import os.path
|
||||
|
||||
import nshutil as nsh
|
||||
|
||||
|
||||
def language_from_filename(path):
|
||||
lang = os.path.splitext(os.path.basename(path))[0]
|
||||
return (lang, nsh.language_to_code(lang))
|
||||
|
||||
|
||||
def extract_strings(f):
|
||||
for line in f:
|
||||
parsed = nsh.parse_langstring(line)
|
||||
if parsed:
|
||||
yield parsed
|
||||
|
||||
|
||||
def main():
|
||||
scriptdir = os.path.dirname(os.path.abspath(__file__))
|
||||
sourcesdir = os.path.join(scriptdir, 'sources')
|
||||
outdir = os.path.join(scriptdir, 'out')
|
||||
|
||||
for path in glob.glob(os.path.join(outdir, '*.nsh')):
|
||||
language, language_code = language_from_filename(path)
|
||||
if not language_code:
|
||||
print(f'Unknown language "{language}", skipping')
|
||||
continue
|
||||
target_file = os.path.join(sourcesdir, f'{language_code}.json')
|
||||
print(f'{path} => {target_file}')
|
||||
with open(path, 'r', encoding='utf-8') as infile:
|
||||
output = {}
|
||||
for identifier, text in extract_strings(infile):
|
||||
output[identifier] = text
|
||||
|
||||
with open(target_file, 'w+', encoding='utf-8') as outfile:
|
||||
outfile.write(json.dumps(output, ensure_ascii=False, indent=4))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
150
installer/i18n/nshutil.py
Normal file
150
installer/i18n/nshutil.py
Normal file
@@ -0,0 +1,150 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Picard, the next-generation MusicBrainz tagger
|
||||
#
|
||||
# Copyright (C) 2020 Philipp Wolfer
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
import re
|
||||
|
||||
|
||||
# See list of available NSIS languages at
|
||||
# https://sourceforge.net/p/nsis/code/HEAD/tree/NSIS/trunk/Contrib/Language%20files/
|
||||
LANGUAGES = {
|
||||
'Afrikaans': 'af',
|
||||
'Albanian': 'sq',
|
||||
'Arabic': 'ar',
|
||||
'Asturian': 'ast',
|
||||
'Basque': 'eu',
|
||||
'Belarusian': 'be',
|
||||
'Bosnian': 'bs',
|
||||
'Breton': 'br',
|
||||
'Bulgarian': 'bg',
|
||||
'Catalan': 'ca',
|
||||
'Cibemba': 'bem',
|
||||
'Corsican': 'co',
|
||||
'Croation': 'hr',
|
||||
'Czech': 'cs',
|
||||
'Danish': 'da',
|
||||
'Dutch': 'nl',
|
||||
'English': 'en',
|
||||
'Esperanto': 'eo',
|
||||
'Estonian': 'et',
|
||||
'Farsi': 'fa',
|
||||
'Finnish': 'fi',
|
||||
'French': 'fr',
|
||||
'Galician': 'gl',
|
||||
'Georgian': 'ka',
|
||||
'German': 'de',
|
||||
'Greek': 'el',
|
||||
'Hebrew': 'he',
|
||||
'Hindi': 'hi',
|
||||
'Hungarian': 'hu',
|
||||
'Icelandic': 'is',
|
||||
'Igbo': 'ig',
|
||||
'Indonesian': 'id',
|
||||
'Irish': 'ga',
|
||||
'Italian': 'it',
|
||||
'Japanese': 'ja',
|
||||
'Khmer': 'km',
|
||||
'Korean': 'ko',
|
||||
'Kurdish': 'ku',
|
||||
'Latvian': 'lv',
|
||||
'Lithuanian': 'lt',
|
||||
'Luxembourgish': 'lb',
|
||||
'Macedonian': 'mk',
|
||||
'Malagasy': 'mg',
|
||||
'Malay': 'ms_MY',
|
||||
'Mongolian': 'mn',
|
||||
'Norwegian': 'nb',
|
||||
'NorwegianNynorsk': 'nn',
|
||||
'Polish': 'pl',
|
||||
'Portuguese': 'pt',
|
||||
'PortugueseBR': 'pt_BR',
|
||||
'Romanian': 'ro',
|
||||
'Russian': 'ru',
|
||||
'ScotsGaelic': 'sco',
|
||||
'Serbian': 'sr',
|
||||
'SimpChinese': 'zh-Hans',
|
||||
'Slovak': 'sk',
|
||||
'Slovenian': 'sl',
|
||||
'Spanish': 'es',
|
||||
'Swahili': 'sw',
|
||||
'Swedish': 'sv',
|
||||
'Tatar': 'tt',
|
||||
'Thai': 'th',
|
||||
'TradChinese': 'zh-Hant',
|
||||
'Turkish': 'tr',
|
||||
'Ukrainian': 'uk',
|
||||
'Uzbek': 'uz',
|
||||
'Vietnamese': 'vi',
|
||||
'Welsh': 'cy',
|
||||
'Yoruba': 'yo',
|
||||
}
|
||||
|
||||
_R_LANGUAGES = dict([(code, name) for name, code in LANGUAGES.items()])
|
||||
|
||||
# See https://nsis.sourceforge.io/Docs/Chapter4.html#varstrings
|
||||
ESCAPE_CHARS = {
|
||||
r'$\r': '\r',
|
||||
r'$\n': '\n',
|
||||
r'$\t': '\t',
|
||||
r'$\"': '"',
|
||||
r'$\'': "'",
|
||||
r'$\`': '`',
|
||||
}
|
||||
|
||||
RE_LANGSTRING_LINE = re.compile(r'LangString\s+(?P<identifier>[A-Za-z0-9_]+)\s+\${LANG_[A-Z]+}\s+["\'`](?P<text>.*)["\'`]$')
|
||||
|
||||
|
||||
def language_to_code(language):
|
||||
return LANGUAGES.get(language)
|
||||
|
||||
|
||||
def code_to_language(language_code):
|
||||
return _R_LANGUAGES.get(language_code)
|
||||
|
||||
|
||||
def escape_string(text):
|
||||
for escape, char in ESCAPE_CHARS.items():
|
||||
if char in ("'", "`"): # No need to escape quotes other than ""
|
||||
continue
|
||||
text = text.replace(char, escape)
|
||||
return text
|
||||
|
||||
|
||||
def unescape_string(text):
|
||||
for escape, char in ESCAPE_CHARS.items():
|
||||
text = text.replace(escape, char)
|
||||
return text
|
||||
|
||||
|
||||
def parse_langstring(line):
|
||||
match = RE_LANGSTRING_LINE.match(line)
|
||||
if match:
|
||||
return (
|
||||
match.group('identifier'),
|
||||
unescape_string(match.group('text'))
|
||||
)
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def make_langstring(language, identifier, text):
|
||||
language = language.upper()
|
||||
text = escape_string(text)
|
||||
return f'LangString {identifier} ${{LANG_{language}}} "{text}"\n'
|
||||
16
installer/i18n/sources/de.json
Normal file
16
installer/i18n/sources/de.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"MsgAlreadyInstalled": "${PRODUCT_NAME} ist bereits installiert. \n\nKlicken Sie „OK“ um die vorherige Version zu deinstallieren oder „Abbrechen“ um das Update abzubrechen.",
|
||||
"MsgApplicationRunning": "Die Anwendung ${PRODUCT_NAME} wird ausgeführt. Bitte schließen und erneut versuchen.",
|
||||
"MsgRequires64Bit": "Diese Version von ${PRODUCT_NAME} erfordert ein 64-bit Windows-System.",
|
||||
"MuiDescriptionRequired": "Installiert ${PRODUCT_NAME} mit den für die Ausführung erforderlichen Dateien.",
|
||||
"MuiDescriptionLang": "Installiert Übersetzungen von ${PRODUCT_NAME} in verschiedenen Sprachen.",
|
||||
"MuiDescriptionShortcuts": "Installiert Verknüpfungen, um ${PRODUCT_NAME} zu starten.",
|
||||
"MuiDescriptionDesktop": "Installiert eine Verknüpfung auf dem Desktop.",
|
||||
"MuiDescriptionStarteMenu": "Installiert eine Verknüpfung im Startmenü.",
|
||||
"OptionRemoveSettings": "Einstellungen und persönliche Daten entfernen",
|
||||
"SectionDesktop": "Desktop",
|
||||
"SectionLanguages": "Sprachen",
|
||||
"SectionRequired": "Programmdateien (erforderlich)",
|
||||
"SectionShortcuts": "Verknüpfungen",
|
||||
"SectionStartMenu": "Startmenü"
|
||||
}
|
||||
16
installer/i18n/sources/en.json
Normal file
16
installer/i18n/sources/en.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"MsgAlreadyInstalled": "${PRODUCT_NAME} is already installed. \n\nClick \"OK\" to uninstall the previous version or \"Cancel\" to cancel this upgrade.",
|
||||
"MsgApplicationRunning": "The application ${PRODUCT_NAME} is running. Please close it and try again.",
|
||||
"MsgRequires64Bit": "This version of ${PRODUCT_NAME} requires a 64-bit Windows system.",
|
||||
"MuiDescriptionRequired": "Installs ${PRODUCT_NAME} along with the necessary files for it run.",
|
||||
"MuiDescriptionLang": "Installs translations of ${PRODUCT_NAME} in different languages.",
|
||||
"MuiDescriptionShortcuts": "Installs shortcuts to launch ${PRODUCT_NAME}.",
|
||||
"MuiDescriptionDesktop": "Installs a shortcut on the desktop.",
|
||||
"MuiDescriptionStarteMenu": "Installs a shortcut in the Start Menu.",
|
||||
"OptionRemoveSettings": "Remove settings and personal data",
|
||||
"SectionDesktop": "Desktop",
|
||||
"SectionLanguages": "Languages",
|
||||
"SectionRequired": "Program files (required)",
|
||||
"SectionShortcuts": "Shortcuts",
|
||||
"SectionStartMenu": "Start menu"
|
||||
}
|
||||
16
installer/i18n/sources/es.json
Normal file
16
installer/i18n/sources/es.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"MsgAlreadyInstalled": "${PRODUCT_NAME} ya está instalado . \n\nClick \"OK\" para desinstalar la versión anterior o \"Cancel\" para cancelar esta actualización. ",
|
||||
"MsgApplicationRunning": "La aplicación ${PRODUCT_NAME} está en marcha. Por favor cierrelo e inténtelo de nuevo.",
|
||||
"MsgRequires64Bit": "La versión de ${PRODUCT_NAME} requiere un Windows de 64-bits.",
|
||||
"MuiDescriptionRequired": "Instalar ${PRODUCT_NAME} junto con los archivos necesarios para que funcione.",
|
||||
"MuiDescriptionLang": "Instalar traducciones de ${PRODUCT_NAME} en diferentes lenguajes.",
|
||||
"MuiDescriptionShortcuts": "Instalar atajos para iniciar ${PRODUCT_NAME}.",
|
||||
"MuiDescriptionDesktop": "Instalar un atajo en el escritorio",
|
||||
"MuiDescriptionStarteMenu": "Instalar un atajo en el Menú de Inicio",
|
||||
"OptionRemoveSettings": "Remover ajustes e información personal",
|
||||
"SectionDesktop": "Escritorio",
|
||||
"SectionLanguages": "Idiomas",
|
||||
"SectionRequired": "Archivos de programa (requerido)",
|
||||
"SectionShortcuts": "Atajos",
|
||||
"SectionStartMenu": "Menú de inicio"
|
||||
}
|
||||
16
installer/i18n/sources/fr.json
Normal file
16
installer/i18n/sources/fr.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"MsgAlreadyInstalled": "${PRODUCT_NAME} est déjà installé. \n\nCliquez sur « OK » pour désinstaller la version précédente ou « Annuler » pour annuler cette mise à jour.",
|
||||
"MsgApplicationRunning": "L’application ${PRODUCT_NAME} est en cours d’exécution. Veuillez la stopper et essayer à nouveau.",
|
||||
"MsgRequires64Bit": "Cette version de ${PRODUCT_NAME} requiert un système Windows 64 bits.",
|
||||
"MuiDescriptionRequired": "Installe ${PRODUCT_NAME} ainsi que les fichiers nécessaires à son exécution.",
|
||||
"MuiDescriptionLang": "Installe les traductions de ${PRODUCT_NAME} dans différentes langues.",
|
||||
"MuiDescriptionShortcuts": "Installe les raccourcis pour lancer ${PRODUCT_NAME}.",
|
||||
"MuiDescriptionDesktop": "Installe un raccourci sur le bureau.",
|
||||
"MuiDescriptionStarteMenu": "Installe un raccourci dans le menu Démarrer.",
|
||||
"OptionRemoveSettings": "Supprimer les préférences et les données personnelles",
|
||||
"SectionDesktop": "Bureau",
|
||||
"SectionLanguages": "Langues",
|
||||
"SectionRequired": "Fichiers du programme (requis)",
|
||||
"SectionShortcuts": "Raccourcis",
|
||||
"SectionStartMenu": "Menu Démarrer"
|
||||
}
|
||||
16
installer/i18n/sources/it.json
Normal file
16
installer/i18n/sources/it.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"MsgAlreadyInstalled": "${PRODUCT_NAME} è già installato.\n\nFai clic su 'OK' per disinstallare la versione installata o su 'Annulla' per annullare l'aggiornamento.",
|
||||
"MsgApplicationRunning": "L'applicazione ${PRODUCT_NAME} è in esecuzione.\nChiudi l'applicazione e riprova.",
|
||||
"MsgRequires64Bit": "Questa versione di ${PRODUCT_NAME} richiede un sistema Windows a 64bit.",
|
||||
"MuiDescriptionRequired": "Installa ${PRODUCT_NAME} e i relativi file necessari alla sua esecuzione.",
|
||||
"MuiDescriptionLang": "Installa le traduzioni di ${PRODUCT_NAME} per le differenti lingue.",
|
||||
"MuiDescriptionShortcuts": "Installa collegamenti per eseguire ${PRODUCT_NAME}.",
|
||||
"MuiDescriptionDesktop": "Installa collegamento sul desktop.",
|
||||
"MuiDescriptionStarteMenu": "Installa collegamento nel menu Start.",
|
||||
"OptionRemoveSettings": "Elimina impostazioni e dati personali",
|
||||
"SectionDesktop": "Desktop",
|
||||
"SectionLanguages": "Lingue",
|
||||
"SectionRequired": "File programma (richiesti)",
|
||||
"SectionShortcuts": "Collegamenti",
|
||||
"SectionStartMenu": "Menu Start"
|
||||
}
|
||||
16
installer/i18n/sources/nl.json
Normal file
16
installer/i18n/sources/nl.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"MsgAlreadyInstalled": "${PRODUCT_NAME} is al geïnstalleerd. \n\nKlik op “OK” om de vorige versie te verwijderen of op “Annuleren” om de installatie te annuleren.",
|
||||
"MsgApplicationRunning": "De applicatie ${PRODUCT_NAME} is nog actief. Sluit haar af en probeer het opnieuw.",
|
||||
"MsgRequires64Bit": "Voor deze versie van ${PRODUCT_NAME} heb je een 64 bitssysteem nodig.",
|
||||
"MuiDescriptionRequired": "Installeert ${PRODUCT_NAME} en de bestanden die het nodig heeft om te draaien.",
|
||||
"MuiDescriptionLang": "Installeert vertalingen van ${PRODUCT_NAME}.",
|
||||
"MuiDescriptionShortcuts": "Installeert snelkoppelingen om ${PRODUCT_NAME} te starten.",
|
||||
"MuiDescriptionDesktop": "Installeert een snelkoppeling op het bureaublad.",
|
||||
"MuiDescriptionStarteMenu": "Installeert een snelkoppeling in het startmenu.",
|
||||
"OptionRemoveSettings": "Verwijder instellingen en persoonlijke gegevens",
|
||||
"SectionDesktop": "Bureaublad",
|
||||
"SectionLanguages": "Talen",
|
||||
"SectionRequired": "Programmabestanden (vereist)",
|
||||
"SectionShortcuts": "Snelkoppelingen",
|
||||
"SectionStartMenu": "Startmenu"
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
LangString MsgAlreadyInstalled ${LANG_DUTCH} '${PRODUCT_NAME} is al geïnstalleerd. $\n$\nKlik op “OK” om de vorige versie te verwijderen of op “Annuleren” om de installatie te annuleren.'
|
||||
LangString MsgApplicationRunning ${LANG_DUTCH} "De applicatie ${PRODUCT_NAME} is nog actief. Sluit haar af en probeer het opnieuw."
|
||||
LangString MsgRequires64Bit ${LANG_DUTCH} "Voor deze versie van ${PRODUCT_NAME} heb je een 64 bitssysteem nodig."
|
||||
LangString MuiDescriptionRequired ${LANG_DUTCH} "Installeert ${PRODUCT_NAME} en de bestanden die het nodig heeft om te draaien."
|
||||
LangString MuiDescriptionLang ${LANG_DUTCH} "Installeert vertalingen van ${PRODUCT_NAME}."
|
||||
LangString MuiDescriptionShortcuts ${LANG_DUTCH} "Installeert snelkoppelingen om ${PRODUCT_NAME} te starten."
|
||||
LangString MuiDescriptionDesktop ${LANG_DUTCH} "Installeert een snelkoppeling op het bureaublad."
|
||||
LangString MuiDescriptionStarteMenu ${LANG_DUTCH} "Installeert een snelkoppeling in het startmenu."
|
||||
LangString OptionRemoveSettings ${LANG_DUTCH} "Verwijder instellingen en persoonlijke gegevens"
|
||||
LangString SectionDesktop ${LANG_DUTCH} "Bureaublad"
|
||||
LangString SectionLanguages ${LANG_DUTCH} "Talen"
|
||||
LangString SectionRequired ${LANG_DUTCH} "Programmabestanden (vereist)"
|
||||
LangString SectionShortcuts ${LANG_DUTCH} "Snelkoppelingen"
|
||||
LangString SectionStartMenu ${LANG_DUTCH} "Startmenu"
|
||||
@@ -1,14 +0,0 @@
|
||||
LangString MsgAlreadyInstalled ${LANG_ENGLISH} '${PRODUCT_NAME} is already installed. $\n$\nClick "OK" to uninstall the previous version or "Cancel" to cancel this upgrade.'
|
||||
LangString MsgApplicationRunning ${LANG_ENGLISH} "The application ${PRODUCT_NAME} is running. Please close it and try again."
|
||||
LangString MsgRequires64Bit ${LANG_ENGLISH} "This version of ${PRODUCT_NAME} requires a 64-bit Windows system."
|
||||
LangString MuiDescriptionRequired ${LANG_ENGLISH} "Installs ${PRODUCT_NAME} along with the necessary files for it run."
|
||||
LangString MuiDescriptionLang ${LANG_ENGLISH} "Installs translations of ${PRODUCT_NAME} in different languages."
|
||||
LangString MuiDescriptionShortcuts ${LANG_ENGLISH} "Installs shortcuts to launch ${PRODUCT_NAME}."
|
||||
LangString MuiDescriptionDesktop ${LANG_ENGLISH} "Installs a shortcut on the desktop."
|
||||
LangString MuiDescriptionStarteMenu ${LANG_ENGLISH} "Installs a shortcut in the Start Menu."
|
||||
LangString OptionRemoveSettings ${LANG_ENGLISH} "Remove settings and personal data"
|
||||
LangString SectionDesktop ${LANG_ENGLISH} "Desktop"
|
||||
LangString SectionLanguages ${LANG_ENGLISH} "Languages"
|
||||
LangString SectionRequired ${LANG_ENGLISH} "Program files (required)"
|
||||
LangString SectionShortcuts ${LANG_ENGLISH} "Shortcuts"
|
||||
LangString SectionStartMenu ${LANG_ENGLISH} "Start menu"
|
||||
@@ -1,14 +0,0 @@
|
||||
LangString MsgAlreadyInstalled ${LANG_FRENCH} '${PRODUCT_NAME} est déjà installé. $\n$\nCliquez sur « OK » pour désinstaller la version précédente ou « Annuler » pour annuler cette mise à jour.'
|
||||
LangString MsgApplicationRunning ${LANG_FRENCH} "L’application ${PRODUCT_NAME} est en cours d’exécution. Veuillez la stopper et essayer à nouveau."
|
||||
LangString MsgRequires64Bit ${LANG_FRENCH} "Cette version de ${PRODUCT_NAME} requiert un système Windows 64 bits."
|
||||
LangString MuiDescriptionRequired ${LANG_FRENCH} "Installe ${PRODUCT_NAME} ainsi que les fichiers nécessaires à son exécution."
|
||||
LangString MuiDescriptionLang ${LANG_FRENCH} "Installe les traductions de ${PRODUCT_NAME} dans différentes langues."
|
||||
LangString MuiDescriptionShortcuts ${LANG_FRENCH} "Installe les raccourcis pour lancer ${PRODUCT_NAME}."
|
||||
LangString MuiDescriptionDesktop ${LANG_FRENCH} "Installe un raccourci sur le bureau."
|
||||
LangString MuiDescriptionStarteMenu ${LANG_FRENCH} "Installe un raccourci dans le menu Démarrer."
|
||||
LangString OptionRemoveSettings ${LANG_FRENCH} "Supprimer les préférences et les données personnelles"
|
||||
LangString SectionDesktop ${LANG_FRENCH} "Bureau"
|
||||
LangString SectionLanguages ${LANG_FRENCH} "Langues"
|
||||
LangString SectionRequired ${LANG_FRENCH} "Fichiers du programme (requis)"
|
||||
LangString SectionShortcuts ${LANG_FRENCH} "Raccourcis"
|
||||
LangString SectionStartMenu ${LANG_FRENCH} "Menu Démarrer"
|
||||
@@ -1,14 +0,0 @@
|
||||
LangString MsgAlreadyInstalled ${LANG_GERMAN} "${PRODUCT_NAME} ist bereits installiert. $\n$\nKlicken Sie „OK“ um die vorherige Version zu deinstallieren oder „Abbrechen“ um das Update abzubrechen."
|
||||
LangString MsgApplicationRunning ${LANG_GERMAN} "Die Anwendung ${PRODUCT_NAME} wird ausgeführt. Bitte schließen und erneut versuchen."
|
||||
LangString MsgRequires64Bit ${LANG_GERMAN} "Diese Version von ${PRODUCT_NAME} erfordert ein 64-bit Windows-System."
|
||||
LangString MuiDescriptionRequired ${LANG_GERMAN} "Installiert ${PRODUCT_NAME} mit den für die Ausführung erforderlichen Dateien."
|
||||
LangString MuiDescriptionLang ${LANG_GERMAN} "Installiert Übersetzungen von ${PRODUCT_NAME} in verschiedenen Sprachen."
|
||||
LangString MuiDescriptionShortcuts ${LANG_GERMAN} "Installiert Verknüpfungen, um ${PRODUCT_NAME} zu starten."
|
||||
LangString MuiDescriptionDesktop ${LANG_GERMAN} "Installiert eine Verknüpfung auf dem Desktop."
|
||||
LangString MuiDescriptionStarteMenu ${LANG_GERMAN} "Installiert eine Verknüpfung im Startmenü."
|
||||
LangString OptionRemoveSettings ${LANG_GERMAN} "Einstellungen und persönliche Daten entfernen"
|
||||
LangString SectionDesktop ${LANG_GERMAN} "Desktop"
|
||||
LangString SectionLanguages ${LANG_GERMAN} "Sprachen"
|
||||
LangString SectionRequired ${LANG_GERMAN} "Programmdateien (erforderlich)"
|
||||
LangString SectionShortcuts ${LANG_GERMAN} "Verknüpfungen"
|
||||
LangString SectionStartMenu ${LANG_GERMAN} "Startmenü"
|
||||
@@ -1,14 +0,0 @@
|
||||
LangString MsgAlreadyInstalled ${LANG_ITALIAN} "${PRODUCT_NAME} è già installato.$\n$\nFai clic su 'OK' per disinstallare la versione installata o su 'Annulla' per annullare l'aggiornamento."
|
||||
LangString MsgApplicationRunning ${LANG_ITALIAN} "L'applicazione ${PRODUCT_NAME} è in esecuzione.$\nChiudi l'applicazione e riprova."
|
||||
LangString MsgRequires64Bit ${LANG_ITALIAN} "Questa versione di ${PRODUCT_NAME} richiede un sistema Windows a 64bit."
|
||||
LangString MuiDescriptionRequired ${LANG_ITALIAN} "Installa ${PRODUCT_NAME} e i relativi file necessari alla sua esecuzione."
|
||||
LangString MuiDescriptionLang ${LANG_ITALIAN} "Installa le traduzioni di ${PRODUCT_NAME} per le differenti lingue."
|
||||
LangString MuiDescriptionShortcuts ${LANG_ITALIAN} "Installa collegamento per eseguire ${PRODUCT_NAME}."
|
||||
LangString MuiDescriptionDesktop ${LANG_ITALIAN} "Installa collegamento sul desktop."
|
||||
LangString MuiDescriptionStarteMenu ${LANG_ITALIAN} "Installa collegamento nel menu Start."
|
||||
LangString OptionRemoveSettings ${LANG_ITALIAN} "Elimina impostazioni e dati personali"
|
||||
LangString SectionDesktop ${LANG_ITALIAN} "Desktop"
|
||||
LangString SectionLanguages ${LANG_ITALIAN} "Lingue"
|
||||
LangString SectionRequired ${LANG_ITALIAN} "File programma (richiesti)"
|
||||
LangString SectionShortcuts ${LANG_ITALIAN} "Collegamenti"
|
||||
LangString SectionStartMenu ${LANG_ITALIAN} "Menu Start"
|
||||
@@ -80,7 +80,7 @@ ReserveFile "${NSISDIR}\Plugins\x86-unicode\InstallOptions.dll"
|
||||
; Language handling
|
||||
!macro LOAD_LANGUAGE LANGUAGE
|
||||
!insertmacro MUI_LANGUAGE "${LANGUAGE}"
|
||||
!include "languages\${LANGUAGE}.nsh"
|
||||
!include "i18n\out\${LANGUAGE}.nsh"
|
||||
!macroend
|
||||
|
||||
; Language files
|
||||
@@ -107,7 +107,7 @@ ReserveFile "${NSISDIR}\Plugins\x86-unicode\InstallOptions.dll"
|
||||
; !insertmacro LOAD_LANGUAGE "SimpChinese"
|
||||
; !insertmacro LOAD_LANGUAGE "Slovak"
|
||||
; !insertmacro LOAD_LANGUAGE "Slovenian"
|
||||
; !insertmacro LOAD_LANGUAGE "Spanish"
|
||||
!insertmacro LOAD_LANGUAGE "Spanish"
|
||||
; !insertmacro LOAD_LANGUAGE "Swedish"
|
||||
; !insertmacro LOAD_LANGUAGE "TradChinese"
|
||||
; !insertmacro LOAD_LANGUAGE "Turkish"
|
||||
|
||||
@@ -45,13 +45,13 @@ To fetch latest translations from Transifex
|
||||
Use the following command:
|
||||
|
||||
```bash
|
||||
$ python setup.py get_po_files
|
||||
$ python setup.py pull_translations
|
||||
```
|
||||
|
||||
It will fetch all po files from Transifex, but the most incomplete ones.
|
||||
|
||||
The minimum acceptable percentage of a translation in order to download it can be seen using:
|
||||
```bash
|
||||
$ python setup.py get_po_files --help
|
||||
$ python setup.py pull_translations --help
|
||||
```
|
||||
The percentage value is passed to the `tx pull` command.
|
||||
|
||||
7
setup.py
7
setup.py
@@ -274,6 +274,9 @@ class picard_build(build):
|
||||
}
|
||||
if os.path.isfile('installer/picard-setup.nsi.in'):
|
||||
generate_file('installer/picard-setup.nsi.in', 'installer/picard-setup.nsi', {**args, **installer_args})
|
||||
log.info('generating NSIS translation files')
|
||||
self.spawn(['python', 'installer/i18n/json2nsh.py'])
|
||||
|
||||
version_args = {
|
||||
'filevers': str(file_version),
|
||||
'prodvers': str(file_version),
|
||||
@@ -469,7 +472,7 @@ class picard_regen_appdata_pot_file(Command):
|
||||
])
|
||||
|
||||
|
||||
class picard_get_po_files(Command):
|
||||
class picard_pull_translations(Command):
|
||||
description = "Retrieve po files from transifex"
|
||||
minimum_perc_default = 5
|
||||
user_options = [
|
||||
@@ -764,7 +767,7 @@ args = {
|
||||
'install': picard_install,
|
||||
'install_locales': picard_install_locales,
|
||||
'update_constants': picard_update_constants,
|
||||
'get_po_files': picard_get_po_files,
|
||||
'pull_translations': picard_pull_translations,
|
||||
'regen_pot_file': picard_regen_pot_file,
|
||||
'patch_version': picard_patch_version,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user