diff --git a/definition.yml b/definition.yml
index 50b6f31..e687869 100644
--- a/definition.yml
+++ b/definition.yml
@@ -1,8 +1,10 @@
name: custom-hotkeys
display-name: Custom Hotkeys
-version: 0.2.1
+version: 0.2.2
author: Krarilotus
type: module
+
+tags: [hotkeys, interface, tools]
game: [SHC==1.41, SHCE==1.41]
dependencies:
framework: ">=3.0.7"
diff --git a/files.xml b/files.xml
index 07883e1..aaee7b0 100644
--- a/files.xml
+++ b/files.xml
@@ -5,5 +5,6 @@
+
diff --git a/locale/ch.yml b/locale/ch.yml
new file mode 100644
index 0000000..5e4bdf4
--- /dev/null
+++ b/locale/ch.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: 快捷键
+tags.interface: 界面
+tags.tools: 工具
diff --git a/locale/de.yml b/locale/de.yml
new file mode 100644
index 0000000..8deef80
--- /dev/null
+++ b/locale/de.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Tastenkürzel
+tags.interface: Oberfläche
+tags.tools: Werkzeuge
diff --git a/locale/en.yml b/locale/en.yml
new file mode 100644
index 0000000..92fdd4c
--- /dev/null
+++ b/locale/en.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Hotkeys
+tags.interface: Interface
+tags.tools: Tools
diff --git a/locale/es.yml b/locale/es.yml
new file mode 100644
index 0000000..169d81f
--- /dev/null
+++ b/locale/es.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Atajos de teclado
+tags.interface: Interfaz
+tags.tools: Herramientas
diff --git a/locale/fa.yml b/locale/fa.yml
new file mode 100644
index 0000000..cea494a
--- /dev/null
+++ b/locale/fa.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: کلیدهای میانبر
+tags.interface: رابط کاربری
+tags.tools: ابزارها
diff --git a/locale/fr.yml b/locale/fr.yml
new file mode 100644
index 0000000..36f3eb3
--- /dev/null
+++ b/locale/fr.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Raccourcis clavier
+tags.interface: Interface
+tags.tools: Outils
diff --git a/locale/hu.yml b/locale/hu.yml
new file mode 100644
index 0000000..dcc7eb5
--- /dev/null
+++ b/locale/hu.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Gyorsbillentyűk
+tags.interface: Kezelőfelület
+tags.tools: Eszközök
diff --git a/locale/ru.yml b/locale/ru.yml
new file mode 100644
index 0000000..e438272
--- /dev/null
+++ b/locale/ru.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Горячие клавиши
+tags.interface: Интерфейс
+tags.tools: Инструменты
diff --git a/locale/tr.yml b/locale/tr.yml
new file mode 100644
index 0000000..4a96bb1
--- /dev/null
+++ b/locale/tr.yml
@@ -0,0 +1,3 @@
+tags.hotkeys: Kısayol tuşları
+tags.interface: Arayüz
+tags.tools: Araçlar
diff --git a/tests/test_package.py b/tests/test_package.py
index c274397..ee8a78f 100644
--- a/tests/test_package.py
+++ b/tests/test_package.py
@@ -14,7 +14,8 @@ def test_committed_module_package_is_reproducible_and_excludes_test_data(tmp_pat
names = set(archive.namelist())
assert {'init.lua', 'definition.yml', 'config.yml', 'build.json', 'code/native/runtime.lua'} <= names
assert all(name in ('init.lua', 'definition.yml', 'config.yml', 'README.md', 'build.json')
- or name.startswith('code/') for name in names)
+ or name.startswith(('code/', 'locale/')) for name in names)
+ assert {f'locale/{lang}.yml' for lang in ('en', 'de', 'fr', 'es', 'hu', 'tr', 'ru', 'ch', 'fa')} <= names
assert not any(name.endswith(('.exe', '.dll')) or 'probe' in name for name in names)
embedded = json.loads(archive.read('build.json'))
assert embedded['commit'] == receipt['commit']
diff --git a/tests/test_release_metadata.py b/tests/test_release_metadata.py
index 730fe61..b9bfb31 100644
--- a/tests/test_release_metadata.py
+++ b/tests/test_release_metadata.py
@@ -10,7 +10,9 @@
def test_optional_legacy_has_required_conflict_value_without_dependency_or_switch():
definition = yaml.safe_load((ROOT / 'definition.yml').read_text(encoding='utf-8'))
assert definition['display-name'] == 'Custom Hotkeys'
- assert definition['version'] == '0.2.1'
+ assert definition['version'] == '0.2.2'
+ assert definition['tags'] == ['hotkeys', 'interface', 'tools']
+ assert 'family' not in definition
assert 'ucp2-legacy' not in definition['dependencies']
config = yaml.safe_load((ROOT / 'config.yml').read_text(encoding='utf-8'))['config-sparse']
assert config['plugins'] == {}
@@ -19,7 +21,7 @@ def test_optional_legacy_has_required_conflict_value_without_dependency_or_switc
'o_keys': {'enabled': {'contents': {'required-value': False}}}}}}
assert not (ROOT / 'options.yml').exists()
files = {entry.attrib['src'] for entry in ET.parse(ROOT / 'files.xml').findall('./files/file')}
- assert files == {'definition.yml', 'config.yml', 'init.lua', 'code', 'README.md'}
+ assert files == {'definition.yml', 'config.yml', 'init.lua', 'code', 'README.md', 'locale'}
def test_all_store_languages_present_the_ingame_editor_without_release_notes():
@@ -37,6 +39,15 @@ def test_all_store_languages_present_the_ingame_editor_without_release_notes():
'Automarket', 'SHC 1.41', 'Extreme 1.41'))
+def test_discovery_tags_have_translated_labels_in_every_store_language():
+ assert {p.stem for p in (ROOT / 'locale').glob('*.yml')} == LANGUAGES
+ for lang in LANGUAGES:
+ labels = yaml.safe_load((ROOT / 'locale' / f'{lang}.yml').read_text(encoding='utf-8'))
+ assert set(labels) == {'tags.hotkeys', 'tags.interface', 'tags.tools'}
+ assert all(isinstance(value, str) and value.strip() and '?' not in value
+ for value in labels.values())
+
+
def test_all_runtime_lua_parses(lua):
# Includes native-only adapters that cannot execute in the host architecture.
load = lua.eval('function(path) return assert(loadfile(path)) ~= nil end')