lang sync + new transifex API compatible tool to sync translations

This commit is contained in:
Martin Rotter 2023-02-20 10:53:47 +01:00
parent 9ef2ae6341
commit bd17de94e9
6 changed files with 97 additions and 70 deletions

View File

@ -5458,7 +5458,9 @@ File filter for external e-mail selection dialog.</extracomment>
<source>Placeholders:
%1 - title of selected message,
%2 - body of selected message.</source>
<translation type="unfinished"/>
<translation>Placeholders:
%1 - title of selected message,
%2 - body of selected message.</translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="301"/>

View File

@ -134,7 +134,7 @@ Error: %1</translation>
<message>
<location filename="../src/librssguard/miscellaneous/application.cpp" line="534"/>
<source>Output directory is not writable.</source>
<translation>La carpeta de salida catrece de permisos de escritura.</translation>
<translation>La carpeta de salida carece de permisos de escritura.</translation>
</message>
<message>
<location filename="../src/librssguard/miscellaneous/application.cpp" line="542"/>
@ -149,7 +149,7 @@ Error: %1</translation>
<message>
<location filename="../src/librssguard/miscellaneous/application.cpp" line="566"/>
<source>Settings restoration was not initiated. Make sure that output directory is writable.</source>
<translation>La restauración de la configuración no fue iniciada. Verifique que la carpeta de salida tiene permisos de escritura.</translation>
<translation>Fue imposible iniciar la restauración de la configuración. Verifique que la carpeta de salida tiene permisos de escritura.</translation>
</message>
<message>
<location filename="../src/librssguard/miscellaneous/application.cpp" line="1038"/>
@ -255,7 +255,7 @@ versión pulsando en esta notificación emergente.</translation>
<message>
<location filename="../src/librssguard/services/abstract/gui/authenticationdetails.cpp" line="30"/>
<source>Username is ok or it is not needed.</source>
<translation>El nombre de usuario es válido o no se necesita.</translation>
<translation>El nombre de usuario es válido o innecesario.</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/gui/authenticationdetails.cpp" line="31"/>
@ -265,7 +265,7 @@ versión pulsando en esta notificación emergente.</translation>
<message>
<location filename="../src/librssguard/services/abstract/gui/authenticationdetails.cpp" line="41"/>
<source>Password is ok or it is not needed.</source>
<translation>La contraseña es válida o no se necesita.</translation>
<translation>La contraseña es válida o innecesaria.</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/gui/authenticationdetails.cpp" line="42"/>
@ -365,7 +365,7 @@ versión pulsando en esta notificación emergente.</translation>
<message>
<location filename="../src/librssguard/gui/reusable/discoverfeedsbutton.cpp" line="56"/>
<source>Given account does not support adding feeds.</source>
<translation>La cuenta no admite añadir fuentes.</translation>
<translation>La cuenta proporcionada carece de soporte para añadir fuentes.</translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/discoverfeedsbutton.cpp" line="79"/>
@ -375,12 +375,12 @@ versión pulsando en esta notificación emergente.</translation>
<message>
<location filename="../src/librssguard/gui/reusable/discoverfeedsbutton.cpp" line="32"/>
<source>This website does not contain any feeds</source>
<translation>Este sitio web no contiene fuentes</translation>
<translation>Este sitio web carece de fuentes</translation>
</message>
<message numerus="yes">
<location filename="../src/librssguard/gui/reusable/discoverfeedsbutton.cpp" line="33"/>
<source>Add one of %n feed(s)</source>
<translation><numerusform>Añadir uno de %n fuente</numerusform><numerusform>Añadir uno de %n fuentes</numerusform><numerusform>Añadir uno de %n fuente(s)</numerusform></translation>
<translation><numerusform>Añadir uno de %n fuente(s)</numerusform><numerusform>Añadir uno de %n fuente(s)</numerusform><numerusform>Añadir uno de %n fuente(s)</numerusform></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/discoverfeedsbutton.cpp" line="55"/>
@ -620,7 +620,7 @@ Pulse aquí para abrir la carpeta principal.</translation>
<message>
<location filename="../src/librssguard/services/gmail/gui/emailrecipientcontrol.cpp" line="40"/>
<source>Reply-to</source>
<translation>Responder A</translation>
<translation>Responder a</translation>
</message>
<message>
<location filename="../src/librssguard/services/gmail/gui/emailrecipientcontrol.cpp" line="27"/>
@ -668,13 +668,13 @@ Estado: %3</translation>
<message numerus="yes">
<location filename="../src/librssguard/services/abstract/feed.cpp" line="239"/>
<source>uses global settings (%n minute(s) to next auto-fetch of articles)</source>
<translation><numerusform>utiliza la configuración global (%n en minuto) para la próxima obtención automática de artículos)</numerusform><numerusform>utiliza la configuración global (%n en minutos) para la próxima obtención automática de artículos)</numerusform><numerusform>utiliza la configuración global (%n en minutos) para la próxima obtención automática de artículos)</numerusform></translation>
<translation><numerusform>utiliza la configuración global (%n minuto(s) para la próxima obtención automática de artículos)</numerusform><numerusform>utiliza la configuración global (%n en minuto(s) para la próxima obtención automática de artículos)</numerusform><numerusform>utiliza la configuración global (%n en minuto(s) para la próxima obtención automática de artículos)</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/librssguard/services/abstract/feed.cpp" line="252"/>
<source>uses specific settings (%n minute(s) to next auto-fetching of new articles)</source>
<extracomment>Describes feed auto-update status.</extracomment>
<translation><numerusform>usa configuraciones específicas (% minuto) para la próxima búsqueda automática de nuevos artículos)</numerusform><numerusform>usa configuraciones específicas (%n minutos) para la próxima búsqueda automática de nuevos artículos)</numerusform><numerusform>usa configuraciones específicas (%n minutos) para la próxima búsqueda automática de nuevos artículos)</numerusform></translation>
<translation><numerusform>usa configuraciones específicas (% minuto) para la próxima búsqueda automática de nuevos artículos)</numerusform><numerusform>usa configuraciones específicas (%n minuto(s) para la próxima búsqueda automática de nuevos artículos)</numerusform><numerusform>usa configuraciones específicas (%n minuto(s) para la próxima búsqueda automática de nuevos artículos)</numerusform></translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/feed.cpp" line="267"/>
@ -5308,7 +5308,8 @@ Expiración de testigos de ingreso: %2</translation>
<location filename="../src/librssguard/services/abstract/serviceroot.cpp" line="298"/>
<source>Number of feeds: %1
Number of categories: %2</source>
<translation type="unfinished"/>
<translation>Número de fuentes: %1
Número de categorías: %2</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/serviceroot.cpp" line="537"/>
@ -5398,7 +5399,7 @@ File filter for external e-mail selection dialog.</extracomment>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="55"/>
<source>Disable cache</source>
<translation type="unfinished"/>
<translation>Desactivar caché</translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="63"/>
@ -7140,7 +7141,7 @@ Noticias sin leer: %2</translation>
<message>
<location filename="../src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp" line="16"/>
<source>If you select intelligent synchronization, then only not-yet-fetched or updated articles are downloaded. Network usage is greatly reduced and overall synchronization speed is greatly improved, but first feed fetching could be slow anyway if your feed contains huge number of articles.&lt;br/&gt;&lt;br/&gt;Also, make sure to install &lt;a href=&quot;https://www.google.com&quot;&gt;api_newsplus&lt;/a&gt; TT-RSS plugin to your server instance.</source>
<translation type="unfinished"/>
<translation>Si selecciona la sincronización inteligente, sólo se descargarán los artículos actualizados o que aún no se hayan obtenido. El uso de la red se reduce considerablemente y la velocidad de sincronización general mejora considerablemente, pero la obtención de la primera fuente podría ser lenta de todos modos si su fuente contiene una gran cantidad de artículos.&lt;br/&gt;&lt;br/&gt;También, asegúrese de instalar el complemento TT-RSS&lt;a href=&quot;https://www.google.com&quot;&gt;api_newsplus&lt;/a&gt; en la instancia de su servidor.</translation>
</message>
<message>
<location filename="../src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp" line="26"/>

View File

@ -5309,7 +5309,8 @@ Expiração dos tokens de login: %2</translation>
<location filename="../src/librssguard/services/abstract/serviceroot.cpp" line="298"/>
<source>Number of feeds: %1
Number of categories: %2</source>
<translation type="unfinished"/>
<translation>Número de feeds: %1
Número de categorias: %2</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/serviceroot.cpp" line="537"/>
@ -5399,7 +5400,7 @@ File filter for external e-mail selection dialog.</extracomment>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="55"/>
<source>Disable cache</source>
<translation type="unfinished"/>
<translation>Desativar cache</translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="63"/>
@ -7139,7 +7140,7 @@ Notícias não lidas: %2</translation>
<message>
<location filename="../src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp" line="16"/>
<source>If you select intelligent synchronization, then only not-yet-fetched or updated articles are downloaded. Network usage is greatly reduced and overall synchronization speed is greatly improved, but first feed fetching could be slow anyway if your feed contains huge number of articles.&lt;br/&gt;&lt;br/&gt;Also, make sure to install &lt;a href=&quot;https://www.google.com&quot;&gt;api_newsplus&lt;/a&gt; TT-RSS plugin to your server instance.</source>
<translation type="unfinished"/>
<translation>Se você selecionar a sincronização inteligente, apenas os artigos ainda não buscados ou atualizados serão baixados. O uso da rede é muito reduzido e a velocidade geral de sincronização é muito melhorada, mas a busca do primeiro feed pode ser lenta de qualquer maneira se o seu feed contiver um grande número de artigos.&lt;br/&gt;&lt;br/&gt;Também, certifique-se de instalar o plugin TT-RSS &lt;a href=&quot;https://www.google.com&quot;&gt;api_newsplus&lt;/a&gt; em sua instância do servidor.</translation>
</message>
<message>
<location filename="../src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp" line="26"/>

View File

@ -78,7 +78,7 @@ Error: %1</source>
<message>
<location filename="../src/librssguard/network-web/adblock/adblockdialog.ui" line="58"/>
<source>Filter lists</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/network-web/adblock/adblockdialog.ui" line="64"/>
@ -88,7 +88,7 @@ Error: %1</source>
<message>
<location filename="../src/librssguard/network-web/adblock/adblockdialog.ui" line="78"/>
<source>Custom filters</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/network-web/adblock/adblockdialog.ui" line="84"/>
@ -114,7 +114,7 @@ Error: %1</source>
<message>
<location filename="../src/librssguard/network-web/adblock/adblockmanager.cpp" line="198"/>
<source>Failed to setup filters and start server: %1.</source>
<translation type="unfinished"/>
<translation>: %1</translation>
</message>
<message>
<location filename="../src/librssguard/network-web/adblock/adblockmanager.cpp" line="375"/>
@ -631,7 +631,7 @@ Click here to open parent directory.</source>
<message>
<location filename="../src/librssguard/services/abstract/feed.cpp" line="242"/>
<source>uses global settings, but global auto-fetching of articles is disabled</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/feed.cpp" line="264"/>
@ -654,7 +654,7 @@ Click here to open parent directory.</source>
Active message filters: %2
Status: %3</source>
<translation>: %1
使: %2
使: %2
: %3</translation>
</message>
<message>
@ -1374,7 +1374,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/services/abstract/gui/formcategorydetails.cpp" line="157"/>
<source>Images (%1)</source>
<translation type="unfinished"/>
<translation>(%1)</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/gui/formcategorydetails.cpp" line="163"/>
@ -1689,7 +1689,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/services/abstract/gui/formfeeddetails.ui" line="79"/>
<source>Ignore notifications for this feed</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@ -1697,7 +1697,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/gui/dialogs/formlog.cpp" line="16"/>
<source>Application log</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@ -2286,7 +2286,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/gui/dialogs/formmain.ui" line="890"/>
<source>Display application &amp;log</source>
<translation type="unfinished"/>
<translation>(&amp;L)</translation>
</message>
<message>
<location filename="../src/librssguard/gui/dialogs/formmain.ui" line="738"/>
@ -2383,7 +2383,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp" line="244"/>
<source>Cannot save new filter, error: &apos;%1&apos;.</source>
<translation>: &apos;%1&apos;</translation>
<translation>: &apos;%1&apos;</translation>
</message>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp" line="189"/>
@ -2448,7 +2448,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp" line="208"/>
<source>Do you really want to remove selected filter?</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.ui" line="14"/>
@ -2473,7 +2473,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.ui" line="86"/>
<source>&amp;New filter</source>
<translation>(&amp;N)</translation>
<translation>(&amp;N)</translation>
</message>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.ui" line="115"/>
@ -2494,7 +2494,7 @@ or this functionality is not implemented yet.</source>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.ui" line="152"/>
<source>Pre-made filters</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/gui/dialogs/formmessagefiltersmanager.ui" line="174"/>
@ -2752,7 +2752,7 @@ You have to restart manually.</source>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.cpp" line="137"/>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.cpp" line="138"/>
<source>Some feeds were not loaded properly or import file is corrupted.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.cpp" line="159"/>
@ -2827,7 +2827,7 @@ You have to restart manually.</source>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.cpp" line="171"/>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.cpp" line="216"/>
<source>OPML 2.0 files (*.opml *.xml)</source>
<translation type="unfinished"/>
<translation>OPML 2.0 (*.opml *.xml) </translation>
</message>
<message>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.cpp" line="322"/>
@ -2858,12 +2858,12 @@ You have to restart manually.</source>
<message>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.ui" line="55"/>
<source>Fetch online metadata</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.ui" line="64"/>
<source>Optional post-processing script</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/services/standard/gui/formstandardimportexport.ui" line="95"/>
@ -3956,7 +3956,7 @@ Login tokens expiration: %2</source>
<message>
<location filename="../src/librssguard/core/messagesmodel.cpp" line="250"/>
<source>Assigned labels</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/core/messagesmodel.cpp" line="252"/>
@ -4046,7 +4046,7 @@ Login tokens expiration: %2</source>
<message>
<location filename="../src/librssguard/core/messagesmodel.cpp" line="259"/>
<source>Labels assigned to the article.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message numerus="yes">
<location filename="../src/librssguard/core/messagesmodel.cpp" line="302"/>
@ -4936,12 +4936,12 @@ List of supported readers:</source>
<message>
<location filename="../src/librssguard/miscellaneous/skinfactory.cpp" line="506"/>
<source>interesting stuff</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/miscellaneous/skinfactory.cpp" line="509"/>
<source>interesting stuff (highlighted)</source>
<translation>()</translation>
<translation>()</translation>
</message>
<message>
<location filename="../src/librssguard/miscellaneous/skinfactory.cpp" line="512"/>
@ -4956,12 +4956,12 @@ List of supported readers:</source>
<message>
<location filename="../src/librssguard/miscellaneous/skinfactory.cpp" line="518"/>
<source>items with new articles</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/miscellaneous/skinfactory.cpp" line="521"/>
<source>items with new articles (highlighted)</source>
<translation type="unfinished"/>
<translation>()</translation>
</message>
<message>
<location filename="../src/librssguard/miscellaneous/skinfactory.cpp" line="524"/>
@ -5301,7 +5301,8 @@ Login tokens expiration: %2</source>
<location filename="../src/librssguard/services/abstract/serviceroot.cpp" line="298"/>
<source>Number of feeds: %1
Number of categories: %2</source>
<translation type="unfinished"/>
<translation>: %1
: %2</translation>
</message>
<message>
<location filename="../src/librssguard/services/abstract/serviceroot.cpp" line="537"/>
@ -5376,22 +5377,22 @@ File filter for external e-mail selection dialog.</extracomment>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="31"/>
<source>Enable HTTP/2</source>
<translation type="unfinished"/>
<translation> HTTP/2</translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="39"/>
<source>WebEngine</source>
<translation type="unfinished"/>
<translation>(WebEngine)</translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="45"/>
<source>Custom &quot;QTWEBENGINE_CHROMIUM_FLAGS&quot; flags</source>
<translation type="unfinished"/>
<translation> &quot;QTWEBENGINE_CHROMIUM_FLAGS&quot; </translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="55"/>
<source>Disable cache</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/librssguard/gui/settings/settingsbrowsermail.ui" line="63"/>
@ -6651,7 +6652,7 @@ Type: %3</source>
<message>
<location filename="../src/librssguard/services/standard/gui/standardfeeddetails.cpp" line="287"/>
<source>Images (%1)</source>
<translation type="unfinished"/>
<translation>(%1)</translation>
</message>
<message>
<location filename="../src/librssguard/services/standard/gui/standardfeeddetails.cpp" line="293"/>
@ -7130,7 +7131,7 @@ Unread news: %2</source>
<message>
<location filename="../src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp" line="16"/>
<source>If you select intelligent synchronization, then only not-yet-fetched or updated articles are downloaded. Network usage is greatly reduced and overall synchronization speed is greatly improved, but first feed fetching could be slow anyway if your feed contains huge number of articles.&lt;br/&gt;&lt;br/&gt;Also, make sure to install &lt;a href=&quot;https://www.google.com&quot;&gt;api_newsplus&lt;/a&gt; TT-RSS plugin to your server instance.</source>
<translation type="unfinished"/>
<translation>&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://www.google.com&quot;&gt;api_newsplus&lt;/a&gt; TT-RSS 掛件到伺服器的實例。</translation>
</message>
<message>
<location filename="../src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp" line="26"/>

View File

@ -0,0 +1,45 @@
# Setup parameters.
#RESOURCE = "./localization/rssguard_en.ts"
#CODES = "cs da de en_GB en_US es fi fr gl he id it ja lt nl pl pt_BR pt_PT ru sv uk zh_CN zh_TW"
#TRANSLATION = './localization/rssguard_$CODE.ts'
import sys
import os
import urllib
from transifex.api import transifex_api
from pprint import pprint
# Read API token.
api_token = sys.argv[1]
print("API token: {}".format(api_token))
transifex_api.setup(auth = api_token)
# Constants.
org_slug = "martinrotter"
proj_slug = "rssguard"
translation_file = os.path.normpath("./localization/rssguard_{}.ts")
# Organization/project.
organization = transifex_api.Organization.get(slug = org_slug)
project = organization.fetch('projects').get(slug = proj_slug)
resource = project.fetch('resources').get(slug = proj_slug)
languages = project.fetch('languages')
# Upload resource file.
with open(translation_file.format("en"), "r", encoding = "utf-8") as file:
print("Uploading resource...")
resource_data = file.read()
transifex_api.ResourceStringsAsyncUpload.upload(resource_data, resource = resource)
# Download translations.
for lang in languages:
print("Downloading {} translation...".format(lang.code))
url = transifex_api.ResourceTranslationsAsyncDownload.download(resource = resource, language = lang)
target_path = translation_file.format(lang.code)
urllib.request.urlretrieve(url, target_path)

View File

@ -1,23 +0,0 @@
#!/bin/bash
# Transka executable.
TRANSKA="$(dirname "$0")/transka/transka"
# Get credentials.
read -e -p "Username: " -i "martinrotter" USERNAME
read -p "Password: " PASSWORD
# Setup parameters.
RESOURCE="./localization/rssguard_en.ts"
CODES="cs da de en_GB en_US es fi fr gl he id it ja lt nl pl pt_BR pt_PT ru sv uk zh_CN zh_TW"
TRANSLATION='./localization/rssguard_$CODE.ts'
declare PARAMS
PARAMS+="-u "$USERNAME" -p "$PASSWORD" -ps "rssguard" -rs "rssguard" -ur "$RESOURCE" "
for CODE in $CODES; do
PARAMS+="-dt "$CODE" "$(eval echo $TRANSLATION)" "
done
$TRANSKA $PARAMS