Skip to content

Commit

Permalink
Merge pull request #7 from Jag-Marcel/swift-conversions
Browse files Browse the repository at this point in the history
Implemented conversions between JSON and Xcode files
  • Loading branch information
andrewtavis authored Jun 12, 2024
2 parents 8a99dba + 6b43924 commit 06027db
Show file tree
Hide file tree
Showing 12 changed files with 1,179 additions and 7 deletions.
40 changes: 40 additions & 0 deletions .github/workflows/xcstrings_conversion.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: xcstrings_conversion.yml

on:
push:
branches:
- main

jobs:
# Check to make sure the localization files have actually changed.
conditional_job_check_files:
runs-on: ubuntu-latest
outputs:
json_changed: ${{ steps.check_file_changed.outputs.json_changed }}
steps:
- name: Checkout
uses: actions/checkout@v4
- shell: pwsh
id: check_file_changed
run: |
$diff = git diff --name-only HEAD^ HEAD
$SourceDiff = $diff | Where-Object { $_ -match '^Scribe-i18n/' -and $_ -match '.json$' }
$HasDiff = $SourceDiff.Length -gt 0
Write-Host "::set-output name=json_changed::$HasDiff"
# Run xcstrings conversion script if needed.
conditional_job:
runs-on: ubuntu-latest
needs:
- conditional_job_check_files
if: needs.conditional_job_check_files.outputs.json_changed == 'True'
steps:
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: 3.12
- name: Execute script to convert JSON to xcstrings
run: |
python convert_to_xcstrings.py
647 changes: 647 additions & 0 deletions Scribe-i18n/Localizable.xcstrings

Large diffs are not rendered by default.

42 changes: 42 additions & 0 deletions Scribe-i18n/Scripts/convert_from_xcstrings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""
Converts from an xcstrings file to JSON files.
"""

import json
import os

directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
file = open(os.path.join(directory, "Localizable.xcstrings"), "r").read()
files = os.listdir(directory)

languages = [file.replace(".json", "") for file in files if file.endswith(".json")]

for lang in languages:
dest = open(f"{directory}/{lang}.json", "w")
if lang == "en-US":
lang = "en"

json_file = json.loads(file)
strings = json_file["strings"]

data = "{\n"
for pos, key in enumerate(strings, start=1):
translation = ""
if (
lang in json_file["strings"][key]["localizations"]
and json_file["strings"][key]["localizations"][lang]["stringUnit"]["value"]
!= ""
and json_file["strings"][key]["localizations"][lang]["stringUnit"]["value"]
!= key
):
translation = (
json_file["strings"][key]["localizations"][lang]["stringUnit"]["value"]
.replace('"', '\\"')
.replace("\n", "\\n")
)
data += f' "{key}" : "{translation}"'
data += ",\n" if pos < len(json_file["strings"]) else "\n"

data += "}\n"

dest.write(data)
51 changes: 51 additions & 0 deletions Scribe-i18n/Scripts/convert_to_xcstrings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""
Converts from JSON files to an xcstrings file.
"""

import json
import os

directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
files = os.listdir(directory)
languages = sorted(
[file.replace(".json", "") for file in files if file.endswith(".json")]
)
path = os.path.join(directory, "en-US.json")
file = open(path, "r").read()
file = json.loads(file)

data = "{\n" ' "sourceLanguage" : "en",\n' ' "strings" : {\n'
for pos, key in enumerate(file, start=1):
data += (
f' "{key}" : {{\n' f' "comment" : "",\n' f' "localizations" : {{\n'
)
for lang in languages:
if lang != "en-US":
lang_json = json.loads(
open(os.path.join(directory, f"{lang}.json"), "r").read()
)
translation = lang_json[key].replace('"', '\\"').replace("\n", "\\n")
if translation != "":
data += (
f' "{lang}" : {{\n'
f' "stringUnit" : {{\n'
f' "state" : "",\n'
f' "value" : "{translation}"\n'
f" }}\n"
f" }},\n"
)

lang_json = json.loads(open(os.path.join(directory, "en-US.json"), "r").read())
translation = lang_json[key].replace('"', '\\"').replace("\n", "\\n")
data += (
f' "en" : {{\n'
f' "stringUnit" : {{\n'
f' "state" : "",\n'
f' "value" : "{translation}"\n'
f" }}\n"
f" }}\n"
)

data += " }\n" " },\n" if pos < len(file) else " }\n" " }\n"
data += " }},\n" ' "version" : "1.0"\n' "}}"
open(os.path.join(directory, "Localizable.xcstrings"), "w").write(data)
58 changes: 57 additions & 1 deletion Scribe-i18n/de.json
Original file line number Diff line number Diff line change
@@ -1 +1,57 @@
{}
{
"about.appHints" : "",
"about.bugReport" : "",
"about.community" : "",
"about.email" : "",
"about.feedback" : "",
"about.github" : "",
"about.legal" : "",
"about.matrix" : "",
"about.privacyPolicy" : "Datenschutzrichtlinie",
"about.privacyPolicy.body" : "Bitte beachten Sie, dass die englische Version dieser Richtlinie Vorrang vor allen anderen Versionen hat.\n\nDie Scribe-Entwickler (SCRIBE) haben die iOS-Applikation „Scribe – Language Keyboards“ (SERVICE) als Open-Source-Applikation entwickelt. Dieser SERVICE wird von SCRIBE kostenlos zur Verfügung gestellt und ist zur Verwendung so wie sie ist bestimmt.\n\nDiese Datenschutzrichtlinie (RICHTLINIE) wird verwendet, um den Leser über die Richtlinien für den Zugriff, die Verfolgung, die Erfassung, die Aufbewahrung, die Verwendung und die Offenlegung von persönlichen Informationen (BENUTZERINFORMATIONEN) und Nutzungsdaten (BENUTZERDATEN) für alle Personen zu informieren, die sie verwenden diesen SERVICE (BENUTZER).\n\nBENUTZERINFORMATIONEN sind insbesondere alle Informationen, die sich auf die BENUTZER selbst oder die Geräte beziehen, die sie für den Zugriff auf den SERVICE verwenden.\n\nBENUTZERDATEN sind speziell definiert als jeder Text, der eingegeben wird, oder Aktionen, die von den BENUTZERN während der Nutzung des SERVICE ausgeführt werden.\n\n1. Grundsatzerklärung\n\nDieser SERVICE greift nicht auf BENUTZERINFORMATIONEN oder BENUTZERDATEN zu, verfolgt, sammelt, speichert, verwendet oder gibt keine BENUTZERDATEN weiter.\n\n2. Nicht verfolgen\n\nBENUTZER, die SCRIBE kontaktieren, um zu verlangen, dass ihre BENUTZERINFORMATIONEN und BENUTZERDATEN nicht verfolgt werden, erhalten eine Kopie dieser RICHTLINIE sowie einen Link zu allen Quellcodes als Nachweis, dass sie nicht verfolgt werden.\n\n3. Daten von Drittanbietern\n\nDieser SERVICE verwendet Daten von Drittanbietern. Alle Daten, die bei der Erstellung dieses SERVICE verwendet werden, stammen aus Quellen, die ihre vollständige Nutzung in der vom SERVICE durchgeführten Weise ermöglichen. Insbesondere stammen die Daten für diesen SERVICE von Wikidata, Wikipedia und Unicode. Wikidata erklärt: „Alle strukturierten Daten in den Haupt-, Eigenschafts- und Lexem-Namespaces werden unter der Creative Commons CC0-Lizenz verfügbar gemacht; Text in anderen Namespaces wird unter der Creative Commons Attribution-Share Alike License verfügbar gemacht.“ Die Richtlinie zur detaillierten Verwendung von Wikidata-Daten finden Sie unter https://www.wikidata.org/wiki/Wikidata:Licensing. Wikipedia gibt an, dass Textdaten, die Art von Daten, die vom SERVICE verwendet werden, \"... unter den Bedingungen der Creative Commons Attribution Share-Alike-Lizenz verwendet werden können\". Die Richtlinie zur Nutzung von Wikipedia-Daten finden Sie unter https://en.wikipedia.org/wiki/Wikipedia:Reusing_Wikipedia_content. Unicode gewährt jeder Person, „... kostenlos, die Erlaubnis, eine Kopie der Unicode-Datendateien und der zugehörigen Dokumentation (die „Datendateien“) oder der Unicode-Software und der zugehörigen Dokumentation (die „Software“) zu erwerben, um damit zu handeln die Datendateien oder Software ohne Einschränkung...\" Die Richtlinie zur Nutzung von Unicode-Daten finden Sie unter https://www.unicode.org/license.txt.\n\n4. Quellcode von Drittanbietern\n\nDieser SERVICE basierte auf Code von Drittanbietern. Der gesamte Quellcode, der bei der Erstellung dieses SERVICE verwendet wird, stammt aus Quellen, die seine vollständige Nutzung in der vom SERVICE durchgeführten Weise ermöglichen. Grundlage dieses Projekts war insbesondere das Projekt CustomKeyboard von Ethan Sarif-Kattan. CustomKeyboard wurde unter einer MIT-Lizenz veröffentlicht, wobei diese Lizenz unter https://github.com/EthanSK/CustomKeyboard/blob/master/LICENSE verfügbar ist.\n\n5. Dienste von Drittanbietern\n\nDieser SERVICE nutzt Dienste von Drittanbietern, um einige der Daten von Drittanbietern zu manipulieren. Insbesondere wurden Daten unter Verwendung von Modellen von Hugging Face Transformers übersetzt. Dieser Dienst ist durch eine Apache-Lizenz 2.0 abgedeckt, die besagt, dass er für die kommerzielle Nutzung, Änderung, Verteilung, Patentnutzung und private Nutzung verfügbar ist. Die Lizenz für den oben genannten Dienst finden Sie unter https://github.com/huggingface/transformers/blob/master/LICENSE.\n\n6. Links zu Drittanbietern\n\nDieser SERVICE enthält Links zu externen Websites. Wenn BENUTZER auf einen Link eines Drittanbieters klicken, werden sie auf eine Website weitergeleitet. Beachten Sie, dass diese externen Websites nicht von diesem SERVICE betrieben werden. Daher wird BENUTZERN dringend empfohlen, die Datenschutzrichtlinie dieser Websites zu lesen. Dieser SERVICE hat keine Kontrolle über und übernimmt keine Verantwortung für die Inhalte, Datenschutzrichtlinien oder Praktiken von Websites oder Diensten Dritter.\n\n7. Bilder von Drittanbietern\n\nDieser SERVICE enthält Bilder, die von Dritten urheberrechtlich geschützt sind. Insbesondere enthält diese App eine Kopie der Logos von GitHub, Inc und Wikidata, Warenzeichen von Wikimedia Foundation, Inc. Die Bedingungen, unter denen das GitHub-Logo verwendet werden kann, finden Sie unter https://github.com/logos und die Bedingungen für das Wikidata-Logo finden Sie auf der folgenden Wikimedia-Seite: https://foundation.wikimedia.org/wiki/Policy:Trademark_policy. Dieser SERVICE verwendet die urheberrechtlich geschützten Bilder in einer Weise, die diesen Kriterien entspricht, wobei die einzige Abweichung eine Drehung des GitHub-Logos ist, die in der Open-Source-Community üblich ist, um anzuzeigen, dass es einen Link zur GitHub-Website gibt.\n\n8. Inhaltshinweis\n\nDieser SERVICE ermöglicht NUTZERN den Zugriff auf sprachliche Inhalte (INHALTE). Einige dieser INHALTE könnten für Kinder und Minderjährige als ungeeignet erachtet werden. Der Zugriff auf INHALTE über den DIENST erfolgt auf eine Weise, dass die Informationen nicht verfügbar sind, es sei denn, sie sind ausdrücklich bekannt. Insbesondere „können“ BENUTZER Wörter übersetzen, Verben konjugieren und auf andere grammatikalische Merkmale von INHALTEN zugreifen, die sexueller, gewalttätiger oder anderweitig unangemessener Natur sein können. BENUTZER „können“ keine Wörter übersetzen, Verben konjugieren und auf andere grammatikalische Merkmale von INHALTEN zugreifen, die sexueller, gewalttätiger oder anderweitig unangemessener Natur sein können, wenn sie nicht bereits über die Natur dieser INHALTE Bescheid wissen. SCRIBE übernimmt keine Verantwortung für den Zugriff auf solche INHALTE.\n\n9. Änderungen\n\nDiese RICHTLINIE kann sich ändern. Aktualisierungen dieser RICHTLINIE ersetzen alle vorherigen Instanzen, und wenn sie als wesentlich erachtet werden, werden sie in der nächsten anwendbaren Aktualisierung des SERVICE weiter deutlich angegeben. SCRIBE ermutigt BENUTZER, diese RICHTLINIE regelmäßig auf die neuesten Informationen zu unseren Datenschutzpraktiken zu überprüfen und sich mit etwaigen Änderungen vertraut zu machen.\n\n10. Kontakt\n\nWenn Sie Fragen, Bedenken oder Vorschläge zu dieser RICHTLINIE haben, zögern Sie nicht, https://github.com/scribe-org zu besuchen oder SCRIBE unter [email protected] zu kontaktieren. Verantwortlich für solche Anfragen ist Andrew Tavis McAllister.\n\n11. Datum des Inkrafttretens\n\nDiese RICHTLINIE tritt am 24. Mai 2022 in Kraft.",
"about.privacyPolicy.caption" : "Wir sorgen für Ihre Sicherheit",
"about.rate" : "",
"about.scribe" : "",
"about.share" : "",
"about.thirdParty" : "",
"about.thirdParty.author" : "",
"about.thirdParty.body" : "",
"about.thirdParty.caption" : "",
"about.thirdParty.license" : "",
"about.thirdParty.link" : "",
"about.title" : "",
"about.wikimedia" : "",
"about.wikimedia.caption" : "",
"about.wikimedia.text1" : "",
"about.wikimedia.text2" : "",
"about.wikimedia.text3" : "",
"french" : "",
"german" : "Deutsch",
"install" : "Installation",
"install.settingsLink" : "",
"install.text" : "",
"install.text2" : "",
"install.text3" : "",
"install.title" : "",
"italian" : "",
"keyboards" : "",
"portuguese" : "",
"russian" : "",
"settings.appSettings" : "",
"settings.appSettings.appLanguage" : "",
"settings.functionality" : "",
"settings.functionality.autoSuggestEmoji" : "",
"settings.installedKeyboards" : "",
"settings.layout" : "",
"settings.layout.autoSuggestEmoji.description" : "",
"settings.layout.disableAccentCharacters" : "",
"settings.layout.disableAccentCharacters.description" : "",
"settings.layout.periodAndComma" : "",
"settings.layout.periodAndComma.description" : "",
"settings.title" : "Einstellungen",
"spanish" : "",
"swedish" : "",
"wikidataExplanation1" : "",
"wikidataExplanation2" : "",
"wikidataExplanation3" : ""
}
Loading

0 comments on commit 06027db

Please sign in to comment.