From 049ee5b60aba64c0afda80260b2be3cc30686ca6 Mon Sep 17 00:00:00 2001 From: Qwreey Date: Thu, 23 Feb 2023 14:13:15 +0900 Subject: [PATCH] fix: language bug, store custom object --- md/kr/include/locales.md | 92 ++++++++--------- md/kr/tutorial/11_extend.md | 2 + md/kr/tutorial/8_register.md | 9 ++ md/kr/tutorial/9_lang.md | 23 ++++- src/class.lua | 16 ++- src/lang.lua | 99 ++++++++++--------- src/store.lua | 12 ++- src/types.lua | 186 ++++++++++++++++++----------------- 8 files changed, 240 insertions(+), 199 deletions(-) diff --git a/md/kr/include/locales.md b/md/kr/include/locales.md index f836f28..cd56585 100644 --- a/md/kr/include/locales.md +++ b/md/kr/include/locales.md @@ -1,48 +1,48 @@ **Default** (default) -**English** (en_us) -**Spanish** (es_es) -**French** (fr_fr) -**Indonesian** (id_id) -**Italian** (it_it) -**Japanese** (ja_jp) -**Korean** (ko_kr) -**Russian** (ru_ru) -**Thai** (th_th) -**Turkish** (tr_tr) -**Vietnamese** (vi_vn) -**Portuguese** (pt_br) -**German** (de_de) -**ChineseSimplified** (zh_cn) -**ChineseTraditional** (zh_tw) -**Bulgarian** (bg_bg) -**Bengali** (bn_bd) -**Czech** (cs_cz) -**Danish** (da_dk) -**Greek** (el_gr) -**Estonian** (et_ee) -**Finnish** (fi_fi) -**Hindi** (hi_in) -**Croatian** (hr_hr) -**Hungarian** (hu_hu) -**Georgian** (ka_ge) -**Kazakh** (kk_kz) -**Khmer** (km_kh) -**Lithuanian** (lt_lt) -**Latvian** (lv_lv) -**Malay** (ms_my) -**Burmese** (my_mm) -**Bokmal** (nb_no) -**Dutch** (nl_nl) -**Filipino** (fil_ph) -**Polish** (pl_pl) -**Romanian** (ro_ro) -**Ukrainian** (uk_ua) -**Sinhala** (si_lk) -**Slovak** (sk_sk) -**Slovenian** (sl_sl) -**Albanian** (sq_al) -**Bosnian** (bs_ba) -**Serbian** (sr_rs) -**Swedish** (sv_se) -**Arabic** (ar_001) +**English** (en-us) +**Spanish** (es-es) +**French** (fr-fr) +**Indonesian** (id-id) +**Italian** (it-it) +**Japanese** (ja-jp) +**Korean** (ko-kr) +**Russian** (ru-ru) +**Thai** (th-th) +**Turkish** (tr-tr) +**Vietnamese** (vi-vn) +**Portuguese** (pt-br) +**German** (de-de) +**ChineseSimplified** (zh-cn) +**ChineseTraditional** (zh-tw) +**Bulgarian** (bg-bg) +**Bengali** (bn-bd) +**Czech** (cs-cz) +**Danish** (da-dk) +**Greek** (el-gr) +**Estonian** (et-ee) +**Finnish** (fi-fi) +**Hindi** (hi-in) +**Croatian** (hr-hr) +**Hungarian** (hu-hu) +**Georgian** (ka-ge) +**Kazakh** (kk-kz) +**Khmer** (km-kh) +**Lithuanian** (lt-lt) +**Latvian** (lv-lv) +**Malay** (ms-my) +**Burmese** (my-mm) +**Bokmal** (nb-no) +**Dutch** (nl-nl) +**Filipino** (fil-ph) +**Polish** (pl-pl) +**Romanian** (ro-ro) +**Ukrainian** (uk-ua) +**Sinhala** (si-lk) +**Slovak** (sk-sk) +**Slovenian** (sl-sl) +**Albanian** (sq-al) +**Bosnian** (bs-ba) +**Serbian** (sr-rs) +**Swedish** (sv-se) +**Arabic** (ar-001) diff --git a/md/kr/tutorial/11_extend.md b/md/kr/tutorial/11_extend.md index 39f3d92..1a445a6 100644 --- a/md/kr/tutorial/11_extend.md +++ b/md/kr/tutorial/11_extend.md @@ -53,6 +53,8 @@ local myClass = Class.Extend() -- 일반 오브젝트와 똑같이 id 를 넣고 GetObject 로 -- 가져올 수도 있습니다 local main = myClass "main" { + -- 이 테이블은 모듈의 :Init(props) 에 제공됩니다. + -- :Render(props) 에도 이 테이블이 제공됩니다. Testing = 1; Text = "Test"; -- 레지스터 값을 넘겨줄 수도 있습니다. diff --git a/md/kr/tutorial/8_register.md b/md/kr/tutorial/8_register.md index e9f7d5c..8360757 100644 --- a/md/kr/tutorial/8_register.md +++ b/md/kr/tutorial/8_register.md @@ -31,12 +31,21 @@ myStore.color = Color3.fromRGB(0,0,0) ???+ Warning "주의" 구현의 복잡성의 이유로 레지스터는 오브젝트 생성시에만 등록할 수 있습니다. + ```lua local myFrame = Frame{} Frame.BackgroundColor3 = myStore "color" ``` 위처럼 사용할 수 없습니다. + ```lua + local myFrame = Frame{} + Apply (myFrame) { + BackgroundColor3 = myStore "color"; + } + ``` + + > 1. 스토어를 생성함. > 2. 기본 값을 설정함. > 3. 스토어를 호출해 레지스터를 얻어 등록함. diff --git a/md/kr/tutorial/9_lang.md b/md/kr/tutorial/9_lang.md index 2b4c18b..31d927a 100644 --- a/md/kr/tutorial/9_lang.md +++ b/md/kr/tutorial/9_lang.md @@ -12,7 +12,7 @@ Quad 에는 귀찮은 언어관리를 자동으로 해주는 기능이 내장되어 있습니다. 이 기능은 register 와 연동해 적은 줄의 코드로 변하는 텍스트도 언어에 맞게 출력되도록 만들 수 있습니다. 번역 테이블은 `#!ts Lang.New(LangName:string,{ [Locale]: string|(options)->string })` 다음을 이용해 만들 수 있으며. -`Lang(LangName:string)(options)` 로 UI 에 적용시킬 수 있습니다. +`#!ts Lang(LangName:string)(options)->register` 로 UI 에 적용시킬 수 있습니다. === "용법" @@ -78,6 +78,27 @@ Quad 에는 귀찮은 언어관리를 자동으로 해주는 기능이 내장되 end ``` +???+ Warning "주의" + + 구현의 복잡성의 이유로 Lang 은 레지스터와 같은 제약을 가집니다 (오브젝트 생성시에만 등록할 수 있습니다) + + ```lua + local myLabel = TextLabel{} + Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" }) + myLabel.Text = Lang "Test" { lang = 1 } + ``` + 위처럼 사용할 수 없습니다. + + 대신에 `#!ts :Register` 문법을 사용하여 등록할 수 있습니다. + + ```lua + local myLabel = TextLabel{} + Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" }) + Apply (myLabel) { + Text = Lang "Test" { lang = 1 }; + } + ``` + --- ## Locale 목록 diff --git a/src/class.lua b/src/class.lua index e773e4e..5ac1d3d 100644 --- a/src/class.lua +++ b/src/class.lua @@ -27,6 +27,7 @@ function module.init(shared) local round = shared.Round ---@type quad_module_round local signal = shared.Signal ---@type quad_module_signal local bindable = signal.Bindable + local PcallGetProperty = store.PcallGetProperty local function InstanceNewWithName(classname,parent,name) local item = InstanceNew(classname,parent) @@ -108,16 +109,6 @@ function module.init(shared) end new.SetProperty = SetProperty - local function RawGetProperty(item,index) - return item[index] - end - local function PcallGetProperty(item,index) - local ok,err = pcall(RawGetProperty,item,index) - if ok then return err end - return nil - end - new.PcallGetProperty = PcallGetProperty - local function Link(linker,item,index,indexType) local target = linker.target local name = linker.name @@ -550,6 +541,11 @@ function module.init(shared) return this end + local function Apply() + + end + new.Apply = Apply + return new end diff --git a/src/lang.lua b/src/lang.lua index 1916bca..4979eeb 100644 --- a/src/lang.lua +++ b/src/lang.lua @@ -13,52 +13,52 @@ function module.init(shared) new.Locales = { ["Default"] = "default"; - ["English"] = "en_us"; - ["Spanish"] = "es_es"; - ["French"] = "fr_fr"; - ["Indonesian"] = "id_id"; - ["Italian"] = "it_it"; - ["Japanese"] = "ja_jp"; - ["Korean"] = "ko_kr"; - ["Russian"] = "ru_ru"; - ["Thai"] = "th_th"; - ["Turkish"] = "tr_tr"; - ["Vietnamese"] = "vi_vn"; - ["Portuguese"] = "pt_br"; - ["German"] = "de_de"; - ["ChineseSimplified"] = "zh_cn"; - ["ChineseTraditional"] = "zh_tw"; - ["Bulgarian"] = "bg_bg"; - ["Bengali"] = "bn_bd"; - ["Czech"] = "cs_cz"; - ["Danish"] = "da_dk"; - ["Greek"] = "el_gr"; - ["Estonian"] = "et_ee"; - ["Finnish"] = "fi_fi"; - ["Hindi"] = "hi_in"; - ["Croatian"] = "hr_hr"; - ["Hungarian"] = "hu_hu"; - ["Georgian"] = "ka_ge"; - ["Kazakh"] = "kk_kz"; - ["Khmer"] = "km_kh"; - ["Lithuanian"] = "lt_lt"; - ["Latvian"] = "lv_lv"; - ["Malay"] = "ms_my"; - ["Burmese"] = "my_mm"; - ["Bokmal"] = "nb_no"; - ["Dutch"] = "nl_nl"; - ["Filipino"] = "fil_ph"; - ["Polish"] = "pl_pl"; - ["Romanian"] = "ro_ro"; - ["Ukrainian"] = "uk_ua"; - ["Sinhala"] = "si_lk"; - ["Slovak"] = "sk_sk"; - ["Slovenian"] = "sl_sl"; - ["Albanian"] = "sq_al"; - ["Bosnian"] = "bs_ba"; - ["Serbian"] = "sr_rs"; - ["Swedish"] = "sv_se"; - ["Arabic"] = "ar_001"; + ["English"] = "en-us"; + ["Spanish"] = "es-es"; + ["French"] = "fr-fr"; + ["Indonesian"] = "id-id"; + ["Italian"] = "it-it"; + ["Japanese"] = "ja-jp"; + ["Korean"] = "ko-kr"; + ["Russian"] = "ru-ru"; + ["Thai"] = "th-th"; + ["Turkish"] = "tr-tr"; + ["Vietnamese"] = "vi-vn"; + ["Portuguese"] = "pt-br"; + ["German"] = "de-de"; + ["ChineseSimplified"] = "zh-cn"; + ["ChineseTraditional"] = "zh-tw"; + ["Bulgarian"] = "bg-bg"; + ["Bengali"] = "bn-bd"; + ["Czech"] = "cs-cz"; + ["Danish"] = "da-dk"; + ["Greek"] = "el-gr"; + ["Estonian"] = "et-ee"; + ["Finnish"] = "fi-fi"; + ["Hindi"] = "hi-in"; + ["Croatian"] = "hr-hr"; + ["Hungarian"] = "hu-hu"; + ["Georgian"] = "ka-ge"; + ["Kazakh"] = "kk-kz"; + ["Khmer"] = "km-kh"; + ["Lithuanian"] = "lt-lt"; + ["Latvian"] = "lv-lv"; + ["Malay"] = "ms-my"; + ["Burmese"] = "my-mm"; + ["Bokmal"] = "nb-no"; + ["Dutch"] = "nl-nl"; + ["Filipino"] = "fil-ph"; + ["Polish"] = "pl-pl"; + ["Romanian"] = "ro-ro"; + ["Ukrainian"] = "uk-ua"; + ["Sinhala"] = "si-lk"; + ["Slovak"] = "sk-sk"; + ["Slovenian"] = "sl-sl"; + ["Albanian"] = "sq-al"; + ["Bosnian"] = "bs-ba"; + ["Serbian"] = "sr-rs"; + ["Swedish"] = "sv-se"; + ["Arabic"] = "ar-001"; } local function GetLocale() @@ -75,6 +75,7 @@ function module.init(shared) local weak = {__mode = "v"} local lang = {} + local langList = {} lang.__index = lang function lang.New(id,handlers) local this = { @@ -84,7 +85,7 @@ function module.init(shared) index=1; registers = setmetatable({},weak); } - lang[id] = this + langList[id] = this if not handlers[new.Locales.Default] then warn(("Localization %s have no Default value, Did you missed '[Lang.Locales.Default] = ...' ? It may make Localization fail on other languages")) end @@ -205,7 +206,7 @@ function module.init(shared) end function new.Update() - for _,this in pairs(lang) do + for _,this in pairs(langList) do this:UpdateAll() end end @@ -213,7 +214,7 @@ function module.init(shared) setmetatable(new,{ __call = function(_,id) return function (options) - local data = lang[id] + local data = langList[id] if not data then error(("Localization %s is not definded"):format(id)) end diff --git a/src/store.lua b/src/store.lua index 01780cc..49debad 100644 --- a/src/store.lua +++ b/src/store.lua @@ -40,6 +40,16 @@ function module.init(shared) local items = {} new.Items = items + local function RawGetProperty(item,index) + return item[index] + end + local function PcallGetProperty(item,index) + local ok,err = pcall(RawGetProperty,item,index) + if ok then return err end + return nil + end + new.PcallGetProperty = PcallGetProperty + -- id space (array of object) local objectListClass = {__type = "quad_objectlist"} function objectListClass:EachAsync(func) @@ -290,7 +300,7 @@ function module.init(shared) end function store:__newindex(key,value) -- if got register, just copy data to self and connect - if type(value) == "table" and value.__type == "quad_register" then + if PcallGetProperty(value,"__type") == "quad_register" then -- warn "[Quad] adding register value on store is only allowed when init store. set value request was ignored" local selfValues = self.__self diff --git a/src/types.lua b/src/types.lua index 4df7e0d..5105816 100644 --- a/src/types.lua +++ b/src/types.lua @@ -218,100 +218,102 @@ export type langHandler = { export type Locale = string export type module_lang = { New: (id:string,handlers:{ - en_us: langHandler; - es_es: langHandler; - fr_fr: langHandler; - id_id: langHandler; - it_it: langHandler; - ja_jp: langHandler; - ko_kr: langHandler; - ru_ru: langHandler; - th_th: langHandler; - tr_tr: langHandler; - vi_vn: langHandler; - pt_br: langHandler; - de_de: langHandler; - zh_cn: langHandler; - zh_tw: langHandler; - bg_bg: langHandler; - bn_bd: langHandler; - cs_cz: langHandler; - da_dk: langHandler; - el_gr: langHandler; - et_ee: langHandler; - fi_fi: langHandler; - hi_in: langHandler; - hr_hr: langHandler; - hu_hu: langHandler; - ka_ge: langHandler; - kk_kz: langHandler; - km_kh: langHandler; - lt_lt: langHandler; - lv_lv: langHandler; - ms_my: langHandler; - my_mm: langHandler; - nb_no: langHandler; - nl_nl: langHandler; - fil_ph: langHandler; - pl_pl: langHandler; - ro_ro: langHandler; - uk_ua: langHandler; - si_lk: langHandler; - sk_sk: langHandler; - sl_sl: langHandler; - sq_al: langHandler; - bs_ba: langHandler; - sr_rs: langHandler; - sv_se: langHandler; - ar_001: langHandler; + ["default"]: langHandler; + ["en-us"]: langHandler; + ["es-es"]: langHandler; + ["fr-fr"]: langHandler; + ["id-id"]: langHandler; + ["it-it"]: langHandler; + ["ja-jp"]: langHandler; + ["ko-kr"]: langHandler; + ["ru-ru"]: langHandler; + ["th-th"]: langHandler; + ["tr-tr"]: langHandler; + ["vi-vn"]: langHandler; + ["pt-br"]: langHandler; + ["de-de"]: langHandler; + ["zh-cn"]: langHandler; + ["zh-tw"]: langHandler; + ["bg-bg"]: langHandler; + ["bn-bd"]: langHandler; + ["cs-cz"]: langHandler; + ["da-dk"]: langHandler; + ["el-gr"]: langHandler; + ["et-ee"]: langHandler; + ["fi-fi"]: langHandler; + ["hi-in"]: langHandler; + ["hr-hr"]: langHandler; + ["hu-hu"]: langHandler; + ["ka-ge"]: langHandler; + ["kk-kz"]: langHandler; + ["km-kh"]: langHandler; + ["lt-lt"]: langHandler; + ["lv-lv"]: langHandler; + ["ms-my"]: langHandler; + ["my-mm"]: langHandler; + ["nb-no"]: langHandler; + ["nl-nl"]: langHandler; + ["fil-ph"]: langHandler; + ["pl-pl"]: langHandler; + ["ro-ro"]: langHandler; + ["uk-ua"]: langHandler; + ["si-lk"]: langHandler; + ["sk-sk"]: langHandler; + ["sl-sl"]: langHandler; + ["sq-al"]: langHandler; + ["bs-ba"]: langHandler; + ["sr-rs"]: langHandler; + ["sv-se"]: langHandler; + ["ar-001"]: langHandler; })->(); Locales: { - English: Locale & "en_us"; - Spanish: Locale & "es_es"; - French: Locale & "fr_fr"; - Indonesian: Locale & "id_id"; - Italian: Locale & "it_it"; - Japanese: Locale & "ja_jp"; - Korean: Locale & "ko_kr"; - Russian: Locale & "ru_ru"; - Thai: Locale & "th_th"; - Turkish: Locale & "tr_tr"; - Vietnamese: Locale & "vi_vn"; - Portuguese: Locale & "pt_br"; - German: Locale & "de_de"; - ChineseSimplified: Locale & "zh_cn"; - ChineseTraditional: Locale & "zh_tw"; - Bulgarian: Locale & "bg_bg"; - Bengali: Locale & "bn_bd"; - Czech: Locale & "cs_cz"; - Danish: Locale & "da_dk"; - Greek: Locale & "el_gr"; - Estonian: Locale & "et_ee"; - Finnish: Locale & "fi_fi"; - Hindi: Locale & "hi_in"; - Croatian: Locale & "hr_hr"; - Hungarian: Locale & "hu_hu"; - Georgian: Locale & "ka_ge"; - Kazakh: Locale & "kk_kz"; - Khmer: Locale & "km_kh"; - Lithuanian: Locale & "lt_lt"; - Latvian: Locale & "lv_lv"; - Malay: Locale & "ms_my"; - Burmese: Locale & "my_mm"; - Bokmal: Locale & "nb_no"; - Dutch: Locale & "nl_nl"; - Filipino: Locale & "fil_ph"; - Polish: Locale & "pl_pl"; - Romanian: Locale & "ro_ro"; - Ukrainian: Locale & "uk_ua"; - Sinhala: Locale & "si_lk"; - Slovak: Locale & "sk_sk"; - Slovenian: Locale & "sl_sl"; - Albanian: Locale & "sq_al"; - Bosnian: Locale & "bs_ba"; - Serbian: Locale & "sr_rs"; - Swedish: Locale & "sv_se"; - Arabic: Locale & "ar_001"; + Default: "default"; + English: Locale & "en-us"; + Spanish: Locale & "es-es"; + French: Locale & "fr-fr"; + Indonesian: Locale & "id-id"; + Italian: Locale & "it-it"; + Japanese: Locale & "ja-jp"; + Korean: Locale & "ko-kr"; + Russian: Locale & "ru-ru"; + Thai: Locale & "th-th"; + Turkish: Locale & "tr-tr"; + Vietnamese: Locale & "vi-vn"; + Portuguese: Locale & "pt-br"; + German: Locale & "de-de"; + ChineseSimplified: Locale & "zh-cn"; + ChineseTraditional: Locale & "zh-tw"; + Bulgarian: Locale & "bg-bg"; + Bengali: Locale & "bn-bd"; + Czech: Locale & "cs-cz"; + Danish: Locale & "da-dk"; + Greek: Locale & "el-gr"; + Estonian: Locale & "et-ee"; + Finnish: Locale & "fi-fi"; + Hindi: Locale & "hi-in"; + Croatian: Locale & "hr-hr"; + Hungarian: Locale & "hu-hu"; + Georgian: Locale & "ka-ge"; + Kazakh: Locale & "kk-kz"; + Khmer: Locale & "km-kh"; + Lithuanian: Locale & "lt-lt"; + Latvian: Locale & "lv-lv"; + Malay: Locale & "ms-my"; + Burmese: Locale & "my-mm"; + Bokmal: Locale & "nb-no"; + Dutch: Locale & "nl-nl"; + Filipino: Locale & "fil-ph"; + Polish: Locale & "pl-pl"; + Romanian: Locale & "ro-ro"; + Ukrainian: Locale & "uk-ua"; + Sinhala: Locale & "si-lk"; + Slovak: Locale & "sk-sk"; + Slovenian: Locale & "sl-sl"; + Albanian: Locale & "sq-al"; + Bosnian: Locale & "bs-ba"; + Serbian: Locale & "sr-rs"; + Swedish: Locale & "sv-se"; + Arabic: Locale & "ar-001"; }; CurrentLocale: Locale; FailedMessage: string;