More translation validations

This commit is contained in:
pietervdvn 2022-02-16 03:22:16 +01:00
parent bf05a88afd
commit 61afce4197
24 changed files with 138 additions and 59 deletions

View file

@ -51,7 +51,7 @@
"id": "Karya Seni <i>{name}</i>", "id": "Karya Seni <i>{name}</i>",
"it": "Opera <i>{name}</i>", "it": "Opera <i>{name}</i>",
"ru": "Художественная работа <i>{name}</i>", "ru": "Художественная работа <i>{name}</i>",
"es": "Obra de arte <i>{nombre}</i>", "es": "Obra de arte <i>{name}</i>",
"ja": "アートワーク <i>{name}</i>", "ja": "アートワーク <i>{name}</i>",
"zh_Hant": "藝術品<i>{name}</i>", "zh_Hant": "藝術品<i>{name}</i>",
"fi": "Taideteos <i>{name}</i>", "fi": "Taideteos <i>{name}</i>",

View file

@ -118,7 +118,7 @@
"fr": "Réparateur de vélo <i>{name}</i>", "fr": "Réparateur de vélo <i>{name}</i>",
"gl": "Arranxo de bicicletas <i>{name}</i>", "gl": "Arranxo de bicicletas <i>{name}</i>",
"de": "Fahrradwerkstatt <i>{name}</i>", "de": "Fahrradwerkstatt <i>{name}</i>",
"it": "Riparazione biciclette <i>{name</i>", "it": "Riparazione biciclette <i>{name}</i>",
"ru": "Ремонт велосипедов <i>{name}</i>", "ru": "Ремонт велосипедов <i>{name}</i>",
"pt_BR": "Reparo de bicicletas <i>{name}</i>", "pt_BR": "Reparo de bicicletas <i>{name}</i>",
"pt": "Reparo de bicicletas <i>{name}</i>" "pt": "Reparo de bicicletas <i>{name}</i>"

View file

@ -282,7 +282,6 @@
"if": "cuisine=turkish", "if": "cuisine=turkish",
"then": { "then": {
"en": "Turkish dishes are served here", "en": "Turkish dishes are served here",
"nl": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" "nl": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)"
} }
}, },
@ -290,7 +289,6 @@
"if": "cuisine=thai", "if": "cuisine=thai",
"then": { "then": {
"en": "Thai dishes are served here", "en": "Thai dishes are served here",
"nl": "Dit is een Thaïs restaurant" "nl": "Dit is een Thaïs restaurant"
} }
} }

View file

@ -27,17 +27,6 @@
"en": "Nature reserve" "en": "Nature reserve"
}, },
"mappings": [ "mappings": [
{
"if": {
"and": [
"name:nl~*"
]
},
"then": {
"nl": "{name:nl}",
"en": "{name}"
}
},
{ {
"if": { "if": {
"and": [ "and": [
@ -282,7 +271,7 @@
], ],
"id": "Dogs?" "id": "Dogs?"
}, },
"website", "website",
{ {
"question": { "question": {
"nl": "Wie is de conservator van dit gebied?<br/><span class='subtle'>Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd", "nl": "Wie is de conservator van dit gebied?<br/><span class='subtle'>Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd",

View file

@ -736,7 +736,7 @@
"ja": "ゴミ捨て場 {name}", "ja": "ゴミ捨て場 {name}",
"it": "Luogo di sversamento {name}", "it": "Luogo di sversamento {name}",
"fr": "Site de vidange {name}", "fr": "Site de vidange {name}",
"pt_BR": "Estação de despejo {nome}", "pt_BR": "Estação de despejo {name}",
"de": "Entsorgungsstation {name}", "de": "Entsorgungsstation {name}",
"zh_Hant": "{name} 垃圾站" "zh_Hant": "{name} 垃圾站"
}, },

View file

@ -250,10 +250,8 @@
"question": { "question": {
"nl": "Is de straat <b>{name}</b> een fietsstraat?", "nl": "Is de straat <b>{name}</b> een fietsstraat?",
"en": "Is the street <b>{name}</b> a cyclestreet?", "en": "Is the street <b>{name}</b> a cyclestreet?",
"ja": "この通りはcyclestreetですか?", "de": "Ist die Straße <b>{name}</b> eine Fahrradstraße?",
"nb_NO": "Er denne gaten en sykkelvei?", "it": "È <b>{name}</b> una strada ciclabile?",
"de": "Ist die Straße <b>{Name}</b> eine Fahrradstraße?",
"it": "È una strada ciclabile?",
"hu": "Kerékpárosutca-e <b>{name}</b>?" "hu": "Kerékpárosutca-e <b>{name}</b>?"
}, },
"mappings": [ "mappings": [

View file

@ -125,7 +125,7 @@
"getStartedNewAccount": " ou <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">créez un compte</a>", "getStartedNewAccount": " ou <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">créez un compte</a>",
"noTagsSelected": "Aucune balise sélectionnée", "noTagsSelected": "Aucune balise sélectionnée",
"customThemeIntro": "<h3>Thèmes personnalisés</h3>Vous avez déjà visité ces thèmes personnalisés.", "customThemeIntro": "<h3>Thèmes personnalisés</h3>Vous avez déjà visité ces thèmes personnalisés.",
"aboutMapcomplete": "<h3>À propos de MapComplete</h3><p>Avec MapComplete vous pouvez enrichir OpenStreetMap d'informations sur un <b>thème unique.</b> Répondez à quelques questions, et en quelques minutes vos contributions seront disponible dans le monde entier ! Le <b>concepteur du thème</b> définis les éléments, questions et langues pour le thème.</p><h3>En savoir plus</h3><p>MapComplete <b>propose toujours l'étape suivante</b> pour en apprendre plus sur OpenStreetMap.</p><ul><li>Lorsqu'il est intégré dans un site Web, l'&lt;i&gt;iframe&lt;/i&gt; pointe vers MapComplete en plein écran</li><li>La version plein écran donne des informations sur OpenStreetMap</li><li>Il est possible de regarder sans se connecter, mais l'édition demande une connexion à OSM.</li><li>Si vous n'êtes pas connecté, il vous est demandé de le faire</li><li>Une fois que vous avez répondu à une seule question, vous pouvez ajouter de nouveaux points à la carte</li><li>Au bout d'un moment, les vrais tags OSM sont montrés, qui pointent ensuite vers le wiki</li></ul><p></p><br><p>Vous avez remarqué <b>un problème</b> ? Vous souhaitez <b>demander une fonctionnalité</b> ? Vous voulez <b>aider à traduire</b> ? Allez voir <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">le code source</a> ou l'&lt;i&gt;<a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">issue tracker.</a>&lt;/i&gt; </p><p> Vous voulez visualiser <b>votre progression</b> ? Suivez le compteur d'édition sur <a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\">OsmCha</a>.</p>", "aboutMapcomplete": "<h3>À propos de MapComplete</h3><p>Avec MapComplete vous pouvez enrichir OpenStreetMap d'informations sur un <b>thème unique.</b> Répondez à quelques questions, et en quelques minutes vos contributions seront disponible dans le monde entier ! Le <b>concepteur du thème</b> définis les éléments, questions et langues pour le thème.</p><h3>En savoir plus</h3><p>MapComplete <b>propose toujours l'étape suivante</b> pour en apprendre plus sur OpenStreetMap.</p><ul><li>Lorsqu'il est intégré dans un site Web, l'&lt;i&gt;iframe&lt;/i&gt; pointe vers MapComplete en plein écran</li><li>La version plein écran donne des informations sur OpenStreetMap</li><li>Il est possible de regarder sans se connecter, mais l'édition demande une connexion à OSM.</li><li>Si vous n'êtes pas connecté, il vous est demandé de le faire</li><li>Une fois que vous avez répondu à une seule question, vous pouvez ajouter de nouveaux points à la carte</li><li>Au bout d'un moment, les vrais tags OSM sont montrés, qui pointent ensuite vers le wiki</li></ul><p></p><br><p>Vous avez remarqué <b>un problème</b> ? Vous souhaitez <b>demander une fonctionnalité</b> ? Vous voulez <b>aider à traduire</b> ? Allez voir <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">le code source</a> ou l'&lt;i&gt;<a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">issue tracker.</a>&lt;/i&gt; </p><p> Vous voulez visualiser <b>votre progression</b> ? Suivez le compteur d'édition sur <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>",
"backgroundMap": "Carte de fonds", "backgroundMap": "Carte de fonds",
"layerSelection": { "layerSelection": {
"zoomInToSeeThisLayer": "Aggrandissez la carte pour voir cette couche", "zoomInToSeeThisLayer": "Aggrandissez la carte pour voir cette couche",
@ -188,7 +188,7 @@
"wikipediaboxTitle": "Wikipédia", "wikipediaboxTitle": "Wikipédia",
"loading": "Chargement de Wikipédia…", "loading": "Chargement de Wikipédia…",
"noWikipediaPage": "Cet élément Wikidata na pas encore de page Wikipédia correspondante.", "noWikipediaPage": "Cet élément Wikidata na pas encore de page Wikipédia correspondante.",
"noResults": "Pas de résultats pour", "noResults": "Pas de résultats pour {search}",
"searchWikidata": "Rechercher sur Wikidata", "searchWikidata": "Rechercher sur Wikidata",
"failed": "Le chargement de Wikipédia a échoué" "failed": "Le chargement de Wikipédia a échoué"
}, },
@ -244,8 +244,7 @@
"whyDelete": "Pourquoi ce point devrait-il être supprimé ?", "whyDelete": "Pourquoi ce point devrait-il être supprimé ?",
"explanations": { "explanations": {
"selectReason": "Sélectionner pourquoi cet élément devrait être supprimé", "selectReason": "Sélectionner pourquoi cet élément devrait être supprimé",
"hardDelete": "Ce point sera supprimé dOpenStreetmap. Il pourra être restauré par des méthodes avancées", "hardDelete": "Ce point sera supprimé dOpenStreetmap. Il pourra être restauré par des méthodes avancées"
"softDelete": "Cet élément sera mis à jour et caché de lapplication."
}, },
"reasons": { "reasons": {
"test": "Élément de test qui na jamais été ici", "test": "Élément de test qui na jamais été ici",

View file

@ -119,7 +119,7 @@
} }
}, },
"backgroundMap": "背景マップ", "backgroundMap": "背景マップ",
"aboutMapcomplete": "<h3>MapCompleteについて</h3><p>MapCompleteを使えば、<b>1つのテーマに関する情報でOpenStreetMapを充実させることができます。</b>いくつかの質問に答えると、数分以内にあなたの投稿が世界中で公開されます!<b>テーマメンテナ</b>は、テーマの要素、質問、言語を定義します。</p><h3>詳細情報を見る</h3><p>MapCompleteは常にOpenStreetMapについてさらに学ぶため<b>次のステップ</b>を提供します。</p><ul><li>Webサイトに埋め込まれるとiframeはフルスクリーンのMapCompleteにリンクします</li><li>フルスクリーン版はOpenStreetMapに関する情報を提供します</li><li>ログインせずに表示することはできますが、編集にはOSMログインが必要です。</li><li>ログインしていない場合は、ログインするように求められます</li><li>1つの質問に回答すると、マップに新しいポイントを追加できます</li><li>しばらくすると、実際のOSMタグが表示され、後でWikiにリンクされます</li></ul><p></p><br><p><b>問題</b>に気づきましたか?<b>機能要求</b>はありますか?<b>翻訳の手伝いをしますか?</b><a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">ソースコード</a>または<a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">問題追跡ツール</a>に移動します。</p><p><b>進捗状況</b>を確認しますか? <a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\">OsmCha</a>の編集数に従います。</p>", "aboutMapcomplete": "<h3>MapCompleteについて</h3><p>MapCompleteを使えば、<b>1つのテーマに関する情報でOpenStreetMapを充実させることができます。</b>いくつかの質問に答えると、数分以内にあなたの投稿が世界中で公開されます!<b>テーマメンテナ</b>は、テーマの要素、質問、言語を定義します。</p><h3>詳細情報を見る</h3><p>MapCompleteは常にOpenStreetMapについてさらに学ぶため<b>次のステップ</b>を提供します。</p><ul><li>Webサイトに埋め込まれるとiframeはフルスクリーンのMapCompleteにリンクします</li><li>フルスクリーン版はOpenStreetMapに関する情報を提供します</li><li>ログインせずに表示することはできますが、編集にはOSMログインが必要です。</li><li>ログインしていない場合は、ログインするように求められます</li><li>1つの質問に回答すると、マップに新しいポイントを追加できます</li><li>しばらくすると、実際のOSMタグが表示され、後でWikiにリンクされます</li></ul><p></p><br><p><b>問題</b>に気づきましたか?<b>機能要求</b>はありますか?<b>翻訳の手伝いをしますか?</b><a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">ソースコード</a>または<a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">問題追跡ツール</a>に移動します。</p><p><b>進捗状況</b>を確認しますか? <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>の編集数に従います。</p>",
"customThemeIntro": "<h3>カスタムテーマ</h3>これらは以前にアクセスされたユーザー生成テーマです。", "customThemeIntro": "<h3>カスタムテーマ</h3>これらは以前にアクセスされたユーザー生成テーマです。",
"noTagsSelected": "タグが選択されていません", "noTagsSelected": "タグが選択されていません",
"getStartedNewAccount": " または<a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">新しいアカウントを作成する</a>", "getStartedNewAccount": " または<a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">新しいアカウントを作成する</a>",

View file

@ -3594,11 +3594,6 @@
} }
}, },
"title": { "title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "Nature reserve" "render": "Nature reserve"
} }
}, },

View file

@ -65,7 +65,7 @@
"title": { "title": {
"mappings": { "mappings": {
"0": { "0": {
"then": "Obra de arte <i>{nombre}</i>" "then": "Obra de arte <i>{name}</i>"
} }
}, },
"render": "Obra de arte" "render": "Obra de arte"

View file

@ -771,7 +771,7 @@
"then": "Noleggio di biciclette <i>{name}</i>" "then": "Noleggio di biciclette <i>{name}</i>"
}, },
"3": { "3": {
"then": "Riparazione biciclette <i>{name</i>" "then": "Riparazione biciclette <i>{name}</i>"
}, },
"4": { "4": {
"then": "Negozio di biciclette <i>{name}</i>" "then": "Negozio di biciclette <i>{name}</i>"

View file

@ -3516,9 +3516,6 @@
"title": { "title": {
"mappings": { "mappings": {
"0": { "0": {
"then": "{name:nl}"
},
"1": {
"then": "{name}" "then": "{name}"
} }
}, },

View file

@ -35,7 +35,7 @@
"zoomInFurther": "Powiększ jeszcze bardziej, aby dodać punkt.", "zoomInFurther": "Powiększ jeszcze bardziej, aby dodać punkt.",
"intro": "Kliknąłeś gdzieś, gdzie nie są jeszcze znane żadne dane.<br>", "intro": "Kliknąłeś gdzieś, gdzie nie są jeszcze znane żadne dane.<br>",
"title": "Czy dodać nowy punkt?", "title": "Czy dodać nowy punkt?",
"addNew": "Dodaj nową {kategorię} tutaj", "addNew": "Dodaj nową {category} tutaj",
"pleaseLogin": "<a class=\"activate-osm-authentication\">Zaloguj się, aby dodać nowy punkt</a>", "pleaseLogin": "<a class=\"activate-osm-authentication\">Zaloguj się, aby dodać nowy punkt</a>",
"confirmButton": "Dodaj tutaj {category}.<br><div class=\"alert\">Twój dodatek jest widoczny dla wszystkich</div>", "confirmButton": "Dodaj tutaj {category}.<br><div class=\"alert\">Twój dodatek jest widoczny dla wszystkich</div>",
"layerNotEnabled": "Warstwa {layer} nie jest włączona. Włącz tę warstwę, aby dodać punkt", "layerNotEnabled": "Warstwa {layer} nie jest włączona. Włącz tę warstwę, aby dodać punkt",
@ -78,7 +78,7 @@
"zoomInFurther": "Powiększ jeszcze bardziej, aby dodać punkt.", "zoomInFurther": "Powiększ jeszcze bardziej, aby dodać punkt.",
"intro": "Kliknąłeś gdzieś, gdzie nie są jeszcze znane żadne dane.<br>", "intro": "Kliknąłeś gdzieś, gdzie nie są jeszcze znane żadne dane.<br>",
"title": "Czy dodać nowy punkt?", "title": "Czy dodać nowy punkt?",
"addNew": "Dodaj nową {kategorię} tutaj", "addNew": "Dodaj nową {category} tutaj",
"pleaseLogin": "<a class=\"activate-osm-authentication\">Zaloguj się, aby dodać nowy punkt</a>", "pleaseLogin": "<a class=\"activate-osm-authentication\">Zaloguj się, aby dodać nowy punkt</a>",
"confirmButton": "Dodaj tutaj {category}.<br><div class=\"alert\">Twój dodatek jest widoczny dla wszystkich</div>", "confirmButton": "Dodaj tutaj {category}.<br><div class=\"alert\">Twój dodatek jest widoczny dla wszystkich</div>",
"layerNotEnabled": "Warstwa {layer} nie jest włączona. Włącz tę warstwę, aby dodać punkt", "layerNotEnabled": "Warstwa {layer} nie jest włączona. Włącz tę warstwę, aby dodać punkt",
@ -120,7 +120,7 @@
"friday": "Piątek", "friday": "Piątek",
"thursday": "Czwartek" "thursday": "Czwartek"
}, },
"aboutMapcomplete": "<h3>O MapComplete</h3><p>Dzięki MapComplete możesz wzbogacić OpenStreetMap o informacje na <b>pojedynczy temat.</b> Odpowiedz na kilka pytań, a w ciągu kilku minut Twój wkład będzie dostępny na całym świecie! Opiekun <b>tematu</b> definiuje elementy, pytania i języki dla tematu.</p><h3>Dowiedz się więcej</h3><p>MapComplete zawsze <b>oferuje następny krok</b>, by dowiedzieć się więcej o OpenStreetMap.</p><ul><li>Po osadzeniu na stronie internetowej, element iframe łączy się z pełnoekranowym MapComplete</li><li>Wersja pełnoekranowa oferuje informacje o OpenStreetMap</li><li>Przeglądanie działa bez logowania, ale edycja wymaga loginu OSM.</li><li>Jeżeli nie jesteś zalogowany, zostaniesz poproszony o zalogowanie się</li><li>Po udzieleniu odpowiedzi na jedno pytanie, możesz dodać nowe punkty do mapy</li><li>Po chwili wyświetlane są rzeczywiste tagi OSM, które później linkują do wiki</li></ul><p></p><br><p>Zauważyłeś <b>problem</b>? Czy masz <b>prośbę o dodanie jakiejś funkcji</b>? Chcesz <b>pomóc w tłumaczeniu</b>? Udaj się do <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">kodu źródłowego</a> lub <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">issue trackera.</a> </p><p> Chcesz zobaczyć <b>swoje postępy</b>? Śledź liczbę edycji na <a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\">OsmCha</a>.</p>", "aboutMapcomplete": "<h3>O MapComplete</h3><p>Dzięki MapComplete możesz wzbogacić OpenStreetMap o informacje na <b>pojedynczy temat.</b> Odpowiedz na kilka pytań, a w ciągu kilku minut Twój wkład będzie dostępny na całym świecie! Opiekun <b>tematu</b> definiuje elementy, pytania i języki dla tematu.</p><h3>Dowiedz się więcej</h3><p>MapComplete zawsze <b>oferuje następny krok</b>, by dowiedzieć się więcej o OpenStreetMap.</p><ul><li>Po osadzeniu na stronie internetowej, element iframe łączy się z pełnoekranowym MapComplete</li><li>Wersja pełnoekranowa oferuje informacje o OpenStreetMap</li><li>Przeglądanie działa bez logowania, ale edycja wymaga loginu OSM.</li><li>Jeżeli nie jesteś zalogowany, zostaniesz poproszony o zalogowanie się</li><li>Po udzieleniu odpowiedzi na jedno pytanie, możesz dodać nowe punkty do mapy</li><li>Po chwili wyświetlane są rzeczywiste tagi OSM, które później linkują do wiki</li></ul><p></p><br><p>Zauważyłeś <b>problem</b>? Czy masz <b>prośbę o dodanie jakiejś funkcji</b>? Chcesz <b>pomóc w tłumaczeniu</b>? Udaj się do <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">kodu źródłowego</a> lub <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">issue trackera.</a> </p><p> Chcesz zobaczyć <b>swoje postępy</b>? Śledź liczbę edycji na <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>",
"noNameCategory": "{category} bez nazwy", "noNameCategory": "{category} bez nazwy",
"nameInlineQuestion": "Nazwa tej {category} to $$$", "nameInlineQuestion": "Nazwa tej {category} to $$$",
"osmLinkTooltip": "Zobacz ten obiekt na OpenStreetMap, aby uzyskać historię i więcej opcji edycji", "osmLinkTooltip": "Zobacz ten obiekt na OpenStreetMap, aby uzyskać historię i więcej opcji edycji",
@ -189,7 +189,7 @@
"friday": "Piątek", "friday": "Piątek",
"thursday": "Czwartek" "thursday": "Czwartek"
}, },
"aboutMapcomplete": "<h3>O MapComplete</h3><p>Dzięki MapComplete możesz wzbogacić OpenStreetMap o informacje na <b>pojedynczy temat.</b> Odpowiedz na kilka pytań, a w ciągu kilku minut Twój wkład będzie dostępny na całym świecie! Opiekun <b>motywu</b> definiuje elementy, pytania i języki dla tematu.</p><h3>Dowiedz się więcej</h3><p>MapComplete zawsze <b>oferuje następny krok</b>, by dowiedzieć się więcej o OpenStreetMap.</p><ul><li>Po osadzeniu na stronie internetowej, iframe łączy się z pełnoekranowym MapComplete</li><li>Wersja pełnoekranowa oferuje informacje o OpenStreetMap</li><li>Przeglądanie działa bez logowania, ale edycja wymaga loginu OSM.</li><li>Jeżeli nie jesteś zalogowany, zostaniesz poproszony o zalogowanie się</li><li>Po udzieleniu odpowiedzi na jedno pytanie, możesz dodać nowe punkty do mapy</li><li>Po chwili wyświetlane są rzeczywiste tagi OSM, które później linkują do wiki</li></ul><p></p><br><p>Zauważyłeś <b>problem</b>? Czy masz <b>prośbę o dodanie jakiejś funkcji</b>? Chcesz <b>pomóc w tłumaczeniu</b>? Udaj się do <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">kodu źródłowego</a> lub <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">issue trackera.</a> </p><p> Chcesz zobaczyć <b>swoje postępy</b>? Śledź liczbę edycji na <a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\">OsmCha</a>.</p>.", "aboutMapcomplete": "<h3>O MapComplete</h3><p>Dzięki MapComplete możesz wzbogacić OpenStreetMap o informacje na <b>pojedynczy temat.</b> Odpowiedz na kilka pytań, a w ciągu kilku minut Twój wkład będzie dostępny na całym świecie! Opiekun <b>motywu</b> definiuje elementy, pytania i języki dla tematu.</p><h3>Dowiedz się więcej</h3><p>MapComplete zawsze <b>oferuje następny krok</b>, by dowiedzieć się więcej o OpenStreetMap.</p><ul><li>Po osadzeniu na stronie internetowej, iframe łączy się z pełnoekranowym MapComplete</li><li>Wersja pełnoekranowa oferuje informacje o OpenStreetMap</li><li>Przeglądanie działa bez logowania, ale edycja wymaga loginu OSM.</li><li>Jeżeli nie jesteś zalogowany, zostaniesz poproszony o zalogowanie się</li><li>Po udzieleniu odpowiedzi na jedno pytanie, możesz dodać nowe punkty do mapy</li><li>Po chwili wyświetlane są rzeczywiste tagi OSM, które później linkują do wiki</li></ul><p></p><br><p>Zauważyłeś <b>problem</b>? Czy masz <b>prośbę o dodanie jakiejś funkcji</b>? Chcesz <b>pomóc w tłumaczeniu</b>? Udaj się do <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">kodu źródłowego</a> lub <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">issue trackera.</a> </p><p> Chcesz zobaczyć <b>swoje postępy</b>? Śledź liczbę edycji na <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>.",
"noNameCategory": "{category} bez nazwy", "noNameCategory": "{category} bez nazwy",
"nameInlineQuestion": "Nazwa tej {category} to $$$", "nameInlineQuestion": "Nazwa tej {category} to $$$",
"osmLinkTooltip": "Zobacz ten obiekt na OpenStreetMap, aby uzyskać historię i więcej opcji edycji", "osmLinkTooltip": "Zobacz ten obiekt na OpenStreetMap, aby uzyskać historię i więcej opcji edycji",
@ -244,7 +244,7 @@
"loadingData": "Ładowanie danych…", "loadingData": "Ładowanie danych…",
"ready": "Zrobione!", "ready": "Zrobione!",
"zoomIn": "Przybliż żeby zobaczyć lub edytować", "zoomIn": "Przybliż żeby zobaczyć lub edytować",
"retrying": "Ładowanie danych nie powiodło się. Spróbujemy ponownie za {liczba} sekund…" "retrying": "Ładowanie danych nie powiodło się. Spróbujemy ponownie za {count} sekund…"
}, },
"reviews": { "reviews": {
"plz_login": "Zaloguj się, aby zostawić opinię", "plz_login": "Zaloguj się, aby zostawić opinię",

View file

@ -73,7 +73,7 @@
"zoomInFurther": "Amplie mais para adicionar um ponto.", "zoomInFurther": "Amplie mais para adicionar um ponto.",
"openLayerControl": "Abra a caixa de controlo da camada", "openLayerControl": "Abra a caixa de controlo da camada",
"disableFilters": "Desativar todos os filtros", "disableFilters": "Desativar todos os filtros",
"addNew": "Adicionar uma nova {categoria} aqui", "addNew": "Adicionar uma nova {category} aqui",
"intro": "Clicou em algum lugar onde ainda não há dados conhecidos.<br>", "intro": "Clicou em algum lugar onde ainda não há dados conhecidos.<br>",
"addNewMapLabel": "Adicionar novo item", "addNewMapLabel": "Adicionar novo item",
"presetInfo": "O novo POI terá {tags}", "presetInfo": "O novo POI terá {tags}",
@ -90,8 +90,8 @@
}, },
"questions": { "questions": {
"websiteOf": "Qual é o site de {category}?", "websiteOf": "Qual é o site de {category}?",
"emailOf": "Qual é o endereço de e-mail de {categoria}?", "emailOf": "Qual é o endereço de e-mail de {category}?",
"emailIs": "O endereço de e-mail de {categoria} é <a href=\"mailto:{email}\" target=\"_blank\">{email}</a>", "emailIs": "O endereço de e-mail de {category} é <a href=\"mailto:{email}\" target=\"_blank\">{email}</a>",
"websiteIs": "Site: <a href=\"{website}\" target=\"_blank\">{website}</a>", "websiteIs": "Site: <a href=\"{website}\" target=\"_blank\">{website}</a>",
"phoneNumberIs": "O número de telefone de {category} é <a target=\"_blank\">{phone}</a>", "phoneNumberIs": "O número de telefone de {category} é <a target=\"_blank\">{phone}</a>",
"phoneNumberOf": "Qual é o número de telefone de {category}?" "phoneNumberOf": "Qual é o número de telefone de {category}?"
@ -184,7 +184,7 @@
"editThisTheme": "Editar este tema" "editThisTheme": "Editar este tema"
}, },
"attribution": { "attribution": {
"themeBy": "Tema gerido por {autor}", "themeBy": "Tema gerido por {author}",
"iconAttribution": { "iconAttribution": {
"title": "Ícones usados" "title": "Ícones usados"
}, },
@ -211,7 +211,7 @@
"streetcomplete": "Outra aplicação semelhante é o <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>.", "streetcomplete": "Outra aplicação semelhante é o <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>.",
"createYourOwnTheme": "Crie o seu próprio tema MapComplete a partir do zero", "createYourOwnTheme": "Crie o seu próprio tema MapComplete a partir do zero",
"previouslyHiddenTitle": "Temas ocultos visitados anteriormente", "previouslyHiddenTitle": "Temas ocultos visitados anteriormente",
"hiddenExplanation": "Estes temas só são acessíveis a quem tem a hiperligação. Você descobriu {substituído} de {total_substituído} temas ocultos.", "hiddenExplanation": "Estes temas só são acessíveis a quem tem a hiperligação. Você descobriu {hidden_discovered} de {total_hidden} temas ocultos.",
"intro": "<h3>Mais mapas temáticos?</h3>Gosta de colecionar dados geográficos? <br>Tem mais temas disponíveis." "intro": "<h3>Mais mapas temáticos?</h3>Gosta de colecionar dados geográficos? <br>Tem mais temas disponíveis."
}, },
"about": "Edite e adicione facilmente o OpenStreetMap para um determinado tema", "about": "Edite e adicione facilmente o OpenStreetMap para um determinado tema",

View file

@ -125,7 +125,7 @@
"intro": "<h3>Compartilhe este mapa</h3> Compartilhe este mapa copiando o link abaixo e enviando-o para amigos e familiares:", "intro": "<h3>Compartilhe este mapa</h3> Compartilhe este mapa copiando o link abaixo e enviando-o para amigos e familiares:",
"embedIntro": "<h3>Incorpore em seu site</h3>Por favor, incorpore este mapa em seu site.<br>Nós o encorajamos a fazer isso - você nem precisa pedir permissão.<br>É gratuito e sempre será. Quanto mais pessoas usarem isso, mais valioso se tornará." "embedIntro": "<h3>Incorpore em seu site</h3>Por favor, incorpore este mapa em seu site.<br>Nós o encorajamos a fazer isso - você nem precisa pedir permissão.<br>É gratuito e sempre será. Quanto mais pessoas usarem isso, mais valioso se tornará."
}, },
"aboutMapcomplete": "<h3>Sobre o MapComplete</h3><p>Com o MapComplete, você pode enriquecer o OpenStreetMap com informações sobre um<b>único tema.</b>Responda a algumas perguntas e, em minutos, suas contribuições estarão disponíveis em todo o mundo! O<b>mantenedor do tema</b>define elementos, questões e linguagens para o tema.</p><h3>Saiba mais</h3><p>MapComplete sempre<b>oferece a próxima etapa</b>para saber mais sobre o OpenStreetMap.</p><ul><li>Quando incorporado em um site, o iframe vincula-se a um MapComplete em tela inteira</li><li>A versão em tela inteira oferece informações sobre o OpenStreetMap</li><li>A visualização funciona sem login, mas a edição requer um login do OSM.</li><li>Se você não estiver conectado, será solicitado que você faça o login</li><li>Depois de responder a uma única pergunta, você pode adicionar novos aponta para o mapa </li><li> Depois de um tempo, as tags OSM reais são mostradas, posteriormente vinculadas ao wiki </li></ul><p></p><br><p>Você percebeu<b>um problema</b>? Você tem uma<b>solicitação de recurso </b>? Quer<b>ajudar a traduzir</b>? Acesse <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">o código-fonte</a>ou <a href=\"https: //github.com/pietervdvn/MapComplete / issues \" target=\" _ blank \">rastreador de problemas.</a></p><p>Quer ver<b>seu progresso</b>? Siga a contagem de edição em<a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\">OsmCha</a>.</p>" "aboutMapcomplete": "<h3>Sobre o MapComplete</h3><p>Com o MapComplete, você pode enriquecer o OpenStreetMap com informações sobre um<b>único tema.</b>Responda a algumas perguntas e, em minutos, suas contribuições estarão disponíveis em todo o mundo! O<b>mantenedor do tema</b>define elementos, questões e linguagens para o tema.</p><h3>Saiba mais</h3><p>MapComplete sempre<b>oferece a próxima etapa</b>para saber mais sobre o OpenStreetMap.</p><ul><li>Quando incorporado em um site, o iframe vincula-se a um MapComplete em tela inteira</li><li>A versão em tela inteira oferece informações sobre o OpenStreetMap</li><li>A visualização funciona sem login, mas a edição requer um login do OSM.</li><li>Se você não estiver conectado, será solicitado que você faça o login</li><li>Depois de responder a uma única pergunta, você pode adicionar novos aponta para o mapa </li><li> Depois de um tempo, as tags OSM reais são mostradas, posteriormente vinculadas ao wiki </li></ul><p></p><br><p>Você percebeu<b>um problema</b>? Você tem uma<b>solicitação de recurso </b>? Quer<b>ajudar a traduzir</b>? Acesse <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">o código-fonte</a>ou <a href=\"https: //github.com/pietervdvn/MapComplete / issues \" target=\" _ blank \">rastreador de problemas.</a></p><p>Quer ver<b>seu progresso</b>? Siga a contagem de edição em<a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>"
}, },
"index": { "index": {
"pickTheme": "Escolha um tema abaixo para começar.", "pickTheme": "Escolha um tema abaixo para começar.",

View file

@ -77,7 +77,7 @@
"zoomInToSeeThisLayer": "Увеличьте масштаб, чтобы увидеть этот слой" "zoomInToSeeThisLayer": "Увеличьте масштаб, чтобы увидеть этот слой"
}, },
"backgroundMap": "Фоновая карта", "backgroundMap": "Фоновая карта",
"aboutMapcomplete": "<h3>О MapComplete</h3><p>С помощью MapComplete вы можете обогатить OpenStreetMap информацией по <b>одной теме.</b> Ответьте на несколько вопросов, и через несколько минут ваши материалы будут доступны по всему миру! <b>Сопровождающий темы</b> определяет элементы, вопросы и языки для темы.</p><h3>Узнайте больше</h3><p>MapComplete всегда <b>предлагает следующий шаг</b>, чтобы узнать больше об OpenStreetMap.</p><ul><li>При встраивании в веб-сайт iframe ссылается на полноэкранную версию MapComplete</li><li>Полноэкранная версия предлагает информацию об OpenStreetMap</li><li>Просмотр работает без входа, но для редактирования требуется вход в OSM.</li><li>Если вы не вошли в систему, вас попросят войти</li><li>Ответив на один вопрос, вы можете добавлять новые точки на карту</li><li>Через некоторое время отображаются актуальные OSM-метки с последующей ссылкой на вики</li></ul><p></p><br><p>Вы заметили <b>проблему</b>? У вас есть <b>запрос на функциональность</b>? Хотите <b>помочь с переводом</b>? Зайдите на <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">репозиторий с исходным кодом</a> или <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">трекер проблем.</a> </p> <p> Хотите увидеть <b>свой прогресс</b>? Следите за количеством правок на <a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\"> OsmCha</a>.</p>", "aboutMapcomplete": "<h3>О MapComplete</h3><p>С помощью MapComplete вы можете обогатить OpenStreetMap информацией по <b>одной теме.</b> Ответьте на несколько вопросов, и через несколько минут ваши материалы будут доступны по всему миру! <b>Сопровождающий темы</b> определяет элементы, вопросы и языки для темы.</p><h3>Узнайте больше</h3><p>MapComplete всегда <b>предлагает следующий шаг</b>, чтобы узнать больше об OpenStreetMap.</p><ul><li>При встраивании в веб-сайт iframe ссылается на полноэкранную версию MapComplete</li><li>Полноэкранная версия предлагает информацию об OpenStreetMap</li><li>Просмотр работает без входа, но для редактирования требуется вход в OSM.</li><li>Если вы не вошли в систему, вас попросят войти</li><li>Ответив на один вопрос, вы можете добавлять новые точки на карту</li><li>Через некоторое время отображаются актуальные OSM-метки с последующей ссылкой на вики</li></ul><p></p><br><p>Вы заметили <b>проблему</b>? У вас есть <b>запрос на функциональность</b>? Хотите <b>помочь с переводом</b>? Зайдите на <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">репозиторий с исходным кодом</a> или <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">трекер проблем.</a> </p> <p> Хотите увидеть <b>свой прогресс</b>? Следите за количеством правок на <a href=\"{osmcha_link}\" target=\"_blank\"> OsmCha</a>.</p>",
"customThemeIntro": "<h3>Пользовательские темы</h3>Это ранее просмотренные темы, созданные пользователями.", "customThemeIntro": "<h3>Пользовательские темы</h3>Это ранее просмотренные темы, созданные пользователями.",
"noTagsSelected": "Теги не выбраны", "noTagsSelected": "Теги не выбраны",
"getStartedNewAccount": " или <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">создать новую учетную запись</a>", "getStartedNewAccount": " или <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">создать новую учетную запись</a>",

View file

@ -6,7 +6,7 @@
"ph_not_known": " ", "ph_not_known": " ",
"open_24_7": "Öppet dygnet runt", "open_24_7": "Öppet dygnet runt",
"closed_permanently": "Stängt tills vidare", "closed_permanently": "Stängt tills vidare",
"closed_until": "Stängt till", "closed_until": "Stängt till {date}",
"openTill": "till", "openTill": "till",
"opensAt": "från", "opensAt": "från",
"open_during_ph": "Om det är en röd dag är det här stället", "open_during_ph": "Om det är en röd dag är det här stället",

View file

@ -692,7 +692,7 @@
"then": "Diese Straße ist keine Fahrradstraße" "then": "Diese Straße ist keine Fahrradstraße"
} }
}, },
"question": "Ist die Straße <b>{Name}</b> eine Fahrradstraße?" "question": "Ist die Straße <b>{name}</b> eine Fahrradstraße?"
}, },
"1": { "1": {
"question": "Wann wird diese Straße eine Fahrradstraße?", "question": "Wann wird diese Straße eine Fahrradstraße?",

View file

@ -645,7 +645,7 @@
"then": "Questa strada non è una strada ciclabile" "then": "Questa strada non è una strada ciclabile"
} }
}, },
"question": una strada ciclabile?" "question": <b>{name}</b> una strada ciclabile?"
}, },
"1": { "1": {
"question": "Questa strada diventerà una strada ciclabile quando?", "question": "Questa strada diventerà una strada ciclabile quando?",

View file

@ -518,8 +518,7 @@
"3": { "3": {
"then": "この通りはcyclestreetではない" "then": "この通りはcyclestreetではない"
} }
}, }
"question": "この通りはcyclestreetですか?"
}, },
"1": { "1": {
"question": "この通りはいつcyclestreetになるんですか?", "question": "この通りはいつcyclestreetになるんですか?",

View file

@ -198,8 +198,7 @@
"3": { "3": {
"then": "Denne gaten er ikke en sykkelvei" "then": "Denne gaten er ikke en sykkelvei"
} }
}, }
"question": "Er denne gaten en sykkelvei?"
} }
} }
}, },

View file

@ -159,7 +159,7 @@
"then": "Estação de despejo" "then": "Estação de despejo"
} }
}, },
"render": "Estação de despejo {nome}" "render": "Estação de despejo {name}"
} }
} }
}, },

View file

@ -89,7 +89,7 @@
"zoomInToSeeThisLayer": "放大來看這個圖層" "zoomInToSeeThisLayer": "放大來看這個圖層"
}, },
"backgroundMap": "背景地圖", "backgroundMap": "背景地圖",
"aboutMapcomplete": "<h3>關於 MapComplete</h3><p>使用 MapComplete 你可以藉由<b>單一主題</b>豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!<b>主題維護者</b>定議主題的元素、問題與語言。</p><h3>發現更多</h3><p>MapComplete 總是提供學習更多開放街圖<b>下一步的知識</b>。</p><ul><li>當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete</li><li>全螢幕的版本提供關於開放街圖的資訊</li><li>不登入檢視成果,但是要編輯則需登入 OSM。</li><li>如果你沒有登入,你會被要求先登入</li><li>當你回答單一問題時,你可以在地圖新增新的節點</li><li>過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki</li></ul><p></p><br><p>你有注意到<b>問題</b>嗎?你想請求<b>功能</b>嗎?想要<b>幫忙翻譯</b>嗎?來到<a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">原始碼</a>或是<a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">問題追蹤器。</a></p><p>想要看到<b>你的進度</b>嗎?到<a href=\"https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222021-01-01%22%2C%22value%22%3A%222021-01-01%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D\" target=\"_blank\">OsmCha</a>追蹤編輯數。</p>", "aboutMapcomplete": "<h3>關於 MapComplete</h3><p>使用 MapComplete 你可以藉由<b>單一主題</b>豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!<b>主題維護者</b>定議主題的元素、問題與語言。</p><h3>發現更多</h3><p>MapComplete 總是提供學習更多開放街圖<b>下一步的知識</b>。</p><ul><li>當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete</li><li>全螢幕的版本提供關於開放街圖的資訊</li><li>不登入檢視成果,但是要編輯則需登入 OSM。</li><li>如果你沒有登入,你會被要求先登入</li><li>當你回答單一問題時,你可以在地圖新增新的節點</li><li>過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki</li></ul><p></p><br><p>你有注意到<b>問題</b>嗎?你想請求<b>功能</b>嗎?想要<b>幫忙翻譯</b>嗎?來到<a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">原始碼</a>或是<a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">問題追蹤器。</a></p><p>想要看到<b>你的進度</b>嗎?到<a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>追蹤編輯數。</p>",
"customThemeIntro": "<h3>客製化主題</h3>觀看這些先前使用者創造的主題。", "customThemeIntro": "<h3>客製化主題</h3>觀看這些先前使用者創造的主題。",
"noTagsSelected": "沒有選取標籤", "noTagsSelected": "沒有選取標籤",
"getStartedNewAccount": " 或是 <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">註冊新帳號</a>", "getStartedNewAccount": " 或是 <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">註冊新帳號</a>",

View file

@ -9,6 +9,11 @@ class TranslationPart {
contents: Map<string, TranslationPart | string> = new Map<string, TranslationPart | string>() contents: Map<string, TranslationPart | string> = new Map<string, TranslationPart | string>()
/**
* Add a leaf object
* @param language
* @param obj
*/
add(language: string, obj: any) { add(language: string, obj: any) {
for (const key in obj) { for (const key in obj) {
const v = obj[key] const v = obj[key]
@ -135,6 +140,94 @@ class TranslationPart {
} }
return `{${parts.join(",")}}`; return `{${parts.join(",")}}`;
} }
/**
* Recursively adds a translation object, the inverse of 'toJson'
* @param language
* @param object
* @private
*/
private addTranslation(language: string, object: any){
for (const key in object) {
const v = object[key]
let subpart = <TranslationPart>this.contents.get(key)
if(subpart === undefined){
subpart = new TranslationPart()
this.contents.set(key, subpart)
}
if(typeof v === "string"){
subpart.contents.set(language, v)
}else{
subpart.addTranslation(language, v)
}
}
}
static fromDirectory(path): TranslationPart{
const files = ScriptUtils.readDirRecSync(path, 1).filter(file => file.endsWith(".json"))
const rootTranslation = new TranslationPart()
for (const file of files) {
const content = JSON.parse(readFileSync(file, "UTF8"))
rootTranslation.addTranslation(file.substr(0, file.length - ".json".length), content)
}
return rootTranslation
}
validateStrict(ctx?:string): void {
const errors = this.validate()
for (const err of errors) {
console.error("ERROR in "+(ctx ?? "")+ " " +err.path.join(".")+"\n "+err.error)
}
if(errors.length > 0){
throw ctx+" has "+errors.length+" inconsistencies in the translation"
}
}
/**
* Checks the leaf objects: special values must be present and identical in every leaf
*/
validate(path = []): {error: string, path: string[]} [] {
const errors : {error: string, path: string[]} []= []
const neededSubparts = new Set<string>()
let isLeaf : boolean = undefined
this.contents.forEach((value, key) => {
if(typeof value === "string"){
if(isLeaf === undefined){
isLeaf = true
}else if(!isLeaf){
errors.push({error:"Mixed node: non-leaf node has translation strings", path: path})
}
let subparts: string[] = value.match(/{[^}]*}/g)
if(subparts === null){
if(neededSubparts.size > 0){
errors.push({error:"The translation for "+key+" does not have any subparts, but expected "+Array.from(neededSubparts).join(",")+" . The full translation is "+value, path: path})
}
return
}
subparts = subparts.map(p => p.split(/\(.*\)/)[0])
neededSubparts.forEach(part => {
if(subparts.indexOf(part) < 0){
errors.push({error:"The translation for "+key+" does not have the required subpart "+part+". The full translation is "+value, path: path})
}
})
for (const subpart of subparts) {
neededSubparts.add(subpart)
}
}else{
const recErrors = value.validate([...path, key])
errors.push(...recErrors)
}
})
return errors
}
} }
/** /**
@ -181,6 +274,9 @@ function transformTranslation(obj: any, depth = 1) {
} }
/**
* Formats the specified file, helps to prevent merge conflicts
* */
function formatFile(path) { function formatFile(path) {
const contents = JSON.parse(readFileSync(path, "utf8")) const contents = JSON.parse(readFileSync(path, "utf8"))
writeFileSync(path, JSON.stringify(contents, null, " ")) writeFileSync(path, JSON.stringify(contents, null, " "))
@ -210,7 +306,10 @@ function compileTranslationsFromWeblate() {
.filter(path => path.indexOf(".json") > 0) .filter(path => path.indexOf(".json") > 0)
const allTranslations = new TranslationPart() const allTranslations = new TranslationPart()
allTranslations.validateStrict()
for (const translationFile of translations) { for (const translationFile of translations) {
try { try {
@ -417,4 +516,10 @@ if (!themeOverwritesWeblate) {
compileTranslationsFromWeblate(); compileTranslationsFromWeblate();
} }
genTranslations() genTranslations()
formatFile("./langs/en.json") formatFile("./langs/en.json")
// SOme validation
TranslationPart.fromDirectory("./langs").validateStrict("./langs")
TranslationPart.fromDirectory("./langs/layers").validateStrict("layers")
TranslationPart.fromDirectory("./langs/themes").validateStrict("themes")
TranslationPart.fromDirectory("./langs/shared-questions").validateStrict("shared-questions")