Skip to content

Commit

Permalink
Merge branch 'master' into pl-lang
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander01998 authored Dec 23, 2024
2 parents 4c63875 + df24700 commit 857f3d2
Show file tree
Hide file tree
Showing 9 changed files with 260 additions and 10 deletions.
32 changes: 32 additions & 0 deletions .github/workflows/check_translations.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Check Translations

on:
push:
branches-ignore:
- "dependabot/**"
tags-ignore:
- "**"
paths:
- "src/main/resources/assets/wurst/translations/**.json"
- "src/main/resources/intentionally_untranslated.json"
pull_request:
paths:
- "src/main/resources/assets/wurst/translations/**.json"
- "src/main/resources/intentionally_untranslated.json"
workflow_dispatch:

jobs:
check_translations:
runs-on: ubuntu-latest
steps:

- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Run check_translations.py
run: python scripts/check_translations.py
48 changes: 40 additions & 8 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ on:
required: true
type: boolean
default: false
announce_backport:
description: "Announce as a backport on WurstForum"
required: false
type: boolean
default: false

jobs:
publish:
Expand Down Expand Up @@ -82,17 +87,44 @@ jobs:
GITHUB_TOKEN: ${{ secrets.OLD_MCX_PUBLISH_TOKEN }}
run: ./gradlew github --stacktrace

- name: Trigger website update
- name: Build website update inputs
id: website_inputs
if: ${{ inputs.update_website }}
env:
GH_TOKEN: ${{ secrets.WURSTCLIENT_NET_PUBLISH_TOKEN }}
run: |
MOD_VERSION=$(grep "mod_version" gradle.properties | cut -d'=' -f2 | tr -d ' \r')
WURST_VERSION=$(echo "$MOD_VERSION" | sed 's/^v//' | sed 's/-MC.*$//')
MC_VERSION=$(grep "minecraft_version" gradle.properties | cut -d'=' -f2 | tr -d ' \r')
FAPI_VERSION=$(grep "fabric_version" gradle.properties | cut -d'=' -f2 | tr -d ' \r')
gh workflow run add_wurst_port.yml \
-R Wurst-Imperium/WurstClient.net \
-f wurst_version="$WURST_VERSION" \
-f mc_version="$MC_VERSION" \
-f fapi_version="$FAPI_VERSION"
JSON_STRING=$(cat << EOF
{
"wurst_version": "$WURST_VERSION",
"mc_version": "$MC_VERSION",
"fapi_version": "$FAPI_VERSION",
"announce": "${{ inputs.announce_backport }}"
}
EOF
)
# Convert to single line and escape quotes
echo "json=${JSON_STRING//$'\n'/}" >> "$GITHUB_OUTPUT"
- name: Trigger website update
id: website_dispatch
if: ${{ inputs.update_website }}
uses: codex-/return-dispatch@v2
with:
token: ${{ secrets.WURSTCLIENT_NET_PUBLISH_TOKEN }}
owner: Wurst-Imperium
repo: WurstClient.net
ref: gh-pages
workflow: add_wurst_port.yml
workflow_inputs: ${{ steps.website_inputs.outputs.json }}

- name: Wait for website update to finish (run ${{ steps.website_dispatch.outputs.run_id }})
if: ${{ inputs.update_website }}
uses: codex-/await-remote-run@v1
with:
token: ${{ secrets.WURSTCLIENT_NET_PUBLISH_TOKEN }}
owner: Wurst-Imperium
repo: WurstClient.net
run_id: ${{ steps.website_dispatch.outputs.run_id }}
run_timeout_seconds: 600 # 10 minutes
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,7 @@ remappedSrc/
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

desktop.ini
# python
*.pyc

desktop.ini
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ jar {
from("LICENSE") {
rename {"${it}_${base.archivesName.get()}"}
}

exclude("intentionally_untranslated.json")
}

spotless {
Expand Down
154 changes: 154 additions & 0 deletions scripts/check_translations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import util
from pathlib import Path

translations_dir = Path("src") / "main" / "resources" / "assets" / "wurst" / "translations"


def show_translation_stats(en_us: dict, translations: dict):
"""Render a table of the current translation progress for each language."""
util.add_github_summary("| Language | Translated | % |")
util.add_github_summary("| --- | --- | --- |")
util.add_github_summary(f"| en_us | {len(en_us)} | 100.00% |")
for lang, data in translations.items():
util.add_github_summary(f"| {lang} | {len(data)} | {len(data) / len(en_us) * 100:.2f}% |")
util.add_github_summary("")


def check_extra_keys(en_us: dict, translations: dict):
"""Check if any translation files contain keys that don't exist in the original."""
extra_keys_found = False
for lang, data in translations.items():
extra_keys = set(data.keys()) - set(en_us.keys())
if extra_keys:
extra_keys_found = True
util.add_github_summary(
f"⚠ {lang}.json contains translations that don't exist in en_us.json ({len(extra_keys)} found):"
)
for key in extra_keys:
util.add_github_summary(f"- {key}")
if extra_keys_found:
raise Exception("Found extra keys in one or more translation files, see summary")
util.add_github_summary("✅ No extra keys found")


def check_untranslated_strings(en_us: dict, translations: dict):
"""Check if any translation files contain untranslated strings."""
untranslated_strings_found = False
intentionally_untranslated = util.read_json_file(
Path("src") / "main" / "resources" / "intentionally_untranslated.json"
)

for lang, data in translations.items():
untranslated_strings = set()
for key, value in data.items():
if value == en_us[key]:
if lang in intentionally_untranslated and key in intentionally_untranslated[lang]:
continue
untranslated_strings.add(key)
if untranslated_strings:
untranslated_strings_found = True
util.add_github_summary(
f"⚠ {lang}.json contains strings that are identical to en_us.json ({len(untranslated_strings)} found):"
)
for key in untranslated_strings:
util.add_github_summary(f"- {key}: {en_us[key]}")
util.add_github_summary(
"\nIf this is intentional, add the affected key(s) to intentionally_untranslated.json:"
)
util.add_github_summary("```json")
util.add_github_summary(f' "{lang}": [')
for key in untranslated_strings:
util.add_github_summary(f' "{key}"')
util.add_github_summary(" ]")
util.add_github_summary("```")

if untranslated_strings_found:
raise Exception("Found untranslated strings in one or more translation files, see summary")
util.add_github_summary("✅ No accidentally untranslated strings found")


def check_order_of_strings(en_us: dict, translations: dict):
"""Check if the strings in each translation file are in the same order as in en_us.json."""
for lang, data in translations.items():
en_us_keys_present_in_translation = [key for key in en_us.keys() if key in data.keys()]
translation_keys_present_in_en_us = [key for key in data.keys() if key in en_us.keys()]
if en_us_keys_present_in_translation != translation_keys_present_in_en_us:
raise Exception(f"⚠ The order of strings in {lang}.json is different from en_us.json")
util.add_github_summary("✅ The order of strings in each translation file matches en_us.json")


def check_known_issues(en_us: dict, translations: dict):
"""Check if any translation files contain known issues."""
issues_found = False

# Typos
known_typos = {
"Anchoraura": "AnchorAura",
"Autobuild": "AutoBuild",
"Clickaura": "ClickAura",
"KillAura": "Killaura",
"LegitNuker": "Nuker",
"LegitKillaura": "KillauraLegit",
"Nofall": "NoFall",
"Triggerbot": "TriggerBot",
}
for lang, data in translations.items():
for key, value in data.items():
for typo, correct in known_typos.items():
if typo in value:
issues_found = True
util.add_github_summary(
f"⚠ In {lang}.json string {key}, the word '{correct}' is incorrectly translated as '{typo}':"
)
util.add_github_summary("```json")
util.add_github_summary(f' "{key}": "{value}"')
util.add_github_summary("```")

# Difficult strings
for lang, data in translations.items():
# Boatfly
boatfly_key = "description.wurst.hack.boatfly"
if boatfly_key in data and "shift" in data[boatfly_key].lower():
issues_found = True
util.add_github_summary(
f"⚠ In {lang}.json, the translation for {boatfly_key} incorrectly suggests using the shift (sneak) key instead of ctrl (sprint) to descend"
)
# Radar
radar_key = "description.wurst.hack.radar"
if radar_key in data and (
"§cred§r" in data[radar_key]
# Not checking orange because it appears in the French translation
or "§agreen§r" in data[radar_key]
or "§7gray§r" in data[radar_key]
):
issues_found = True
util.add_github_summary(
f"⚠ In {lang}.json, the translation for {radar_key} contains untranslated colors:"
)
util.add_github_summary("```json")
util.add_github_summary(f' "{radar_key}": "{data[radar_key]}"')
util.add_github_summary("```")

if issues_found:
raise Exception("Found known issues in one or more translation files, see summary")
util.add_github_summary("✅ No known issues found in any translation files")


def main():
en_us = util.read_json_file(translations_dir / "en_us.json")
translations = {}
for path in sorted(translations_dir.rglob("*.json"), key=lambda x: x.name):
if path.is_file() and path.name != "en_us.json":
lang = path.name.removesuffix(".json")
data = util.read_json_file(path)
translations[lang] = data

show_translation_stats(en_us, translations)
check_extra_keys(en_us, translations)
check_untranslated_strings(en_us, translations)
check_order_of_strings(en_us, translations)
check_known_issues(en_us, translations)


if __name__ == "__main__":
main()
17 changes: 17 additions & 0 deletions scripts/util.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import json
import os
from pathlib import Path


def read_json_file(path: Path) -> dict:
"""Read a JSON data file."""
return json.loads(path.read_text(encoding="utf-8"))


def add_github_summary(summary: str):
"""Add a line to the GitHub Actions summary for the current step."""
if "GITHUB_STEP_SUMMARY" not in os.environ:
print(summary)
return
with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as summary_file:
print(summary, file=summary_file)
2 changes: 2 additions & 0 deletions src/main/java/net/wurstclient/test/CopyItemCmdTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public static void testCopyItemCmd()
{
System.out.println("Testing .copyitem command");
setPerspective(Perspective.THIRD_PERSON_FRONT);
runChatCommand("clear");
clearChat();

// Put on a golden helmet
runChatCommand("item replace entity @s armor.head with golden_helmet");
Expand Down
1 change: 0 additions & 1 deletion src/main/resources/assets/wurst/translations/zh_hk.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"description.wurst.hack.anchoraura": "自動放置(可選),充能並引爆重生錨以擊殺你附近嘅實體。",
"description.wurst.hack.antiafk": "隨便行,避免被伺服器掛機檢查。",
"OUTDATED.description.wurst.hack.antiblind": "以防盲咗。\n同 OptiFine(高清修復)唔兼容。",
"description.wurst.hack.anticactus": "保護你避免受到仙人掌傷害。",
"description.wurst.hack.antiknockback": "保護你唔會被其他生物或者玩家推動同埋用劍擊退。",
"description.wurst.hack.antispam": "預防存在嘅重復刷屏,改為用計數器顯示。",
Expand Down
9 changes: 9 additions & 0 deletions src/main/resources/intentionally_untranslated.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"de_de": [
"key.wurst.zoom"
],
"fr_fr": [
"key.wurst.zoom",
"button.wurst.nochatreports.signatures_status"
]
}

0 comments on commit 857f3d2

Please sign in to comment.