aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/menu/main.gd2
-rw-r--r--client/menu/play.gd28
-rw-r--r--client/menu/rating/rating.tscn2
-rw-r--r--client/project.godot2
-rw-r--r--client/server_list.gd106
-rw-r--r--client/server_list.tscn8
-rw-r--r--client/settings.gd7
-rw-r--r--locale/ar.ini2
-rw-r--r--locale/de.ini2
-rw-r--r--locale/en.ini106
-rw-r--r--locale/es.ini2
-rw-r--r--locale/eu.ini2
-rw-r--r--locale/fi.ini2
-rw-r--r--locale/fr.ini2
-rw-r--r--locale/he.ini2
-rw-r--r--locale/ja.ini2
-rw-r--r--locale/nl.ini2
-rw-r--r--locale/pl.ini2
-rw-r--r--locale/pt.ini2
-rw-r--r--locale/tr.ini2
-rw-r--r--locale/zh_Hans.ini2
-rw-r--r--locale/zh_Hant.ini4
22 files changed, 187 insertions, 104 deletions
diff --git a/client/menu/main.gd b/client/menu/main.gd
index 997653c9..5aa3fbaa 100644
--- a/client/menu/main.gd
+++ b/client/menu/main.gd
@@ -24,7 +24,7 @@ func _ready():
if OS.has_feature("web"):
quit_button.hide()
Sound.play_music("MainMenu")
- ServerList.fetch_server_list()
+ ServerList.one_shot()
func _menu_cover(state):
$side.visible = not state
diff --git a/client/menu/play.gd b/client/menu/play.gd
index b117d6a4..44cd3eb0 100644
--- a/client/menu/play.gd
+++ b/client/menu/play.gd
@@ -37,21 +37,23 @@ func _ready():
ServerList.update_loading.connect(update_server_list_loading)
update_server_list(ServerList.current_list)
update_server_list_loading(ServerList.loading)
-
+
+ ServerList.start()
super()
-func update_server_list(json: Array):
+func update_server_list(lists: Array[Array]):
for c in server_list.get_children():
c.queue_free()
- for i in json:
- var b := Button.new()
- b.text_overrun_behavior = TextServer.OVERRUN_TRIM_WORD_ELLIPSIS
- b.text = "%s (%d players)" % [i.name, i.players_online]
- # TODO: Implement fallback address correctly
- if i.version[0] != Multiplayer.VERSION_MAJOR or i.version[1] > Multiplayer.VERSION_MINOR:
- b.disabled = true
- b.pressed.connect(connect_to.bind(i.address[0]))
- server_list.add_child(b)
+ for l in lists:
+ for i in l:
+ var b := Button.new()
+ b.text_overrun_behavior = TextServer.OVERRUN_TRIM_WORD_ELLIPSIS
+ b.text = "%s (%d players)" % [i.name, i.players_online]
+ # TODO: Implement fallback address correctly
+ if i.version[0] != Multiplayer.VERSION_MAJOR or i.version[1] > Multiplayer.VERSION_MINOR:
+ b.disabled = true
+ b.pressed.connect(connect_to.bind(i.address[0]))
+ server_list.add_child(b)
func update_server_list_loading(status: bool):
server_list_loading.visible = status
@@ -127,3 +129,7 @@ func _on_uri_text_changed(new_text):
func _on_back_pressed():
exit()
+
+func _menu_exit():
+ ServerList.stop()
+ super()
diff --git a/client/menu/rating/rating.tscn b/client/menu/rating/rating.tscn
index b12d1470..69edba88 100644
--- a/client/menu/rating/rating.tscn
+++ b/client/menu/rating/rating.tscn
@@ -120,7 +120,7 @@ alignment = 1
[node name="Close" type="Button" parent="MarginContainer/PanelContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
-text = "Accept"
+text = "c.menu.rating.accept"
[node name="StarTimer" type="Timer" parent="."]
wait_time = 0.5
diff --git a/client/project.godot b/client/project.godot
index d1e85f05..d931a1b0 100644
--- a/client/project.godot
+++ b/client/project.godot
@@ -24,7 +24,7 @@ Server="*res://server.gd"
Sound="*res://audio/sound.tscn"
DisableWrongJoypads="*res://disable_wrong_joypads.gd"
InputManager="*res://menu/settings/input/input_manager.gd"
-ServerList="*res://server_list.tscn"
+ServerList="*res://server_list.gd"
[display]
diff --git a/client/server_list.gd b/client/server_list.gd
index f509a34e..43cfc15c 100644
--- a/client/server_list.gd
+++ b/client/server_list.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 tpart
+# Copyright 2024 nokoe
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -18,24 +19,78 @@ extends Node
signal update_loading(status: bool)
signal update_server_list(list: Array)
-var current_list := []
+enum Registry {
+ MDNS = 0,
+ GLOBAL = 1,
+}
+
+const MDNS_URL: String = "http://127.0.0.1:27033/v1/list"
+const HEADERS: Array[String] = [
+ "Accept: application/json",
+ "User-Agent: Hurry Curry! %s" % Global.VERSION
+ ]
+
+var current_list: Array[Array] = [[], []]
var loading := false
+var mdns := HTTPRequest.new()
+var reg := HTTPRequest.new()
-@onready var req: HTTPRequest = $HTTPRequest
+var thread: Thread
+var pid: int
+
+var mdns_timer := Timer.new()
+var reg_timer := Timer.new()
+# after 30 minutes we stop fetching results to reduce server load
+var timeout := Timer.new()
+
+func _ready() -> void:
+ add_child(mdns)
+ add_child(reg)
+ mdns_timer.wait_time = 5.
+ mdns_timer.one_shot = false
+ mdns_timer.timeout.connect(fetch_server_list.bind(Registry.MDNS))
+ add_child(mdns_timer)
+ reg_timer.wait_time = 60.
+ reg_timer.one_shot = false
+ reg_timer.timeout.connect(fetch_server_list.bind(Registry.GLOBAL))
+ add_child(reg_timer)
+ timeout.wait_time = 60. * 30.
+ timeout.timeout.connect(func():
+ stop()
+ )
+ add_child(timeout)
+ mdns.request_completed.connect(_on_request_completed.bind(Registry.MDNS))
+ reg.request_completed.connect(_on_request_completed.bind(Registry.GLOBAL))
+ if Global.get_setting("online.use_discovery"):
+ thread = Thread.new()
+ thread.start(func():
+ # SAFETY: reading/writing arrays/dictionaries is allowed as long as
+ # the size is not changed.
+ # cf.: https://docs.godotengine.org/en/4.3/tutorials/performance/thread_safe_apis.html#gdscript-arrays-dictionaries
+ var res = OS.create_process(get_discovery_path(), [], true)
+ # SAFETY: since this is not read until the thread stops, this should
+ # probably be safe without synchronisation :)
+ pid = res
+ )
+
+static func get_discovery_path() -> String:
+ var path: String = Global.get_setting("online.discovery_binary")
+ if path != "":
+ return path
+ else:
+ return "hurrycurry-discovery"
+
+func fetch_server_list(registry: Registry) -> void:
+ match registry:
+ Registry.MDNS:
+ mdns.request(MDNS_URL, HEADERS)
+ Registry.GLOBAL:
+ reg.request(Global.get_setting("online.registry_url") + "/v1/list", HEADERS)
-func fetch_server_list():
- if loading:
- push_warning("Server list is already loading")
- return
loading = true
update_loading.emit(true)
- req.request_completed.connect(_on_request_completed)
- req.request("https://hurrycurry-registry.metamuffin.org/v1/list", [
- "Accept: application/json",
- "User-Agent: Hurry Curry! %s" % Global.VERSION
- ])
-func _on_request_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray):
+func _on_request_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray, registry: Registry):
loading = false
update_loading.emit(false)
if result != 0:
@@ -45,5 +100,28 @@ func _on_request_completed(result: int, _response_code: int, _headers: PackedStr
if json == null:
push_error("Server list response invalid")
return
- current_list = json
- update_server_list.emit(json)
+ current_list[registry] = json
+ update_server_list.emit(current_list)
+
+func start() -> void:
+ timeout.stop()
+ timeout.start()
+ if Global.get_setting("online.use_discovery"):
+ mdns_timer.start()
+ fetch_server_list(Registry.MDNS)
+ if Global.get_setting("online.use_registry"):
+ reg_timer.start()
+ fetch_server_list(Registry.GLOBAL)
+
+func stop() -> void:
+ timeout.stop()
+ mdns_timer.stop()
+ reg_timer.stop()
+
+func one_shot() -> void:
+ start()
+ stop()
+
+func _exit_tree():
+ if thread != null: thread.wait_to_finish()
+ if pid != null: OS.kill(pid)
diff --git a/client/server_list.tscn b/client/server_list.tscn
deleted file mode 100644
index f43da77f..00000000
--- a/client/server_list.tscn
+++ /dev/null
@@ -1,8 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://3p61jpqt7acp"]
-
-[ext_resource type="Script" path="res://server_list.gd" id="1_a8xqo"]
-
-[node name="ServerList" type="Node"]
-script = ExtResource("1_a8xqo")
-
-[node name="HTTPRequest" type="HTTPRequest" parent="."]
diff --git a/client/settings.gd b/client/settings.gd
index 667ffa41..eddc5207 100644
--- a/client/settings.gd
+++ b/client/settings.gd
@@ -70,6 +70,13 @@ static func get_root():
ToggleSetting.new("upnp", false),
ToggleSetting.new("mdns", false),
ToggleSetting.new("register", false),
+ ]),
+ SettingsCategory.new("online", [
+ # TODO: make this opt-in
+ ToggleSetting.new("use_registry", true),
+ TextSetting.new("registry_url", "https://hurrycurry-registry.metamuffin.org/"),
+ ToggleSetting.new("use_discovery", true),
+ TextSetting.new("discovery_binary", ""),
])
])
diff --git a/locale/ar.ini b/locale/ar.ini
index 519c4fa3..101cc36b 100644
--- a/locale/ar.ini
+++ b/locale/ar.ini
@@ -155,7 +155,7 @@ c.credits.models=النماذج
c.credits.sounds=الاصوات
c.settings.gameplay.setup_completed=تم الانتهاء من الإعداد الأولي. (إزيلوا علامة الإختيار وأعدوا التشغيل لإعادة الدخول)
unknown622=يجب عليكم ملء جميع الحقول.
-unknown626=حسنا
+c.menu.rating.accept=حسنا
c.settings.gameplay.hints_started=بدأ البرنامج التعليمي
unknown732=
unknown736=
diff --git a/locale/de.ini b/locale/de.ini
index 8011953a..00f1db2c 100644
--- a/locale/de.ini
+++ b/locale/de.ini
@@ -156,7 +156,7 @@ unknown538=Menü-Knopf
unknown551=Nicht verfügbar
c.setup.uniform.value=Frisur {0}
unknown622=Sie müssen alle verlangten Felder ausfüllen.
-unknown626=Akzeptieren
+c.menu.rating.accept=Akzeptieren
unknown732=Zurück
unknown736=Nächstes
unknown740=Beitreten / Zuschauen
diff --git a/locale/en.ini b/locale/en.ini
index ea798258..b2e8c6d0 100644
--- a/locale/en.ini
+++ b/locale/en.ini
@@ -3,18 +3,18 @@ c.chat.write_message=Write messsage
c.credits.developed_by=developed by
c.credits.models=Models
c.credits.sounds=Sounds
-c.credits.translations=Translations
c.credits.thanks=Thank You For Playing
c.credits.title=Hurry Curry! - a game about cooking
+c.credits.translations=Translations
c.error.cannot_cancel_no_game=Cannot cancel game since no game is running.
+c.error.empty_username=Username cannot be empty.
c.error.must_join_to_cancel=You must join in order to be able to cancel the current game.
c.error.placeholder=This should be the error message.
+c.error.server=Error from server: {0}
c.error.version_mismatch=Server and client versions do not match. Server: {0}.{1}, Client: {2}.{3}.%nAre you sure the game is up to date?
c.error.websocket.unavailable=unavailable
c.error.websocket=WebSocket closed with code: {0}, reason {1}. Clean: {2}
c.error=Error
-c.error.server=Error from server: {0}
-c.error.empty_username=Username cannot be empty.
c.hint.boost=Press {0} to boost
c.hint.framerate_low=Your framerate seems to be low. You can lower your graphics settings in the settings menu.
c.hint.interact=Press {0} to pick up items and to interact with tools
@@ -51,30 +51,31 @@ c.menu.play.quick_connect=Quick Connect
c.menu.play.server=Server
c.menu.play=Play
c.menu.quit=Quit
+c.menu.rating.accept=Accept
c.menu.settings=Settings
-c.score.poor=Poor service
c.score.acceptable=Acceptable service
-c.score.good=Good service
-c.score.excellent=Excellent service
c.score.completed=Completed
+c.score.excellent=Excellent service
c.score.failed=Failed
+c.score.good=Good service
c.score.points_par=You collected {0} points
c.score.points=Points
+c.score.poor=Poor service
c.score.time_remaining=Time remaining
c.settings.apply=Save & Apply
c.settings.audio.master_volume=Master Volume
c.settings.audio.music_volume=Music Volume
c.settings.audio.sfx_volume=SFX Volume
c.settings.audio=Audio
+c.settings.gameplay.accessible_movement=Accessible movement controls
+c.settings.gameplay.first_person=Enable first-person mode (reduces playability)
+c.settings.gameplay.hints_started=Hints started
c.settings.gameplay.interpolate_camera_rotation=Smooth camera rotation
c.settings.gameplay.invert_camera=Invert camera movement
c.settings.gameplay.latch_boost=Always extend boost to maximum duration
c.settings.gameplay.setup_completed=Initial setup complete. (Uncheck and restart to reenter)
c.settings.gameplay.tutorial_disabled=Disable tutorial
-c.settings.gameplay.hints_started=Hints started
c.settings.gameplay.usernames=Show username tags
-c.settings.gameplay.accessible_movement=Accessible movement controls
-c.settings.gameplay.first_person=Enable first-person mode (reduces playability)
c.settings.gameplay=Gameplay
c.settings.graphics.aa.disabled=Disabled
c.settings.graphics.aa.fx=FXAA
@@ -137,6 +138,11 @@ c.settings.input.zoom_in=Zoom in
c.settings.input.zoom_out_discrete=Zoom out (discrete)
c.settings.input.zoom_out=Zoom out
c.settings.input=Controls
+c.settings.online.discovery_binary=mDNS discovery binary path
+c.settings.online.registry_url=Registry URL
+c.settings.online.use_discovery=Use mDNS discovery
+c.settings.online.use_registry=Use global server registry
+c.settings.online=Online
c.settings.server.binary_path=Server binary path
c.settings.server.data_path=Server data directory path
c.settings.server.mdns=Local server discoverability
@@ -156,78 +162,72 @@ c.settings.ui.touch_controls.enabled=Enabled
c.settings.ui.touch_controls=Enable touch screen controls
c.settings.ui=User interface
c.settings.username=Username
-c.setup.contract_title=EMPLOYMENT CONTRACT
-c.setup.contract_desc=This is a binding contract between you (the employee) and Musterfoods Ltd. (the employer) for working as a chef or waiter.
-c.setup.name=1. [b]Name of the Employee[/b] Please fill out your name. Other chefs can see your name on your name tag.
-c.setup.position=2. [b]Employment Position[/b]
-c.setup.position.value=Chef / Waiting Staff
-c.setup.uniform=3. [b]Working Uniform.[/b] You must always have one of the following hairstyles.
-c.setup.experience=4. [b]Experience.[/b] Do you have any prior job experience, or would you like us to show you around the kitchen?
-c.setup.experience.skip=Skip tutorial
-c.setup.duties=5. [b]Duties.[/b] It is your duty to serve customers the meal or item that they request.%n
c.setup.additional_terms=6. [b]Additional Terms.[/b] You shall not duplicate plates. (That is [u]NOT[/u] possible!)%n
-c.setup.compensation=7. [b]Compensation.[/b] You will be compensated monthly for your work.
c.setup.compensation.salary.prefix=The salary is
-c.setup.compensation.salary=$ 0.00
c.setup.compensation.salary.suffix=per month
-c.setup.frank_signature=F. Miller
+c.setup.compensation.salary=$ 0.00
+c.setup.compensation=7. [b]Compensation.[/b] You will be compensated monthly for your work.
+c.setup.contract_desc=This is a binding contract between you (the employee) and Musterfoods Ltd. (the employer) for working as a chef or waiter.
+c.setup.contract_title=EMPLOYMENT CONTRACT
+c.setup.duties=5. [b]Duties.[/b] It is your duty to serve customers the meal or item that they request.%n
+c.setup.experience.skip=Skip tutorial
+c.setup.experience=4. [b]Experience.[/b] Do you have any prior job experience, or would you like us to show you around the kitchen?
c.setup.frank_signature.desc=Signature of the Employer:%nMusterfoods Ltd.%nFrank Miller, Head of HR
-c.setup.user_signature=Click to sign
+c.setup.frank_signature=F. Miller
+c.setup.name=1. [b]Name of the Employee[/b] Please fill out your name. Other chefs can see your name on your name tag.
+c.setup.position.value=Chef / Waiting Staff
+c.setup.position=2. [b]Employment Position[/b]
+c.setup.uniform.value=Hairstyle {0}
+c.setup.uniform=3. [b]Working Uniform.[/b] You must always have one of the following hairstyles.
c.setup.user_signature.desc=Signature of the Employee:%n%n%n
+c.setup.user_signature=Click to sign
+s.bot.frank=Frank Miller
s.bot.simple=Simple chef
s.bot.waiter=Waiter
-s.bot.frank=Frank Miller
-s.tutorial.prevent_burning=Take this before it burns
-s.tutorial.take_now=Take this item quickly!
-s.tutorial.active=Interact here for {0}s
+s.campaign.condition.stars=Reach at least {0} stars in {1}
+s.campaign.list_helper=- {0}%n - {1}
+s.campaign.unlock_condition=To unlock: %n%n{0}
+s.error.already_interacting=already interacting
+s.error.conn_too_many_players=Players-per-connection limit exceeded.
+s.error.customer_interact=You shall not interact with customers.
+s.error.interacting_too_far=interacting too far from player
+s.error.map_load=Map failed to load: {0}
+s.error.no_player=Player does not exist.
+s.error.no_tile=Tile does not exist.
+s.error.packet_not_supported=Packet not supported in this session.
+s.error.packet_sender_invalid=Packet sent to a player that is not owned by this connection.
+s.error.self_interact=Interacting with yourself. This is impossible.
+s.replay.cannot_join=Replays cannot be joined.
+s.state.abort_no_players=Game was aborted due to a lack of players.
+s.state.game_aborted=Game was aborted by {0}.
+s.state.overflow_resubscribe=Lagging behind. Some clientbound packets were dropped.
+s.tutorial.accept_order=Approach the customer take their order
s.tutorial.active_cuttingboard=Cut the item to slices here
+s.tutorial.active=Interact here for {0}s
s.tutorial.clear_tile=Clear this tile
s.tutorial.error=Tutorial code handle this recipe yet.
s.tutorial.finished=Tutorial finished!
s.tutorial.hold_interact=Hold interact
s.tutorial.interact_empty=Interact with an empty counter
-s.tutorial.interact=Interact here
s.tutorial.interact_plate=Add the item to this plate
+s.tutorial.interact=Interact here
s.tutorial.pickup=Take this item.
+s.tutorial.prevent_burning=Take this before it burns
s.tutorial.put_away=Put away this item for later
s.tutorial.put_on=Place on {0}
-s.tutorial.take=Take {0} from here
s.tutorial.serve=Serve the meal here
+s.tutorial.take_now=Take this item quickly!
+s.tutorial.take=Take {0} from here
s.tutorial.wait_finish=...
-s.tutorial.accept_order=Approach the customer take their order
-s.replay.cannot_join=Replays cannot be joined.
-s.campaign.unlock_condition=To unlock: %n%n{0}
-s.campaign.list_helper=- {0}%n - {1}
-s.campaign.condition.stars=Reach at least {0} stars in {1}
-s.state.abort_no_players=Game was aborted due to a lack of players.
-s.state.game_aborted=Game was aborted by {0}.
-s.state.overflow_resubscribe=Lagging behind. Some clientbound packets were dropped.
-s.error.conn_too_many_players=Players-per-connection limit exceeded.
-s.error.packet_sender_invalid=Packet sent to a player that is not owned by this connection.
-s.error.no_player=Player does not exist.
-s.error.no_tile=Tile does not exist.
-s.error.already_interacting=already interacting
-s.error.interacting_too_far=interacting too far from player
-s.error.self_interact=Interacting with yourself. This is impossible.
-s.error.customer_interact=You shall not interact with customers.
-s.error.packet_not_supported=Packet not supported in this session.
-s.error.map_load=Map failed to load: {0}
unknown33=Automatic
unknown336=Return to Main Menu
-unknown37=Enabled
-unknown41=Disabled
-unknown460=+
-unknown464=-
unknown476=SHIFT
unknown484=left stick
unknown488=SPACE
unknown514=arrow keys
unknown518=right stick
unknown551=unavailable
-c.setup.uniform.value=Hairstyle {0}
unknown622=You must fill out all requested fields.
-unknown626=Accept
unknown732=Previous
unknown736=Next
-unknown740=Join / Spectate
unknown752=Scroll down
diff --git a/locale/es.ini b/locale/es.ini
index ecff4105..63e00217 100644
--- a/locale/es.ini
+++ b/locale/es.ini
@@ -156,7 +156,7 @@ unknown538=Botón de menú
unknown551=Servidor (No disponible)
c.setup.uniform.value=Peinado {0}
unknown622=Debes completar todos los requisitos.
-unknown626=Aceptar
+c.menu.rating.accept=Aceptar
unknown732=
unknown736=
unknown740=Observar
diff --git a/locale/eu.ini b/locale/eu.ini
index 5364555a..4e032f16 100644
--- a/locale/eu.ini
+++ b/locale/eu.ini
@@ -155,7 +155,7 @@ c.credits.models=Modeloak
c.credits.sounds=Soinuak
c.settings.gameplay.setup_completed=Hasierako konfigurazioa osatuta. (Marka kendu eta berrabiarazi berriz sartzeko)
unknown622=Eskatutako eremu guztiak bete behar dituzu.
-unknown626=Onartu
+c.menu.rating.accept=Onartu
c.settings.gameplay.hints_started=Tutoriala hasi da
unknown732=Aurrekoa
unknown736=Hurrengoa
diff --git a/locale/fi.ini b/locale/fi.ini
index f1eb1966..46106fa4 100644
--- a/locale/fi.ini
+++ b/locale/fi.ini
@@ -155,7 +155,7 @@ c.credits.models=
c.credits.sounds=
c.settings.gameplay.setup_completed=
unknown622=
-unknown626=
+c.menu.rating.accept=
c.settings.gameplay.hints_started=
unknown732=
unknown736=
diff --git a/locale/fr.ini b/locale/fr.ini
index cc31c0fa..60d33420 100644
--- a/locale/fr.ini
+++ b/locale/fr.ini
@@ -155,7 +155,7 @@ c.credits.models=Modèles
c.credits.sounds=Sons
c.settings.gameplay.setup_completed=Configuration initiale terminée. (Décochez et recommencer pour entrer à nouveau)
unknown622=Vous devez remplir tous les champs requis.
-unknown626=Accepter
+c.menu.rating.accept=Accepter
c.settings.gameplay.hints_started=Tutoriel commencé
unknown732=
unknown736=
diff --git a/locale/he.ini b/locale/he.ini
index 02fe7003..65ac6192 100644
--- a/locale/he.ini
+++ b/locale/he.ini
@@ -155,7 +155,7 @@ c.credits.models=מודלים
c.credits.sounds=
c.settings.gameplay.setup_completed=אתחול ראשוני נגמר. (הורד סימון והדלק מחדש על מנת להכנס מחדש)
unknown622=אנא מלאו את כל השדות הנדרשים.
-unknown626=אשר
+c.menu.rating.accept=אשר
c.settings.gameplay.hints_started=הדרכה התחילה
unknown732=
unknown736=
diff --git a/locale/ja.ini b/locale/ja.ini
index 47124221..1513517a 100644
--- a/locale/ja.ini
+++ b/locale/ja.ini
@@ -155,7 +155,7 @@ c.credits.models=モデル
c.credits.sounds=サウンド
c.settings.gameplay.setup_completed=初期設定完了。(チェックを外して再起動して)
unknown622=要求されたフィールドをすべて入力する必要があります。
-unknown626=アクセプト
+c.menu.rating.accept=アクセプト
c.settings.gameplay.hints_started=チュートリアルを開始
unknown732=
unknown736=
diff --git a/locale/nl.ini b/locale/nl.ini
index fb7d93ac..d6cab726 100644
--- a/locale/nl.ini
+++ b/locale/nl.ini
@@ -160,7 +160,7 @@ unknown538 = Menuknop
unknown551 = niet beschikbaar
unknown568 = Haarstijl: {0}
unknown622 = Vul alle vereiste velden in.
-unknown626 = Accepteren
+c.menu.rating.accept = Accepteren
unknown732 = Vorige
unknown736 = Volgende
unknown740 = Deelnemen/Toeschouwen
diff --git a/locale/pl.ini b/locale/pl.ini
index 4e106afc..7b65bb06 100644
--- a/locale/pl.ini
+++ b/locale/pl.ini
@@ -155,7 +155,7 @@ c.credits.models=Modele
c.credits.sounds=Oprawa dźwiękowa
c.settings.gameplay.setup_completed=Konfiguracja wstępna ukończona. (Odznacz i zrestartuj aby wykonać ponownie)
unknown622=Musisz wypełnić wymagane pola.
-unknown626=Zatwierdź
+c.menu.rating.accept=Zatwierdź
c.settings.gameplay.hints_started=Tutorial rozpoczęty
unknown732=
unknown736=
diff --git a/locale/pt.ini b/locale/pt.ini
index f1eb1966..46106fa4 100644
--- a/locale/pt.ini
+++ b/locale/pt.ini
@@ -155,7 +155,7 @@ c.credits.models=
c.credits.sounds=
c.settings.gameplay.setup_completed=
unknown622=
-unknown626=
+c.menu.rating.accept=
c.settings.gameplay.hints_started=
unknown732=
unknown736=
diff --git a/locale/tr.ini b/locale/tr.ini
index f1eb1966..46106fa4 100644
--- a/locale/tr.ini
+++ b/locale/tr.ini
@@ -155,7 +155,7 @@ c.credits.models=
c.credits.sounds=
c.settings.gameplay.setup_completed=
unknown622=
-unknown626=
+c.menu.rating.accept=
c.settings.gameplay.hints_started=
unknown732=
unknown736=
diff --git a/locale/zh_Hans.ini b/locale/zh_Hans.ini
index 2374fe56..dab96be7 100644
--- a/locale/zh_Hans.ini
+++ b/locale/zh_Hans.ini
@@ -156,7 +156,7 @@ unknown538=菜单按钮
unknown551=不可用
c.setup.uniform.value=发型 {0}
unknown622=您必须填写所有要求的字段。
-unknown626=接受
+c.menu.rating.accept=接受
unknown732=上一个
unknown736=下一个
unknown740=加入/旁观
diff --git a/locale/zh_Hant.ini b/locale/zh_Hant.ini
index c4f36618..2d88f417 100644
--- a/locale/zh_Hant.ini
+++ b/locale/zh_Hant.ini
@@ -155,10 +155,10 @@ c.credits.models=模型
c.credits.sounds=聲音
c.settings.gameplay.setup_completed=初始設定完成。(取消勾選並重新啟動以重新進入)
unknown622=你必須填寫所有要求的欄位。
-unknown626=接受
-c.settings.gameplay.hints_started=提示已開始
unknown732=上一個
unknown736=下一個
+c.menu.rating.accept=接受
+c.settings.gameplay.hints_started=教程已啟動
unknown740=旁觀
unknown752=向下滾動
c.menu.ingame.leave = 離開遊戲