i18n Demo¶
displays translated text and switches locale with key presses.
▶ Run in browserTags: ui
Shows a greeting, item count, and instructions in multiple languages. Press 1-4 to switch between English, French, Japanese, and Arabic.
Run: uv run python examples/features/ui/i18n.py
Source¶
1"""i18n Demo: displays translated text and switches locale with key presses.
2
3Shows a greeting, item count, and instructions in multiple languages.
4Press 1-4 to switch between English, French, Japanese, and Arabic.
5
6Run: uv run python examples/features/ui/i18n.py
7"""
8
9from simvx.core import (
10 Input,
11 InputMap,
12 Key,
13 Node,
14 Text2D,
15 Vec3,
16)
17from simvx.core.i18n import TranslationServer, tr
18from simvx.graphics import App
19
20# Translation data (inline: no external file needed)
21TRANSLATIONS = {
22 "en": {
23 "greeting": "Hello, {name}!",
24 "item_one": "You have {count} item.",
25 "item_other": "You have {count} items.",
26 "language": "Language: English",
27 "instructions": "Press 1=EN 2=FR 3=JA 4=AR ESC=Quit",
28 },
29 "fr": {
30 "greeting": "Bonjour, {name} !",
31 "item_one": "Vous avez {count} objet.",
32 "item_other": "Vous avez {count} objets.",
33 "language": "Langue : Fran\u00e7ais",
34 "instructions": "Appuyez 1=EN 2=FR 3=JA 4=AR ESC=Quitter",
35 },
36 "ja": {
37 "greeting": "\u3053\u3093\u306b\u3061\u306f\u3001{name}\u3055\u3093\uff01",
38 "item_other": "\u30a2\u30a4\u30c6\u30e0\u304c{count}\u500b\u3042\u308a\u307e\u3059\u3002",
39 "language": "\u8a00\u8a9e: \u65e5\u672c\u8a9e",
40 "instructions": "1=EN 2=FR 3=JA 4=AR ESC=\u7d42\u4e86",
41 },
42 "ar": {
43 "greeting": "\u0645\u0631\u062d\u0628\u0627\u060c {name}!",
44 "item_zero": "\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0639\u0646\u0627\u0635\u0631.",
45 "item_one": "\u0644\u062f\u064a\u0643 \u0639\u0646\u0635\u0631 \u0648\u0627\u062d\u062f.",
46 "item_two": "\u0644\u062f\u064a\u0643 \u0639\u0646\u0635\u0631\u0627\u0646.",
47 "item_few": "\u0644\u062f\u064a\u0643 {count} \u0639\u0646\u0627\u0635\u0631.",
48 "item_many": "\u0644\u062f\u064a\u0643 {count} \u0639\u0646\u0635\u0631\u0627.",
49 "item_other": "\u0644\u062f\u064a\u0643 {count} \u0639\u0646\u0635\u0631.",
50 "language": "\u0627\u0644\u0644\u063a\u0629: \u0627\u0644\u0639\u0631\u0628\u064a\u0629",
51 "instructions": "1=EN 2=FR 3=JA 4=AR ESC=\u062e\u0631\u0648\u062c",
52 },
53}
54
55LOCALE_KEYS = {"1": "en", "2": "fr", "3": "ja", "4": "ar"}
56_KEY_MAP = {"1": Key.KEY_1, "2": Key.KEY_2, "3": Key.KEY_3, "4": Key.KEY_4}
57
58
59class I18nDemo(Node):
60 """Root scene that displays translated text and handles locale switching."""
61
62 def on_ready(self):
63 ts = TranslationServer.instance()
64 ts.load_dict(TRANSLATIONS)
65 ts.locale = "en"
66
67 # Register key actions for locale switching
68 for key in LOCALE_KEYS:
69 InputMap.add_action(f"locale_{key}", [_KEY_MAP[key]])
70
71 # Create text nodes
72 self.title = self.add_child(Text2D(name="Title", position=Vec3(0, 3, 0)))
73 self.greeting_text = self.add_child(Text2D(name="Greeting", position=Vec3(0, 1.5, 0)))
74 self.plural_text = self.add_child(Text2D(name="Plural", position=Vec3(0, 0, 0)))
75 self.lang_text = self.add_child(Text2D(name="Language", position=Vec3(0, -1.5, 0)))
76 self.help_text = self.add_child(Text2D(name="Help", position=Vec3(0, -3, 0)))
77
78 self._item_count = 5
79 self._refresh_text()
80
81 def on_process(self, dt: float):
82 ts = TranslationServer.instance()
83 changed = False
84 for key, locale_code in LOCALE_KEYS.items():
85 if Input.is_action_just_pressed(f"locale_{key}"):
86 ts.locale = locale_code
87 changed = True
88 break
89 if changed:
90 self._refresh_text()
91
92 def _refresh_text(self):
93 ts = TranslationServer.instance()
94 self.title.text = f"SimVX i18n Demo [{ts.locale.upper()}]"
95 self.greeting_text.text = tr("greeting", name="Player")
96 self.plural_text.text = ts.translate_plural("item", self._item_count)
97 self.lang_text.text = tr("language")
98 self.help_text.text = tr("instructions")
99
100
101if __name__ == "__main__":
102 app = App(title="SimVX i18n Demo", width=900, height=500)
103 app.run(I18nDemo())