From 2aced0c61a71168c98512f3d0fb243e1d7fd6bce Mon Sep 17 00:00:00 2001 From: Kirill Date: Sun, 18 Oct 2026 20:32:20 +0300 Subject: [PATCH] Add localization support for achievements: implement language-specific titles and update UI components --- tests/test_achievements.gd | 22 ++++++++++++++++++++ ui/achievements/achievement_controller.gd | 6 ++++++ ui/achievements/achievement_item.tscn | 12 ++++++----- ui/achievements/achievements.en.png | 4 ++-- ui/achievements/achievements.ru.png | 4 ++-- world/world.tscn | 25 +++-------------------- 6 files changed, 42 insertions(+), 31 deletions(-) diff --git a/tests/test_achievements.gd b/tests/test_achievements.gd index 0e8a4d7..677f2a6 100644 --- a/tests/test_achievements.gd +++ b/tests/test_achievements.gd @@ -22,6 +22,14 @@ func node(parent: Node, child: Node, label: String) -> Node: return child func run() -> void: check(load("res://stage/stage.gd") != null, "Stage integration compiles") + var scene: PackedScene = load("res://world/world.tscn") + var scene_state: SceneState = scene.get_state() + for language in ["English", "Russian"]: + var connected := false + for i in scene_state.get_connection_count(): + if str(scene_state.get_connection_source(i)) == "Stage/MainMenu/Language/" + language: + connected = scene_state.get_connection_signal(i) == &"pressed" and str(scene_state.get_connection_target(i)) == "Stage/MainMenu" and scene_state.get_connection_method(i) == &"_on_change_locale_pressed" and scene_state.get_connection_binds(i) == ["en" if language == "English" else "ru"] + check(connected, language + " button connects to locale handler") var stage := MockStage.new() root.add_child(stage) var world = node(stage, Control.new(), "World") @@ -31,6 +39,7 @@ func run() -> void: for names in [["ForcePage", "ForceHeader"], ["ResourcePage", "ResourceHeader"], ["StarPage", "StarHeader"], ["StructurePage", "StructureHeader"], ["LifePage", "LifeHeader"]]: node(node(pages, VBoxContainer.new(), names[0]), HBoxContainer.new(), names[1]) var screen = node(stage, Control.new(), "Achievements") + var title = node(node(screen, Control.new(), "Header"), TextureRect.new(), "Title") node(node(screen, ScrollContainer.new(), "AchievementList"), VBoxContainer.new(), "AchievementItems") var controller = Controller.new() controller.progress_path = "/tmp/owniverse-achievements-test-%s.cfg" % OS.get_process_id() @@ -99,6 +108,19 @@ func run() -> void: global.Locale = "ru" controller.update(0.0) check(controller.status.text.begins_with("Открыто"), "Status localizes") + check(title.texture == Controller.TITLES.ru, "Russian title selected") + check(controller.items.a71.event_label.text.contains("90 квадриллионов"), "Russian achievement text selected") + global.Locale = "en" + controller.update(0.0) + check(controller.status.text.begins_with("Unlocked"), "English status selected") + check(title.texture == Controller.TITLES.en, "English title selected") + check(controller.items.a71.event_label.text.contains("90 quadrillion"), "English achievement text selected") + controller.current = {"id": "a71", "type": "c"} + controller._display_event(controller.current) + check(controller.notification_item.event_label.text.contains("90 quadrillion"), "English notification text selected") + global.Locale = "ru" + controller.update(0.0) + check(controller.notification_item.event_label.text.contains("90 квадриллионов"), "Active notification changes language") global.Locale = previous_locale var path: String = controller.progress_path stage.free() diff --git a/ui/achievements/achievement_controller.gd b/ui/achievements/achievement_controller.gd index 3484a2d..10c75b0 100644 --- a/ui/achievements/achievement_controller.gd +++ b/ui/achievements/achievement_controller.gd @@ -2,6 +2,10 @@ extends Node ## Player-wide achievement progress and the shared in-game notification queue. const E = preload("res://world/owniverse/math/exact.gd") const ITEM = preload("res://ui/achievements/achievement_item.tscn") +const TITLES = { + "en": preload("res://ui/achievements/achievements.en.png"), + "ru": preload("res://ui/achievements/achievements.ru.png"), +} var progress_path: String = "user://achievements.cfg" const HOLD_SECONDS = 3.0 const FADE_SECONDS = 0.3 @@ -158,6 +162,8 @@ func _display_event(event: Dictionary) -> void: panel.show() func _rebuild_list() -> void: + var title: TextureRect = stage.get_node_or_null("Achievements/Header/Title") + if title != null: title.texture = TITLES[locale] var unlocked := 0 var position := 1 for id in definitions: diff --git a/ui/achievements/achievement_item.tscn b/ui/achievements/achievement_item.tscn index 45520d2..9fd16d6 100644 --- a/ui/achievements/achievement_item.tscn +++ b/ui/achievements/achievement_item.tscn @@ -11,7 +11,7 @@ [ext_resource type="Texture2D" uid="uid://bmp7e6lmtaex0" path="res://ui/achievements/icons/10g.png" id="9_3xyrb"] [node name="AchievementItem" type="Control" unique_id=1273881744] -custom_minimum_size = Vector2(0, 128) +custom_minimum_size = Vector2(1080, 128) layout_mode = 3 anchors_preset = 0 size_flags_horizontal = 3 @@ -19,9 +19,9 @@ script = ExtResource("1_w8f20") [node name="Row" type="HBoxContainer" parent="." unique_id=2025386077] layout_mode = 0 -anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +theme_override_constants/separation = 16 [node name="Icon1c" type="TextureRect" parent="Row" unique_id=2146478339] visible = false @@ -74,8 +74,10 @@ texture = ExtResource("9_3xyrb") [node name="Label" type="RichTextLabel" parent="Row" unique_id=230945261] layout_mode = 2 size_flags_horizontal = 3 -bbcode_enabled = true -fit_content = true -scroll_active = false theme_override_font_sizes/normal_font_size = 30 theme_override_font_sizes/bold_font_size = 30 +bbcode_enabled = true +text = "123" +fit_content = true +scroll_active = false +vertical_alignment = 1 diff --git a/ui/achievements/achievements.en.png b/ui/achievements/achievements.en.png index 436da4b..bceecc6 100644 --- a/ui/achievements/achievements.en.png +++ b/ui/achievements/achievements.en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fb7c851d33e0b07b159af6a994f852c96b0185931e62bf2f0f680a0cfa925adc -size 32397 +oid sha256:4e0fd08c5b60111543a3596d0d60ff46232879b8af1b6e81452e2ac6e2541b14 +size 40647 diff --git a/ui/achievements/achievements.ru.png b/ui/achievements/achievements.ru.png index ee3255a..8344dc9 100644 --- a/ui/achievements/achievements.ru.png +++ b/ui/achievements/achievements.ru.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7b3527e8f0011035d46705733b1fef7b144130e72e1d237caf25c31498f83aa -size 26671 +oid sha256:857b824c14fdd582a3f35e22343d757f55c5196306af279361139bb2041c03a2 +size 35010 diff --git a/world/world.tscn b/world/world.tscn index 388dbfa..ced124b 100644 --- a/world/world.tscn +++ b/world/world.tscn @@ -255,10 +255,6 @@ texture = ExtResource("13_dp8ul") custom_minimum_size = Vector2(316, 64) layout_mode = 2 -[node name="ForceAchievementItem" parent="Stage/World/PageScroller/HBoxContainer/ForcePage" unique_id=1273881744 instance=ExtResource("64_0drd1")] -visible = false -layout_mode = 2 - [node name="PageHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/ForcePage" unique_id=1411786120 instance=ExtResource("12_58wjt")] layout_mode = 2 @@ -402,10 +398,6 @@ grow_horizontal = 2 grow_vertical = 2 texture = ExtResource("23_bcq5b") -[node name="ResourceAchievementItem" parent="Stage/World/PageScroller/HBoxContainer/ResourcePage" unique_id=746617076 instance=ExtResource("64_0drd1")] -visible = false -layout_mode = 2 - [node name="ResourceHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/ResourcePage" unique_id=2672876 instance=ExtResource("12_58wjt")] layout_mode = 2 @@ -534,10 +526,6 @@ grow_horizontal = 2 grow_vertical = 2 texture = ExtResource("28_upe80") -[node name="StarAchievementItem" parent="Stage/World/PageScroller/HBoxContainer/StarPage" unique_id=1287836220 instance=ExtResource("64_0drd1")] -visible = false -layout_mode = 2 - [node name="StarHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/StarPage" unique_id=2057421818 instance=ExtResource("12_58wjt")] layout_mode = 2 @@ -679,10 +667,6 @@ grow_horizontal = 2 grow_vertical = 2 texture = ExtResource("23_bcq5b") -[node name="StructureAchievementItem" parent="Stage/World/PageScroller/HBoxContainer/StructurePage" unique_id=1834701519 instance=ExtResource("64_0drd1")] -visible = false -layout_mode = 2 - [node name="StructureHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/StructurePage" unique_id=522613609 instance=ExtResource("12_58wjt")] layout_mode = 2 @@ -831,10 +815,6 @@ texture = ExtResource("40_50rdj") layout_mode = 2 texture = ExtResource("41_mi6gc") -[node name="LifeAchievementItem" parent="Stage/World/PageScroller/HBoxContainer/LifePage" unique_id=1647265705 instance=ExtResource("64_0drd1")] -visible = false -layout_mode = 2 - [node name="LifeHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/LifePage" unique_id=100084430 instance=ExtResource("12_58wjt")] layout_mode = 2 @@ -1076,11 +1056,10 @@ texture_normal = ExtResource("44_uvuuk") texture_pressed = ExtResource("45_an6vj") [node name="Header" type="CenterContainer" parent="Stage/Achievements" unique_id=51521239] -custom_minimum_size = Vector2(1080, 256) layout_mode = 2 [node name="Title" type="TextureRect" parent="Stage/Achievements/Header" unique_id=1195638572] -custom_minimum_size = Vector2(824, 256) +custom_minimum_size = Vector2(824, 128) layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 4 @@ -1177,6 +1156,8 @@ script = ExtResource("67_music") [connection signal="pressed" from="Stage/MainMenu/TopMenu/BackButton" to="Stage" method="_on_topmenu_button_pressed" binds= ["World"]] [connection signal="pressed" from="Stage/MainMenu/CreateOwniverse" to="Stage" method="create_new_universe"] [connection signal="pressed" from="Stage/MainMenu/Achievements" to="Stage" method="_on_topmenu_button_pressed" binds= ["Achievements"]] +[connection signal="pressed" from="Stage/MainMenu/Language/English" to="Stage/MainMenu" method="_on_change_locale_pressed" binds= ["en"]] +[connection signal="pressed" from="Stage/MainMenu/Language/Russian" to="Stage/MainMenu" method="_on_change_locale_pressed" binds= ["ru"]] [connection signal="pressed" from="Stage/MainMenu/Media/Sound" to="Stage/MainMenu" method="_on_sound_pressed"] [connection signal="pressed" from="Stage/MainMenu/Media/Music" to="Stage/MainMenu" method="_on_music_pressed"] [connection signal="value_changed" from="Stage/MainMenu/Volume/SoundVolume" to="Stage/MainMenu" method="_on_sound_volume_value_changed"]