i18n Demo

displays translated text and switches locale with key presses.

▶ Run in browser

Tags: 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())