Add localization support for achievements: implement language-specific titles and update UI components

This commit is contained in:
Kirill
2026-10-18 20:32:20 +03:00
parent e1782c7b10
commit 2aced0c61a
6 changed files with 42 additions and 31 deletions
+22
View File
@@ -22,6 +22,14 @@ func node(parent: Node, child: Node, label: String) -> Node:
return child return child
func run() -> void: func run() -> void:
check(load("res://stage/stage.gd") != null, "Stage integration compiles") 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() var stage := MockStage.new()
root.add_child(stage) root.add_child(stage)
var world = node(stage, Control.new(), "World") 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"]]: for names in [["ForcePage", "ForceHeader"], ["ResourcePage", "ResourceHeader"], ["StarPage", "StarHeader"], ["StructurePage", "StructureHeader"], ["LifePage", "LifeHeader"]]:
node(node(pages, VBoxContainer.new(), names[0]), HBoxContainer.new(), names[1]) node(node(pages, VBoxContainer.new(), names[0]), HBoxContainer.new(), names[1])
var screen = node(stage, Control.new(), "Achievements") 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") node(node(screen, ScrollContainer.new(), "AchievementList"), VBoxContainer.new(), "AchievementItems")
var controller = Controller.new() var controller = Controller.new()
controller.progress_path = "/tmp/owniverse-achievements-test-%s.cfg" % OS.get_process_id() controller.progress_path = "/tmp/owniverse-achievements-test-%s.cfg" % OS.get_process_id()
@@ -99,6 +108,19 @@ func run() -> void:
global.Locale = "ru" global.Locale = "ru"
controller.update(0.0) controller.update(0.0)
check(controller.status.text.begins_with("Открыто"), "Status localizes") 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 global.Locale = previous_locale
var path: String = controller.progress_path var path: String = controller.progress_path
stage.free() stage.free()
@@ -2,6 +2,10 @@ extends Node
## Player-wide achievement progress and the shared in-game notification queue. ## Player-wide achievement progress and the shared in-game notification queue.
const E = preload("res://world/owniverse/math/exact.gd") const E = preload("res://world/owniverse/math/exact.gd")
const ITEM = preload("res://ui/achievements/achievement_item.tscn") 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" var progress_path: String = "user://achievements.cfg"
const HOLD_SECONDS = 3.0 const HOLD_SECONDS = 3.0
const FADE_SECONDS = 0.3 const FADE_SECONDS = 0.3
@@ -158,6 +162,8 @@ func _display_event(event: Dictionary) -> void:
panel.show() panel.show()
func _rebuild_list() -> void: 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 unlocked := 0
var position := 1 var position := 1
for id in definitions: for id in definitions:
+7 -5
View File
@@ -11,7 +11,7 @@
[ext_resource type="Texture2D" uid="uid://bmp7e6lmtaex0" path="res://ui/achievements/icons/10g.png" id="9_3xyrb"] [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] [node name="AchievementItem" type="Control" unique_id=1273881744]
custom_minimum_size = Vector2(0, 128) custom_minimum_size = Vector2(1080, 128)
layout_mode = 3 layout_mode = 3
anchors_preset = 0 anchors_preset = 0
size_flags_horizontal = 3 size_flags_horizontal = 3
@@ -19,9 +19,9 @@ script = ExtResource("1_w8f20")
[node name="Row" type="HBoxContainer" parent="." unique_id=2025386077] [node name="Row" type="HBoxContainer" parent="." unique_id=2025386077]
layout_mode = 0 layout_mode = 0
anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
theme_override_constants/separation = 16
[node name="Icon1c" type="TextureRect" parent="Row" unique_id=2146478339] [node name="Icon1c" type="TextureRect" parent="Row" unique_id=2146478339]
visible = false visible = false
@@ -74,8 +74,10 @@ texture = ExtResource("9_3xyrb")
[node name="Label" type="RichTextLabel" parent="Row" unique_id=230945261] [node name="Label" type="RichTextLabel" parent="Row" unique_id=230945261]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 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/normal_font_size = 30
theme_override_font_sizes/bold_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
Binary file not shown.
Binary file not shown.
+3 -22
View File
@@ -255,10 +255,6 @@ texture = ExtResource("13_dp8ul")
custom_minimum_size = Vector2(316, 64) custom_minimum_size = Vector2(316, 64)
layout_mode = 2 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")] [node name="PageHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/ForcePage" unique_id=1411786120 instance=ExtResource("12_58wjt")]
layout_mode = 2 layout_mode = 2
@@ -402,10 +398,6 @@ grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
texture = ExtResource("23_bcq5b") 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")] [node name="ResourceHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/ResourcePage" unique_id=2672876 instance=ExtResource("12_58wjt")]
layout_mode = 2 layout_mode = 2
@@ -534,10 +526,6 @@ grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
texture = ExtResource("28_upe80") 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")] [node name="StarHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/StarPage" unique_id=2057421818 instance=ExtResource("12_58wjt")]
layout_mode = 2 layout_mode = 2
@@ -679,10 +667,6 @@ grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
texture = ExtResource("23_bcq5b") 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")] [node name="StructureHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/StructurePage" unique_id=522613609 instance=ExtResource("12_58wjt")]
layout_mode = 2 layout_mode = 2
@@ -831,10 +815,6 @@ texture = ExtResource("40_50rdj")
layout_mode = 2 layout_mode = 2
texture = ExtResource("41_mi6gc") 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")] [node name="LifeHeaderBorder" parent="Stage/World/PageScroller/HBoxContainer/LifePage" unique_id=100084430 instance=ExtResource("12_58wjt")]
layout_mode = 2 layout_mode = 2
@@ -1076,11 +1056,10 @@ texture_normal = ExtResource("44_uvuuk")
texture_pressed = ExtResource("45_an6vj") texture_pressed = ExtResource("45_an6vj")
[node name="Header" type="CenterContainer" parent="Stage/Achievements" unique_id=51521239] [node name="Header" type="CenterContainer" parent="Stage/Achievements" unique_id=51521239]
custom_minimum_size = Vector2(1080, 256)
layout_mode = 2 layout_mode = 2
[node name="Title" type="TextureRect" parent="Stage/Achievements/Header" unique_id=1195638572] [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 layout_mode = 2
size_flags_horizontal = 4 size_flags_horizontal = 4
size_flags_vertical = 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/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/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/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/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="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"] [connection signal="value_changed" from="Stage/MainMenu/Volume/SoundVolume" to="Stage/MainMenu" method="_on_sound_volume_value_changed"]