From 0456f25aad78e59f276b8fcf93293f9568c6998d Mon Sep 17 00:00:00 2001 From: cutekibry Date: Tue, 17 Sep 2024 10:35:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20=E6=96=B0=E5=A2=9E=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 参照 lang/translations.csv 文件。 --- lang/translations.csv | 42 +++++++++++++++ lang/translations.csv.import | 17 ++++++ lang/translations.en.translation | Bin 0 -> 1678 bytes lang/translations.ja.translation | Bin 0 -> 1645 bytes lang/translations.zh.translation | Bin 0 -> 1705 bytes levels/base_level/base_level.gd | 4 +- levels/chapter_menu/level_menu/level_menu.gd | 6 +-- project.godot | 4 ++ scripts/level_data.gd | 54 ------------------- 9 files changed, 68 insertions(+), 59 deletions(-) create mode 100644 lang/translations.csv create mode 100644 lang/translations.csv.import create mode 100644 lang/translations.en.translation create mode 100644 lang/translations.ja.translation create mode 100644 lang/translations.zh.translation diff --git a/lang/translations.csv b/lang/translations.csv new file mode 100644 index 0000000..2e2f57c --- /dev/null +++ b/lang/translations.csv @@ -0,0 +1,42 @@ +keys,en,zh,ja +CHAPTER_PATTERN,"Ch. %d %s","第 %d 章 %s","" +CHAPTER_NAME_0,"=P","=P","=P" +CHAPTER_NAME_1,"Add and Multiply","加法和乘法","" +CHAPTER_NAME_2,"()","()","" +CHAPTER_NAME_3,"Equal?","相等?","" +CHAPTER_NAME_4,"<>","<>","" +CHAPTER_NAME_5,"Extra Challenges","额外挑战","" + +LEVEL_NAME_0_0,"P=P","P=P","P=P" +LEVEL_NAME_0_1,"=P","=P","=P" +LEVEL_NAME_0_2,"Another Smile","Another Smile","Another Smile" +LEVEL_NAME_0_3,"Reverse","Reverse","Reverse" +LEVEL_NAME_0_4,"Reverse Again","Reverse Again","Reverse Again" +LEVEL_NAME_0_5,"Snake","Snake","Snake" + +LEVEL_NAME_1_0,"0+0=0, 0+1=1","0+0=0, 0+1=1","0+0=0, 0+1=1" +LEVEL_NAME_1_1,"1+1=1","1+1=1","1+1=1" +LEVEL_NAME_1_2,"Swap","交换","Swap" +LEVEL_NAME_1_3,"Always True","Always True","Always True" +LEVEL_NAME_1_4,"Paper Tiger","纸老虎","Paper Tiger" +LEVEL_NAME_1_5,"Make Me Laugh","Make Me Laugh","Make Me Laugh" +LEVEL_NAME_1_6,"Reset","重置","Reset" +LEVEL_NAME_1_7,"Not Necessary","并非必要","Not Necessary" +LEVEL_NAME_1_8,"True Reset","真正的重置","True Reset" +LEVEL_NAME_1_9,"Gold Experience","黄金体验","Gold Experience" + +LEVEL_NAME_2_0,"He Goes First","He Goes First","He Goes First" +LEVEL_NAME_2_1,"Still, He Goes First","Still, He Goes First","Still, He Goes First" +LEVEL_NAME_2_2,"It's My Turn","It's My Turn","It's My Turn" + +LEVEL_NAME_3_0,"Missing Equation","缺失的等式","Missing Equation" +LEVEL_NAME_3_1,"Why?","Why?","Why?" +LEVEL_NAME_3_2,"Where is the Equation?","Where is the Equation?","Where is the Equation?" +LEVEL_NAME_3_3,"Untitled","Untitled","Untitled" + +LEVEL_NAME_4_0,"<","<","<" +LEVEL_NAME_4_1,"<=","<=","<=" +LEVEL_NAME_4_2,"<>","<>","<>" + +LEVEL_NAME_5_0,"[EX] Erase Which?","[EX] Erase Which?","[EX]Erase Which?" +LEVEL_NAME_5_1,"[EX] Really Challenging","[EX] Really Challenging","[EX] Really Challenging" \ No newline at end of file diff --git a/lang/translations.csv.import b/lang/translations.csv.import new file mode 100644 index 0000000..5dbcc73 --- /dev/null +++ b/lang/translations.csv.import @@ -0,0 +1,17 @@ +[remap] + +importer="csv_translation" +type="Translation" +uid="uid://g1rl4ude18st" + +[deps] + +files=["res://lang/translations.en.translation", "res://lang/translations.zh.translation", "res://lang/translations.ja.translation"] + +source_file="res://lang/translations.csv" +dest_files=["res://lang/translations.en.translation", "res://lang/translations.zh.translation", "res://lang/translations.ja.translation"] + +[params] + +compress=true +delimiter=0 diff --git a/lang/translations.en.translation b/lang/translations.en.translation new file mode 100644 index 0000000000000000000000000000000000000000..955bc82ee2a72609e6c5c241e58a41e14e4bbb64 GIT binary patch literal 1678 zcma)-Nla5w6owCjOjU7~m>@SQ4xkj&7$dD{utk9iX))l~Jj#_;A8mQ>RfafhjM2oE ziAjx#8{Nptm25TcorjIYX<>9_*ceT`^*{ApLkK3`uiX>kl$%DtZVaKD6(QisxfV4joJ1reo;E`;{N+bvW zl-V&Wk#-;w6@axM-_tIycdnI2Pd3HPQ?!Y_X#d<0-Ze%5FW^=ImVs4Z9mt_IAZ~Y` zIp2lnJs=1=0c&%$Fy8fneqe$#fPH5XFS*Zi)y>wf!g~#5!7aD$4&ns32kwJ;K!69J z5b)Yx9X&Q_A@Z$YvJ(T7oAH7#0Hb}+;k)g6*mncII{5g#_HchM;Jb^+=f#Ju-#vwX z1^IlJ^p}&9TT!qCIir2g;Jc2TYnfsA_QA&o#21UlVA@|jtf@m}&tg|&y#x9NL_L4) zKM0+@m0+g73p!u5+5S%G0y^JFM)wnfUX6UV|9th4$qv`cS5vR&0`wN-ylx)Bv+LA;k7_G9uYzS$MT!nM8*C986FnI#iG|j_jO7Xf!|NZ{DC&)m zwUFu^_c#UQin#(Phq}GJRf>G%^YcC&4fGus0n4zZ=#3|0@fOMzv4-`JX4~=`)ErdU M-oM{Y82^cW1LnwmKmY&$ literal 0 HcmV?d00001 diff --git a/lang/translations.ja.translation b/lang/translations.ja.translation new file mode 100644 index 0000000000000000000000000000000000000000..0709d833c86f824159377c2a8ba71e54db88d21f GIT binary patch literal 1645 zcma)-%TH556vl_AJba5vjLJ{k8(f(o*MD7rB2j4nttPW?`~#}I>w6MmdI-<&h|o-=d7RG!qI>p z_E}M%8ITbvc5hva=p$0(Lm82#sSin0?0}QbkfIRNpl$|zmhKNru?wz09vGIEEzpxp z%Lqk=Hq*?25sFz5g~$MWp`f~6J^9QOus)NGD>gt(vfI>*p{ZxJ^I zOUFlN&ufd&`{3`iiG3MNW+7o8e1hX%BW@5r@2GO=WUqUy6eYRJi z)1_jcZ3lEZNA}rvLZ>;`%X&L>s+E1VZs^oU_Sw!H>q{PmPS2+I;(BJG?}blwQ#~J@ z`o@Ai-&*%H;;3i*9-k1m3ZI@u@P4-uM_&-tLVQ5nI_!RM81Vb7L;nt+-i6{he>VJ0 zgZn3L0{c1O^SN^VB=l0~e2%QI;(YEwr>~V@eGNL@KdO=HWxXJEW8*pe1Axwu^+M=R z;Zr=pdOq}d`1D+Y^>^666+ZWa^%dwH(D`0*olDTG?LBCp$GESw8TXg!EdlAj2hJ|c zFuE|ok7~FxC6xE<*GwgpC-bwO^t>+zwW@JLfyLUp_cE7b*^UL`0)v-RfOL&uft z$D&bnUx^l}HAkhXHH8clIo`HJnQAFi&ABtGDQ_)HiB{{BsktY$?zj;V%6(!fkjik4 zo?IwVq9-_6FI3M|p_L(QF_i)3YF9;1u@ZHn&ME3HiGEk_b(f)=QtJtZ0>OHb$|4En WPb8XEqd!qq+oY&P{B3#gkLEX+-)l4g literal 0 HcmV?d00001 diff --git a/lang/translations.zh.translation b/lang/translations.zh.translation new file mode 100644 index 0000000000000000000000000000000000000000..0fef682c899bb616661b968584a3981237e03d21 GIT binary patch literal 1705 zcma)7TTE0}6y1O?M60P9tx4siiq`mGP(K=EL_-+Vf|7v-TOX4bAtQ0f z%}}-@NZd#PlmfiCL6d>$z$_q(wGeiRvuD2?`{jTKs0EnIwY)f62l#<7uoYn44%mIp zK3Cl5To<%QfCO;LiA%!v0GEKP0AEP}w}E_sTk&Z9hTb?VKN3cwr@6Nr2iyXN()|k^ z=i-4ejzaexbbPKfobLg2mtlE)40U!NJlDs)W3*>B_bx}km)J9u?jPt*z~^_v*aDpw zI-VE5GyVo+^`kq*i(u7v6#qSVo|CFy@oT{IcP2Ve{95o6a_DQpmw;FGDt#UJZ*u5& ze*IIg7d-cdU#hxKCwLG1aRA@vm0NpXh-9h`rP~2r70y-Nuc7-2I-VIr>3)W;5%{pI@>11;dJ3l~I5v#|a=BSeWo?s`fcIFr88ojTGra6N$y zeLI(|d zlcH9OwFD`%|Dbi_FG^j%nmKtYb!+e7`Q2olIGw(D&N{ZoIn4Zx-Qj^7zh`>7Xr&Z2 zQE3QINHmM)URh+}stgl|TQB>=iAw^R#6bM#QwtzXbVSA#+ TuJR`qFZI~Nv*WpW@lWa_DkP+$ literal 0 HcmV?d00001 diff --git a/levels/base_level/base_level.gd b/levels/base_level/base_level.gd index e35f8fa..03be371 100644 --- a/levels/base_level/base_level.gd +++ b/levels/base_level/base_level.gd @@ -42,12 +42,12 @@ func init(_chap_id: int, _lvl_id: int) -> void: chap_id = _chap_id lvl_id = _lvl_id - var lvl_name = LevelData.LEVEL_DATA[chap_id][lvl_id]["name-en"] + var lvl_name = "LEVEL_NAME_%d_%d" % [chap_id, lvl_id] var question = LevelData.LEVEL_DATA[chap_id][lvl_id]["question"].replace(" ", "").replace("X", "*") var choices = count(LevelData.LEVEL_DATA[chap_id][lvl_id]["choices"].replace(" ", "").replace("X", "*")) - $HUDs/Title.set_text("%d-%d %s" % [chap_id + 1, lvl_id + 1, lvl_name]) + $HUDs/Title.set_text("%d-%d %s" % [chap_id + 1, lvl_id + 1, tr(lvl_name)]) question = question.replace("[]", ".") diff --git a/levels/chapter_menu/level_menu/level_menu.gd b/levels/chapter_menu/level_menu/level_menu.gd index 67c639a..fb8e98a 100644 --- a/levels/chapter_menu/level_menu/level_menu.gd +++ b/levels/chapter_menu/level_menu/level_menu.gd @@ -15,7 +15,7 @@ const button_heigth : int = 50 func init(chap_id: int) -> void: self.chapter_id = chap_id - $UI/Title.text = LevelData.CHAP_NAMES[chapter_id]["name-en"] + $UI/Title.text = tr("CHAPTER_PATTERN") % [chap_id + 1, tr("CHAPTER_NAME_%d" % chap_id)] $LevelMenuCamera.init_position(Vector2(WIDTH * chap_id, 0)) $UI/PreviousChapterButton.set_disabled(chapter_id == 0) @@ -42,7 +42,7 @@ func _on_button_enter_level(chap_id: int, lvl_id: int) -> void: func _on_previous_chapter_button_pressed(): self.chapter_id -= 1 - $UI/Title.text = LevelData.CHAP_NAMES[chapter_id]["name-en"] + $UI/Title.text = tr("CHAPTER_PATTERN") % [self.chapter_id + 1, tr("CHAPTER_NAME_%d" % self.chapter_id)] ImageLib.change_theme(ImageLib.COLOR_THEMES[ImageLib.COLOR_THEMES.find(ImageLib.theme_to) - 1], LevelMenuCamera.MOVE_TIME) $UI/PreviousChapterButton.set_disabled(true) $UI/NextChapterButton.set_disabled(true) @@ -51,7 +51,7 @@ func _on_previous_chapter_button_pressed(): func _on_next_chapter_button_pressed(): self.chapter_id += 1 ImageLib.change_theme(ImageLib.COLOR_THEMES[ImageLib.COLOR_THEMES.find(ImageLib.theme_to) + 1], LevelMenuCamera.MOVE_TIME) - $UI/Title.text = LevelData.CHAP_NAMES[chapter_id]["name-en"] + $UI/Title.text = tr("CHAPTER_PATTERN") % [self.chapter_id + 1, tr("CHAPTER_NAME_%d" % self.chapter_id)] $UI/PreviousChapterButton.set_disabled(true) $UI/NextChapterButton.set_disabled(true) diff --git a/project.godot b/project.godot index 7aaae05..c719cf1 100644 --- a/project.godot +++ b/project.godot @@ -40,6 +40,10 @@ enabled=PackedStringArray("res://addons/AsepriteWizard/plugin.cfg") theme/custom="res://themes/default_theme.tres" theme/custom_font="res://fonts/Silver.ttf" +[internationalization] + +locale/translations=PackedStringArray("res://lang/translations.en.translation", "res://lang/translations.ja.translation", "res://lang/translations.zh.translation") + [rendering] textures/canvas_textures/default_texture_filter=0 diff --git a/scripts/level_data.gd b/scripts/level_data.gd index 0556258..f5a2730 100644 --- a/scripts/level_data.gd +++ b/scripts/level_data.gd @@ -2,32 +2,6 @@ class_name LevelData - -## 各章节的名称。 -## [br][br] -## [code]CHAP_NAMES[chapter_id]["name-en"][/code] 返回第 [param chapter_id] 章节的英文名称(包含 [code]Ch.[/code] 前缀)。 -const CHAP_NAMES := [ - { - "name-en": "Ch. 1 =P", - }, - { - "name-en": "Ch. 2 Add and Multiply", - }, - { - "name-en": "Ch. 3 ()", - }, - { - "name-en": "Ch. 4 Equal?", - }, - { - "name-en": "Ch. 5 <>", - }, - { - "name-en": "Ch. EX Challenge Levels", - } -] - - ## 各关卡的关卡数据。 ## [br][br] ## [code]LEVEL_DATA[chapter_id][level_id] : Dictionary[/code] 返回第 [param chapter_id] 章节的第 [param level_id] 关卡的关卡数据,以下记为 [code]data[/code]。其中: @@ -40,32 +14,26 @@ const CHAP_NAMES := [ const LEVEL_DATA := [ [ { - "name-en": "=P", "question": "P [] []", "choices": "= P" }, { - "name-en": "Smile", "question": "P {} {}", "choices": "= P P" }, { - "name-en": "Another Smile", "question": "[] = {}", "choices": "R R P D D" }, { - "name-en": "Reverse", "question": "{} [] []", "choices": "D D = d d" }, { - "name-en": "Reverse Again", "question": "[] {} {}", "choices": "d d = R R b b" }, { - "name-en": "Snake", "question": "[] = {} = {} = [] = {} = {}", "choices": "dddddd QQQQQQ RRRRRR DDDDDD PPPPPP qqqqqq" } @@ -73,52 +41,42 @@ const LEVEL_DATA := [ [ { - "name-en": "0+0=0, 0+1=1", "question": "[] [] {} {} d", "choices": "= + 0 d" }, { - "name-en": "1+1=1", "question": "[] [] {} {} 1", "choices": "= + 1 d" }, { - "name-en": "Swap", "question": "Q + [] = {} + []", "choices": "P P P P Q Q Q Q" }, { - "name-en": "Always True", "question": "1 [] {} = {} [] []", "choices": "1++PPdd" }, { - "name-en": "Paper Tiger", "question": "1 [] [] [] {} [] [] [] {} [] {} [] []", "choices": "== ++++++ 11 P q b R" }, { - "name-en": "Make Me Laugh", "question": "1 {} {} = []", "choices": "XDD" }, { - "name-en": "Reset", "question": "0 [] [] {} []", "choices": "XP=0" }, { - "name-en": "Not Necessary", "question": "[] {} {} {} {} []", "choices": "QQQQQQ DDXX=" }, { - "name-en": "True Reset", "question": "[] + [] [] [] [] {} = {} [] [] [] [] [] []", "choices": "0 0 1 d d q P P b R R Q +" }, { - "name-en": "Gold Experience", "question": "{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}", "choices": "PP DD bb qq dd XXXXX =" }, @@ -126,17 +84,14 @@ const LEVEL_DATA := [ [ { - "name-en": "He Goes First", "question": "[] [] + [] = ( [] {} {} ) [] []", "choices": "PP QQ RR X +" }, { - "name-en": "Still, He Goes First", "question": "[] + [] [] = [] [] ( [] {} {} )", "choices": "PP QQ RR X +" }, { - "name-en": "It's My Turn", "question": "P ([] [] []) = {} [] [] [] []", "choices": "PP QQ RR ++" }, @@ -144,23 +99,19 @@ const LEVEL_DATA := [ [ { - "name-en": "Missing Equation", "question": "[] + [] {} {}", "choices": "P P P 1 X", }, { - "name-en": "Why?", "question": "[] [] {} = {} [] {} = []", "choices": "PP qq ++ 1" }, { - "name-en": "Where is the Equation?", "question": "[] [] {} {} [] + [] [] {} {} []", "choices": "(())==01PP" }, { - "name-en": "Untitled", "question": "[] [] {} {} [] [] [] []", "choices": "=PPQQ+()" } @@ -168,29 +119,24 @@ const LEVEL_DATA := [ [ { - "name-en": "<", "question": "0 {} {} [] 1", "choices": "XD<" }, { - "name-en": "<=", "question": "[] X [] {} {} [] + []", "choices": "QQPP<=" }, { - "name-en": "<>", "question": "0 {} P [] [] []", "choices": "<>=P" } ], [ { - "name-en": "[EX]Erase Which?", "question": "[] {} {} [] [] [] [] {} {} {} {} {} [] [] [] [] [] []", "choices": "0 X D + P + P d = P X P + 0 d + P d", }, { - "name-en": "[EX] Really Challenging", "question": "[] [] [] [] [] {} {} [] [] [] [] {} {} + [] []", "choices": "PPP QQ DD (()) ++ = X" },