diff --git a/3rd/EmmyLuaCodeStyle b/3rd/EmmyLuaCodeStyle
index e728970f8..8500f3af1 160000
--- a/3rd/EmmyLuaCodeStyle
+++ b/3rd/EmmyLuaCodeStyle
@@ -1 +1 @@
-Subproject commit e728970f81e887aa4078edaf93af895311bf667e
+Subproject commit 8500f3af178f097331d938378648078d023f4c7c
diff --git a/changelog.md b/changelog.md
index 9388efdbf..03f3e7c03 100644
--- a/changelog.md
+++ b/changelog.md
@@ -3,6 +3,18 @@
 ## Unreleased
 <!-- Add all new changes here. They will be moved under a version at release -->
 
+## 3.15.0
+`2025-6-25`
+* `NEW` Support custom addons path for enhanced editor flexibility
+* `NEW` Add `Lua.type.maxUnionVariants` which can be set to limit how many union variants are checked against
+* `CHG` Add missing locale
+* `CHG` Fulfill zh-tw translations
+* `FIX` Cannot debug in Linux due to lua-debug expecting host process to have lua54 symbols available
+* `FIX` Support hex color codes with `#` in `textDocument/documentColor`
+* `FIX` Prevent class methods from triggering missing-fields diagnostics
+* `FIX` Updates the EmmyLuaCodeStyle submodule reference to a newer commit, ensuring compatibility with GCC 15
+* `FIX` Large unions will no longer erroneously fail to match later variants
+
 ## 3.14.0
 `2025-4-7`
 * `NEW` locale `es-419`, thanks [Felipe Lema](https://codeberg.org/FelipeLema)
diff --git a/doc/en-us/config.md b/doc/en-us/config.md
index caa3c3a8f..6e6a5bcae 100644
--- a/doc/en-us/config.md
+++ b/doc/en-us/config.md
@@ -14,6 +14,16 @@ boolean
 true
 ```
 
+# addonRepositoryPath
+
+Specifies the addon repository path (not related to the addon manager).
+
+## type
+
+```ts
+string
+```
+
 # codeLens.enable
 
 Enable code lens.
@@ -2320,4 +2330,4 @@ Array<string>
 
 ```jsonc
 []
-```
\ No newline at end of file
+```
diff --git a/doc/pt-br/config.md b/doc/pt-br/config.md
index acaed4dc8..2df237476 100644
--- a/doc/pt-br/config.md
+++ b/doc/pt-br/config.md
@@ -14,6 +14,16 @@ boolean
 true
 ```
 
+# addonRepositoryPath
+
+Specifies the addon repository path (not related to the addon manager).
+
+## type
+
+```ts
+string
+```
+
 # codeLens.enable
 
 Enable code lens.
@@ -2320,4 +2330,4 @@ Array<string>
 
 ```jsonc
 []
-```
\ No newline at end of file
+```
diff --git a/doc/zh-cn/config.md b/doc/zh-cn/config.md
index e7292b929..8505bed70 100644
--- a/doc/zh-cn/config.md
+++ b/doc/zh-cn/config.md
@@ -14,6 +14,16 @@ boolean
 true
 ```
 
+# addonRepositoryPath
+
+指定插件仓库的路径（与 Addon Manager 无关）。
+
+## type
+
+```ts
+string
+```
+
 # codeLens.enable
 
 启用代码度量。
@@ -2318,4 +2328,4 @@ Array<string>
 
 ```jsonc
 []
-```
\ No newline at end of file
+```
diff --git a/doc/zh-tw/config.md b/doc/zh-tw/config.md
index 5e491a516..7a75e1618 100644
--- a/doc/zh-tw/config.md
+++ b/doc/zh-tw/config.md
@@ -14,6 +14,16 @@ boolean
 true
 ```
 
+# addonRepositoryPath
+
+Specifies the addon repository path (not related to the addon manager).
+
+## type
+
+```ts
+string
+```
+
 # codeLens.enable
 
 Enable code lens.
@@ -2318,4 +2328,4 @@ Array<string>
 
 ```jsonc
 []
-```
\ No newline at end of file
+```
diff --git a/locale/en-us/setting.lua b/locale/en-us/setting.lua
index e0ca458b8..872475f04 100644
--- a/locale/en-us/setting.lua
+++ b/locale/en-us/setting.lua
@@ -6,6 +6,8 @@ config.addonManager.repositoryBranch =
 "Specifies the git branch used by the addon manager."
 config.addonManager.repositoryPath =
 "Specifies the git path used by the addon manager."
+config.addonRepositoryPath        =
+"Specifies the addon repository path (not related to the addon manager)."
 config.runtime.version            =
 "Lua runtime version."
 config.runtime.path               =
@@ -279,7 +281,10 @@ Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/doc
 config.spell.dict                        =
 'Custom words for spell checking.'
 config.nameStyle.config                  =
-'Set name style config'
+[[
+Set name style config.
+Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/docs) to learn usage.
+]]
 config.telemetry.enable                  =
 [[
 Enable telemetry to send your editor information and error logs over the network. Read our privacy policy [here](https://luals.github.io/privacy/#language-server).
@@ -289,7 +294,7 @@ config.misc.parameters                   =
 config.misc.executablePath               =
 'Specify the executable path in VSCode.'
 config.language.fixIndent                =
-'(VSCode only) Fix incorrect auto-indentation, such as incorrect indentation when line breaks occur within a string containing the word "function."'
+'(VSCode only) Fix incorrect auto-indentation, such as incorrect indentation when line breaks occur within a string containing the word "function".'
 config.language.completeAnnotation       =
 '(VSCode only) Automatically insert "---@ " after a line break following a annotation.'
 config.type.castNumberToInteger          =
@@ -316,12 +321,22 @@ config.type.checkTableShape              =
 [[
 Strictly check the shape of the table.
 ]]
+config.type.inferTableSize               =
+'Maximum number of table fields analyzed during type inference.'
 config.doc.privateName                   =
 'Treat specific field names as private, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are private, witch can only be accessed in the class where the definition is located.'
 config.doc.protectedName                 =
 'Treat specific field names as protected, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are protected, witch can only be accessed in the class where the definition is located and its subclasses.'
 config.doc.packageName                   =
 'Treat specific field names as package, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are package, witch can only be accessed in the file where the definition is located.'
+config.doc.regengine                     =
+'The regular expression engine used for matching documentation scope names.'
+config.doc.regengine.glob                =
+'The default lightweight pattern syntax.'
+config.doc.regengine.lua                 =
+'Full Lua-style regular expressions.'
+config.docScriptPath                     =
+'The regular expression engine used for matching documentation scope names.'
 config.diagnostics['unused-local']          =
 'Enable unused local variable diagnostics.'
 config.diagnostics['unused-function']       =
@@ -339,7 +354,7 @@ config.diagnostics['trailing-space']        =
 config.diagnostics['redefined-local']       =
 'Enable redefined local variable diagnostics.'
 config.diagnostics['newline-call']          =
-'Enable newline call diagnostics. Is\'s raised when a line starting with `(` is encountered, which is syntactically parsed as a function call on the previous line.'
+'Enable newline call diagnostics. It\'s raised when a line starting with `(` is encountered, which is syntactically parsed as a function call on the previous line.'
 config.diagnostics['newfield-call']         =
 'Enable newfield call diagnostics. It is raised when the parenthesis of a function call appear on the following line when defining a field in a table.'
 config.diagnostics['redundant-parameter']   =
diff --git a/locale/es-419/setting.lua b/locale/es-419/setting.lua
index f7d76480f..f6d92f451 100644
--- a/locale/es-419/setting.lua
+++ b/locale/es-419/setting.lua
@@ -6,6 +6,8 @@ config.addonManager.repositoryBranch =
 "Especifica la rama de git usada por el manejador de extensiones."
 config.addonManager.repositoryPath =
 "Especifica la ruta git usada por el manejador de extensiones."
+config.addonRepositoryPath        = -- TODO: need translate!
+"Specifies the addon repository path (not related to the addon manager)."
 
 config.runtime.version            =
 "Versión de Lua que se ejecuta."
@@ -280,7 +282,11 @@ para aprender más sobre su uso.
 config.spell.dict                        =
 'Palabras extra para el corrector ortográfico.'
 config.nameStyle.config                  =
-'Configuración de estilo para nombres.'
+[[
+Configuración de estilo para nombres.
+Revise [la documentación del formateador](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/docs)
+para aprender más sobre su uso.
+]]
 config.telemetry.enable                  =
 [[
 Habilita la telemetría para enviar información del editor y registros de errores por la red. Lea nuestra política de privacidad [aquí (en inglés)](https://luals.github.io/privacy#language-server).
@@ -317,12 +323,22 @@ config.type.checkTableShape              =
 [[
 Chequea estrictamente la forma de la tabla.
 ]]
+config.type.inferTableSize               = -- TODO: need translate!
+'Maximum number of table fields analyzed during type inference.'
 config.doc.privateName                   =
 'Trata los nombres específicos de campo como privados. Por ejemplo `m_*` significa `XXX.m_id` y `XXX.m_tipo` son privados, por lo que solo pueden ser accedidos donde se define la clase.'
 config.doc.protectedName                 =
 'Trata los nombres específicos de campo como protegidos. Por ejemplo `m_*` significa `XXX.m_id` y `XXX.m_tipo` son privados, por lo que solo pueden ser accedidos donde se define la clase y sus subclases.'
 config.doc.packageName                   =
 'Trata los nombres específicos de campo como del paquete. Por ejemplo `m_*` significa `XXX.m_id` y `XXX.m_tipo` son de paquete, por lo que solo pueden ser accedidos en el archivo donde son definidos.'
+config.doc.regengine                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
+config.doc.regengine.glob                = -- TODO: need translate!
+'The default lightweight pattern syntax.'
+config.doc.regengine.lua                 = -- TODO: need translate!
+'Full Lua-style regular expressions.'
+config.docScriptPath                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
 config.diagnostics['unused-local']          =
 'Habilita el diagnóstico de variables local sin uso.'
 config.diagnostics['unused-function']       =
diff --git a/locale/ja-jp/setting.lua b/locale/ja-jp/setting.lua
index a8c307324..d9d2031ea 100644
--- a/locale/ja-jp/setting.lua
+++ b/locale/ja-jp/setting.lua
@@ -6,6 +6,8 @@ config.addonManager.repositoryBranch = -- TODO: need translate!
 "Specifies the git branch used by the addon manager."
 config.addonManager.repositoryPath = -- TODO: need translate!
 "Specifies the git path used by the addon manager."
+config.addonRepositoryPath        = -- TODO: need translate!
+"Specifies the addon repository path (not related to the addon manager)."
 config.runtime.version            = -- TODO: need translate!
 "Lua runtime version."
 config.runtime.path               = -- TODO: need translate!
@@ -279,7 +281,10 @@ Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/doc
 config.spell.dict                        = -- TODO: need translate!
 'Custom words for spell checking.'
 config.nameStyle.config                  = -- TODO: need translate!
-'Set name style config'
+[[
+Set name style config.
+Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/docs) to learn usage.
+]]
 config.telemetry.enable                  = -- TODO: need translate!
 [[
 Enable telemetry to send your editor information and error logs over the network. Read our privacy policy [here](https://luals.github.io/privacy/#language-server).
@@ -316,12 +321,22 @@ config.type.checkTableShape              = -- TODO: need translate!
 [[
 Strictly check the shape of the table.
 ]]
+config.type.inferTableSize               = -- TODO: need translate!
+'Maximum number of table fields analyzed during type inference.'
 config.doc.privateName                   = -- TODO: need translate!
 'Treat specific field names as private, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are private, witch can only be accessed in the class where the definition is located.'
 config.doc.protectedName                 = -- TODO: need translate!
 'Treat specific field names as protected, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are protected, witch can only be accessed in the class where the definition is located and its subclasses.'
 config.doc.packageName                   = -- TODO: need translate!
 'Treat specific field names as package, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are package, witch can only be accessed in the file where the definition is located.'
+config.doc.regengine                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
+config.doc.regengine.glob                = -- TODO: need translate!
+'The default lightweight pattern syntax.'
+config.doc.regengine.lua                 = -- TODO: need translate!
+'Full Lua-style regular expressions.'
+config.docScriptPath                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
 config.diagnostics['unused-local']          = -- TODO: need translate!
 'Enable unused local variable diagnostics.'
 config.diagnostics['unused-function']       = -- TODO: need translate!
diff --git a/locale/pt-br/setting.lua b/locale/pt-br/setting.lua
index 465b45f27..037340ec1 100644
--- a/locale/pt-br/setting.lua
+++ b/locale/pt-br/setting.lua
@@ -6,6 +6,8 @@ config.addonManager.repositoryBranch = -- TODO: need translate!
 "Specifies the git branch used by the addon manager."
 config.addonManager.repositoryPath = -- TODO: need translate!
 "Specifies the git path used by the addon manager."
+config.addonRepositoryPath        = -- TODO: need translate!
+"Specifies the addon repository path (not related to the addon manager)."
 config.runtime.version            = -- TODO: need translate!
 "Lua runtime version."
 config.runtime.path               = -- TODO: need translate!
@@ -279,7 +281,10 @@ Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/doc
 config.spell.dict                        = -- TODO: need translate!
 'Custom words for spell checking.'
 config.nameStyle.config                  = -- TODO: need translate!
-'Set name style config'
+[[
+Set name style config.
+Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/docs) to learn usage.
+]]
 config.telemetry.enable                  = -- TODO: need translate!
 [[
 Enable telemetry to send your editor information and error logs over the network. Read our privacy policy [here](https://luals.github.io/privacy/#language-server).
@@ -316,12 +321,22 @@ config.type.checkTableShape              = -- TODO: need translate!
 [[
 对表的形状进行严格检查。
 ]]
+config.type.inferTableSize               = -- TODO: need translate!
+'Maximum number of table fields analyzed during type inference.'
 config.doc.privateName                   = -- TODO: need translate!
 'Treat specific field names as private, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are private, witch can only be accessed in the class where the definition is located.'
 config.doc.protectedName                 = -- TODO: need translate!
 'Treat specific field names as protected, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are protected, witch can only be accessed in the class where the definition is located and its subclasses.'
 config.doc.packageName                   = -- TODO: need translate!
 'Treat specific field names as package, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are package, witch can only be accessed in the file where the definition is located.'
+config.doc.regengine                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
+config.doc.regengine.glob                = -- TODO: need translate!
+'The default lightweight pattern syntax.'
+config.doc.regengine.lua                 = -- TODO: need translate!
+'Full Lua-style regular expressions.'
+config.docScriptPath                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
 config.diagnostics['unused-local']          = -- TODO: need translate!
 '未使用的局部变量'
 config.diagnostics['unused-function']       = -- TODO: need translate!
diff --git a/locale/zh-cn/setting.lua b/locale/zh-cn/setting.lua
index ece1e6191..614c76e0f 100644
--- a/locale/zh-cn/setting.lua
+++ b/locale/zh-cn/setting.lua
@@ -6,6 +6,8 @@ config.addonManager.repositoryBranch =
 "指定插件管理器(Addon Manager)使用的git仓库分支"
 config.addonManager.repositoryPath =
 "指定插件管理器(Addon Manager)使用的git仓库路径"
+config.addonRepositoryPath        =
+"指定插件仓库的路径（与 Addon Manager 无关）"
 config.runtime.version            =
 "Lua运行版本。"
 config.runtime.path               =
@@ -53,7 +55,7 @@ config.diagnostics.disable        =
 config.diagnostics.globals        =
 "已定义的全局变量。"
 config.diagnostics.globalsRegex   =
-"启用诊断以检测尝试关闭非对象的变量。"
+"已定义的全局变量符合的正则表达式。"
 config.diagnostics.severity       =
 [[
 修改诊断等级。
@@ -277,7 +279,10 @@ config.format.defaultConfig              =
 config.spell.dict                        =
 '拼写检查的自定义单词。'
 config.nameStyle.config                  =
-'设定命名风格检查的配置'
+[[
+设定命名风格检查的配置。
+请查阅[格式化文档](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/docs)了解用法。
+]]
 config.telemetry.enable                  =
 [[
 启用遥测，通过网络发送你的编辑器信息与错误日志。在[此处](https://luals.github.io/privacy/#language-server)阅读我们的隐私声明。
@@ -314,12 +319,22 @@ config.type.checkTableShape              =
 [[
 对表的形状进行严格检查。
 ]]
+config.type.inferTableSize               =
+'类型推断期间分析的表字段的最大数量。'
 config.doc.privateName                   =
 '将特定名称的字段视为私有，例如 `m_*` 意味着 `XXX.m_id` 与 `XXX.m_type` 是私有字段，只能在定义所在的类中访问。'
 config.doc.protectedName                 =
 '将特定名称的字段视为受保护，例如 `m_*` 意味着 `XXX.m_id` 与 `XXX.m_type` 是受保护的字段，只能在定义所在的类极其子类中访问。'
 config.doc.packageName                   =
 '将特定名称的字段视为package，例如 `m_*` 意味着 `XXX.m_id` 与 `XXX.m_type` 只能在定义所在的文件中访问。'
+config.doc.regengine                     =
+'用于匹配文档作用域名称的正则表达式引擎。'
+config.doc.regengine.glob                =
+'默认轻量级模式语法。'
+config.doc.regengine.lua                 =
+'完整的 Lua 风格正则表达式。'
+config.docScriptPath                     =
+'自定义 Lua 脚本路径，覆盖默认文档生成行为。'
 config.diagnostics['unused-local']          =
 '未使用的局部变量'
 config.diagnostics['unused-function']       =
diff --git a/locale/zh-tw/meta.lua b/locale/zh-tw/meta.lua
index 8aa5656d9..b942c480f 100644
--- a/locale/zh-tw/meta.lua
+++ b/locale/zh-tw/meta.lua
@@ -4,7 +4,7 @@ arg                 =
 '獨立版Lua的啟動引數。'
 
 assert              =
-'如果其引數 `v` 的值為假（ `nil` 或 `false` ），它就呼叫 $error ；否則，回傳所有的引數。在錯誤情況時， `message` 指那個錯誤對象；如果不提供這個引數，預設為 `"assertion failed!"` 。'
+'如果其引數 `v` 的值為假（ `nil` 或 `false` ），它就擲回 $error ；否則，回傳所有的引數。在發生錯誤時， `message` 是錯誤物件；如果不提供這個引數，預設為 `"assertion failed!"` 。'
 
 cgopt.collect       =
 '做一次完整的垃圾回收循環。'
@@ -28,14 +28,14 @@ cgopt.isrunning     =
 '回傳表示回收器是否在工作的布林值。'
 
 collectgarbage      =
-'這個函式是垃圾回收器的一般介面。透過引數 opt 它提供了一組不同的功能。'
+'這個函式是垃圾回收器的一般介面。它透過引數 opt 提供了一組不同的功能。'
 
 dofile              =
 '打開該名字的檔案，並執行檔案中的 Lua 程式碼區塊。不帶引數呼叫時， `dofile` 執行標準輸入的內容（`stdin`）。回傳該程式碼區塊的所有回傳值。對於有錯誤的情況， `dofile` 將錯誤回饋給呼叫者（即 `dofile` 沒有執行在保護模式下）。'
 
 error               =
 [[
-中止上一次保護函式呼叫，將錯誤對象 `message` 回傳。函式 `error` 永遠不會回傳。
+中止上一次保護函式呼叫，將錯誤物件 `message` 回傳。函式 `error` 永遠不會回傳。
 
 當 `message` 是一個字串時，通常 `error` 會把一些有關出錯位置的資訊附加在訊息的開頭。 `level` 引數指明了怎樣獲得出錯位置。
 ]]
@@ -47,7 +47,7 @@ getfenv             =
 '回傳給定函式的環境。 `f` 可以是一個Lua函式，也可是一個表示呼叫堆疊層級的數字。'
 
 getmetatable        =
-'如果 `object` 不包含中繼資料表，回傳 `nil` 。否則，如果在該物件的中繼資料表中有 `"__metatable"` 域時回傳其關聯值，沒有時回傳該對象的中繼資料表。'
+'如果 `object` 不包含中繼資料表，回傳 `nil` 。否則，如果在該物件的中繼資料表中有 `"__metatable"` 欄位時回傳其關聯值，沒有時回傳該對象的中繼資料表。'
 
 ipairs              =
 [[
@@ -75,7 +75,7 @@ load['>5.2']      =
 ]]
 
 loadfile            =
-'從檔案 `filename` 或標準輸入（如果檔名未提供）中獲取程式碼區塊。'
+'從檔案 `filename` 或標準輸入（如果未提供檔名）中獲取程式碼區塊。'
 
 loadstring          =
 '使用給定字串載入程式碼區塊。'
@@ -134,20 +134,24 @@ setfenv             =
 
 setmetatable        =
 [[
-為指定的表設定中繼資料表。（你不能在 Lua 中改變其它類型值的中繼資料表，那些只能在 C 裡做。）如果 `metatable` 是 `nil`，將指定的表的中繼資料表移除。如果原來那張中繼資料表有 `"__metatable"` 域，擲回一個錯誤。
+為指定的表設定中繼資料表，如果 `metatable` 是 `nil`，則移除該表的中繼資料表。如果原來那張中繼資料表有 `"__metatable"` 欄位，則擲回一個錯誤。
+
+這個函式回傳 `table`。
+
+你必須使用除錯庫（參見§6.10）才能修改 Lua 中其他類型的中繼資料表。
 ]]
 
 tonumber            =
 [[
-如果呼叫的時候沒有 `base` ， `tonumber` 嘗試把引數轉換為一個數字。如果引數已經是一個數字，或是一個可以轉換為數字的字串， `tonumber` 就回傳這個數字，否則回傳 `fail`。
+如果呼叫的時候沒有 `base` ， `tonumber` 會嘗試把引數轉換為一個數字。如果引數已經是一個數字，或是一個可以轉換為數字的字串， `tonumber` 就回傳這個數字，否則回傳 `fail`。
 
 字串的轉換結果可能是整數也可能是浮點數，這取決於 Lua 的轉換文法（參見 §3.1）。（字串可以有前置和後置的空格，可以帶符號。）
 ]]
 
 tostring            =
 [[
-可以接收任何類型，它將其轉換為人可閱讀的字串形式。浮點數總被轉換為浮點數的表現形式（小數點形式或是指數形式）。
-如果 `v` 有 `"__tostring"` 域的中繼資料表， `tostring` 會以 `v` 為引數呼叫它。並用它的結果作為回傳值。
+可以將任何類型轉換為人可閱讀的字串形式。浮點數總被轉換為浮點數的表現形式（小數點形式或是指數形式）。
+如果 `v` 的中繼資料表有 `"__tostring"` 欄位， `tostring` 會以 `v` 為引數呼叫它。並用它的結果作為回傳值。
 如果想完全控制數字如何被轉換，可以使用 $string.format 。
 ]]
 
@@ -285,7 +289,7 @@ debug.setcstacklimit      =
 
 設定新的C堆疊限制。該限制控制Lua中巢狀呼叫的深度，以避免堆疊溢出。
 
-如果設定成功，該函式回傳之前的限制；否則回傳`false`。
+如果設定成功，該函式回傳之前的限制；否則回傳 `false`。
 ]]
 debug.setfenv             =
 '將 `table` 設定為 `object` 的環境。'
@@ -375,7 +379,7 @@ seekwhence['.end']          =
 '基點為檔案尾。'
 
 vbuf.no                     =
-'不緩衝；輸出操作立刻生效。'
+'不緩衝；輸出操作即時生效。'
 vbuf.full                   =
 '完全緩衝；只有在快取滿或呼叫 flush 時才做輸出操作。'
 vbuf.line                   =
@@ -445,9 +449,9 @@ openmode['.a+b']           =
 '追加更新模式，所有之前的資料都保留，只允許在檔案尾部做寫入。（二進制方式）'
 
 popenmode.r                =
-'從這個程式中讀取資料。（二進制方式）'
+'從這個程式讀取資料。（二進制方式）'
 popenmode.w                =
-'向這個程式寫入輸入。（二進制方式）'
+'向這個程式寫入資料。（二進制方式）'
 
 filetype.file              =
 '是一個打開的檔案控制代碼。'
@@ -493,7 +497,7 @@ math.ldexp                  =
 math.log['<5.1']            =
 '回傳 `x` 的自然對數。'
 math.log['>5.2']            =
-'回以指定底的 `x` 的對數。'
+'回傳指定底的 `x` 的對數。'
 math.log10                  =
 '回傳 `x` 的以10為底的對數。'
 math.max                    =
@@ -541,7 +545,7 @@ math.tointeger['>5.3']      =
 math.type['>5.3']           =
 '如果 `x` 是整數，回傳 `"integer"` ，如果它是浮點數，回傳 `"float"` ，如果 `x` 不是數字，回傳 `nil` 。'
 math.ult['>5.3']            =
-'整數 `m` 和 `n` 以無符號整數形式比較，如果 `m` 在 `n` 之下則回傳布林真，否則回傳假。'
+'整數 `m` 和 `n` 以無符號整數形式比較，如果 `m` 小於 `n` 則回傳布林真，否則回傳假。'
 
 os                          =
 ''
@@ -562,7 +566,7 @@ os.getenv                   =
 os.remove                   =
 '刪除指定名字的檔案。'
 os.rename                   =
-'將名字為 `oldname` 的檔案或目錄更名為 `newname`。'
+'將名字為 `oldname` 的檔案或資料夾重新命名為 `newname`。'
 os.setlocale                =
 '設定程式的目前區域。'
 os.time                     =
@@ -595,7 +599,7 @@ package                     =
 require['<5.3']             =
 '載入一個模組，回傳該模組的回傳值（ `nil` 時為 `true` ）。'
 require['>5.4']             =
-'載入一個模組，回傳該模組的回傳值（ `nil` 時為 `true` ）與搜尋器回傳的載入資料。預設搜尋器的載入資料指示了載入位置，對於檔案來説就是檔案路徑。'
+'載入一個模組，回傳該模組的回傳值（ `nil` 時為 `true` ）與搜尋器回傳的載入資料。預設搜尋器的載入資料指示了載入位置，對於檔案來說就是檔案路徑。'
 
 package.config              =
 '一個描述一些為包管理準備的編譯時期組態的字串。'
@@ -623,7 +627,7 @@ string                      =
 string.byte                 =
 '回傳字元 `s[i]` 、 `s[i+1]` ... `s[j]` 的內部數字編碼。'
 string.char                 =
-'接收零或更多的整數，回傳和引數數量相同長度的字串。其中每個字元的內部編碼值等於對應的引數值。'
+'回傳和引數數量相同長度的字串。其中每個字元的內部編碼值等於對應的引數值。'
 string.dump                 =
 '回傳包含有以二進制方式表示的（一個 *二進制程式碼區塊* ）指定函式的字串。'
 string.find                 =
@@ -632,7 +636,7 @@ string.format               =
 '回傳不定數量引數的格式化版本，格式化字串為第一個引數。'
 string.gmatch               =
 [[
-回傳一個疊代器函式。每次呼叫這個函式都會繼續以 `pattern` （參見　§6.4.1）對 s 做配對，並回傳所有捕獲到的值。
+回傳一個疊代器函式。每次呼叫這個函式都會繼續以 `pattern` （參見 §6.4.1）對 s 做配對，並回傳所有捕獲到的值。
 
 下面這個例子會循環疊代字串 s 中所有的單詞， 並逐行列印：
 ```lua
@@ -644,7 +648,7 @@ string.gmatch               =
 ```
 ]]
 string.gsub                 =
-'將字串 s 中，所有的（或是在 n 給出時的前 n 個） `pattern` （參見 §6.4.1）都替換成 `repl` ，並回傳其副本。'
+'將字串 s 中，所有的（或是有提供 n 時的前 n 個） `pattern` （參見 §6.4.1）都替換成 `repl` ，並回傳其副本。'
 string.len                  =
 '回傳其長度。'
 string.lower                =
@@ -656,11 +660,11 @@ string.pack                 =
 string.packsize             =
 [[回傳以指定格式用 $string.pack 壓縮的字串的長度。格式化字串中不可以有變長選項 's' 或 'z' （參見 §6.4.2）。]]
 string.rep['>5.2']          =
-'回傳 `n` 個字串 `s` 以字串 `sep` 為分割符連在一起的字串。預設的 `sep` 值為空字串（即沒有分割符）。如果 `n` 不是正數則回傳空字串。'
+'回傳 `n` 個由字串 `s` 以字串 `sep` 為分割符連在一起的字串。預設的 `sep` 值為空字串（即沒有分割符）。如果 `n` 不是正數則回傳空字串。'
 string.rep['<5.1']          =
-'回傳 `n` 個字串 `s` 連在一起的字串。如果 `n` 不是正數則回傳空字串。'
+'回傳 `n` 個由字串 `s` 連在一起的字串。如果 `n` 不是正數則回傳空字串。'
 string.reverse              =
-'回傳字串 s 的反轉字串。'
+'回傳字串 `s` 的反轉字串。'
 string.sub                  =
 '回傳一個從 `i` 開始並在 `j` 結束的子字串。'
 string.unpack               =
@@ -700,9 +704,9 @@ table.unpack                =
 i 預設為 1 ， j 預設為 #list。
 ]]
 table.foreach               =
-'走訪表中的每一個元素，並以key和value執行回呼函式。如果回呼函式回傳一個非nil值則循環終止，並且回傳這個值。該函式等同pair(list)，比pair(list)更慢。不推薦使用。'
+'走訪表中的每一個元素，並以key和value執行回呼函式。如果回呼函式回傳一個非nil值則終止迴圈，並且回傳這個值。該函式等同pair(list)，比pair(list)更慢，不推薦使用。'
 table.foreachi              =
-'走訪表中的每一個元素，並以索引號index和value執行回呼函式。如果回呼函式回傳一個非nil值則循環終止，並且回傳這個值。該函式等同ipair(list)，比ipair(list)更慢。不推薦使用。'
+'走訪表中的每一個元素，並以索引號index和value執行回呼函式。如果回呼函式回傳一個非nil值則終止迴圈，並且回傳這個值。該函式等同ipair(list)，比ipair(list)更慢，不推薦使用。'
 table.getn                  =
 '回傳表的長度。該函式等價於#list。'
 table.new                   =
diff --git a/locale/zh-tw/script.lua b/locale/zh-tw/script.lua
index e2618f374..27613739c 100644
--- a/locale/zh-tw/script.lua
+++ b/locale/zh-tw/script.lua
@@ -37,7 +37,7 @@ DIAG_OVER_MAX_ARGS      =
 DIAG_MISS_ARGS          =
 '函式最少接收 {:d} 個引數，但獲得了 {:d} 個。'
 DIAG_UNNECESSARY_ASSERT =
-'不必要的斷言：此表達式始終為真值。'
+'不必要的斷言：此陳述式始終為真。'
 DIAG_OVER_MAX_VALUES    =
 '只有 {} 個變數，但你設定了 {} 個值。'
 DIAG_AMBIGUITY_1        =
@@ -73,11 +73,11 @@ DIAG_DUPLICATE_SET_FIELD=
 DIAG_SET_CONST          =
 '不能對常數賦值。'
 DIAG_SET_FOR_STATE      =
-'修改了循環變數。'
+'修改了迴圈變數。'
 DIAG_CODE_AFTER_BREAK   =
 '無法執行到 `break` 後的程式碼。'
 DIAG_UNBALANCED_ASSIGNMENTS =
-'由於值的數量不夠而被賦值為了 `nil` 。在Lua中, `x, y = 1` 等價於 `x, y = 1, nil` 。'
+'由於值的數量不夠而賦值了 `nil` 。在Lua中, `x, y = 1` 等價於 `x, y = 1, nil` 。'
 DIAG_REQUIRE_LIKE       =
 '你可以在設定中將 `{}` 視為 `require`。'
 DIAG_COSE_NON_OBJECT    =
@@ -116,22 +116,22 @@ DIAG_UNDEFINED_DOC_NAME               =
 '未定義的類型或別名 `{}`。'
 DIAG_UNDEFINED_DOC_PARAM              =
 '指向了未定義的參數 `{}`。'
-DIAG_MISSING_GLOBAL_DOC_COMMENT       = -- TODO: need translate!
-'Missing comment for global function `{}`.'
-DIAG_MISSING_GLOBAL_DOC_PARAM         = -- TODO: need translate!
-'Missing @param annotation for parameter `{}` in global function `{}`.'
-DIAG_MISSING_GLOBAL_DOC_RETURN        = -- TODO: need translate!
-'Missing @return annotation at index `{}` in global function `{}`.'
-DIAG_MISSING_LOCAL_EXPORT_DOC_COMMENT = -- TODO: need translate!
-'Missing comment for exported local function `{}`.'
-DIAG_MISSING_LOCAL_EXPORT_DOC_PARAM   = -- TODO: need translate!
-'Missing @param annotation for parameter `{}` in exported local function `{}`.'
-DIAG_MISSING_LOCAL_EXPORT_DOC_RETURN  = -- TODO: need translate!
-'Missing @return annotation at index `{}` in exported local function `{}`.'
-DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM   = -- TODO: need translate!
-'Incomplete signature. Missing @param annotation for parameter `{}`.'
-DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN  = -- TODO: need translate!
-'Incomplete signature. Missing @return annotation at index `{}`.'
+DIAG_MISSING_GLOBAL_DOC_COMMENT       =
+'全域函式 `{}` 缺少註解。'
+DIAG_MISSING_GLOBAL_DOC_PARAM         =
+'全域函式 `{2}` 的參數 `{1}` 缺少 @param 標註。'
+DIAG_MISSING_GLOBAL_DOC_RETURN        =
+'全域函式 `{2}` 的第 `{1}` 個回傳值缺少 @return 標註。'
+DIAG_MISSING_LOCAL_EXPORT_DOC_COMMENT =
+'輸出的區域函式 `{}` 缺少註解。'
+DIAG_MISSING_LOCAL_EXPORT_DOC_PARAM   =
+'輸出的區域函式 `{2}` 的參數 `{1}` 缺少 @param 標註。'
+DIAG_MISSING_LOCAL_EXPORT_DOC_RETURN  =
+'輸出的區域函式 `{2}` 的第 {1} 個回傳值缺少 @return 標註。'
+DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM   =
+'簽名不完整。參數 `{1}` 缺少 @param 標註。'
+DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN  =
+'簽名不完整。第 {1} 個回傳值缺少 @return 標註。'
 DIAG_UNKNOWN_DIAG_CODE                =
 '未知的診斷代碼 `{}`。'
 DIAG_CAST_LOCAL_TYPE                  =
@@ -158,35 +158,35 @@ DIAG_MISSING_RETURN                   =
 '此處需要回傳值。'
 DIAG_RETURN_TYPE_MISMATCH             =
 '第 {index} 個回傳值的類型為 `{def}` ，但實際回傳的是 `{ref}`。\n{err}'
-DIAG_UNKNOWN_OPERATOR                 = -- TODO: need translate!
-'Unknown operator `{}`.'
-DIAG_UNREACHABLE_CODE                 = -- TODO: need translate!
-'Unreachable code.'
-DIAG_INVISIBLE_PRIVATE                = -- TODO: need translate!
-'Field `{field}` is private, it can only be accessed in class `{class}`.'
-DIAG_INVISIBLE_PROTECTED              = -- TODO: need translate!
-'Field `{field}` is protected, it can only be accessed in class `{class}` and its subclasses.'
-DIAG_INVISIBLE_PACKAGE                = -- TODO: need translate!
-'Field `{field}` can only be accessed in same file `{uri}`.'
-DIAG_GLOBAL_ELEMENT                  = -- TODO: need translate!
-'Element is global.'
-DIAG_MISSING_FIELDS                   = -- TODO: need translate!
-'Missing required fields in type `{1}`: {2}'
-DIAG_INJECT_FIELD                     = -- TODO: need translate!
-'Fields cannot be injected into the reference of `{class}` for `{field}`. {fix}'
-DIAG_INJECT_FIELD_FIX_CLASS           = -- TODO: need translate!
-'To do so, use `---@class` for `{node}`.'
-DIAG_INJECT_FIELD_FIX_TABLE           = -- TODO: need translate!
-'如要允许注入，请在定义中添加 `{fix}` 。'
+DIAG_UNKNOWN_OPERATOR                 =
+'未知的運算子 `{}`。'
+DIAG_UNREACHABLE_CODE                 =
+'無法到達的程式碼。'
+DIAG_INVISIBLE_PRIVATE                =
+'欄位 `{field}` 是私有層級，只能在 `{class}` 類別中才能存取。'
+DIAG_INVISIBLE_PROTECTED              =
+'欄位 `{field}` 是保護層級，只能在 `{class}` 類別及其子類別中才能存取。'
+DIAG_INVISIBLE_PACKAGE                =
+'欄位 `{field}` 只能在同樣的檔案 `{uri}` 中存取。'
+DIAG_GLOBAL_ELEMENT                   =
+'全域元素。'
+DIAG_MISSING_FIELDS                   =
+'缺少類型 `{1}` 的必要欄位： {2}'
+DIAG_INJECT_FIELD                     =
+'不能在 `{class}` 的引用中注入欄位 `{field}` 。{fix}'
+DIAG_INJECT_FIELD_FIX_CLASS           =
+'如果要允許注入，請對 `{node}` 使用 `{fix}` 。'
+DIAG_INJECT_FIELD_FIX_TABLE           =
+'如果要允許注入，請在定義中添加 `{fix}` 。'
 
 MWS_NOT_SUPPORT         =
-'{} 目前還不支援多工作目錄，我可能需要重新啟動才能支援新的工作目錄...'
+'{} 目前還不支援多工作目錄，我可能需要重新啟動才能支援新的工作目錄…'
 MWS_RESTART             =
 '重新啟動'
 MWS_NOT_COMPLETE        =
-'工作目錄還沒有準備好，你可以稍後再試一下...'
+'工作目錄還沒有準備好，你可以稍後再試一下…'
 MWS_COMPLETE            =
-'工作目錄準備好了，你可以再試一下了...'
+'工作目錄準備好了，你可以再試一下了'
 MWS_MAX_PRELOAD         =
 '預載入檔案數已達上限（{}），你需要手動打開需要載入的檔案。'
 MWS_UCONFIG_FAILED      =
@@ -206,13 +206,13 @@ WORKSPACE_SKIP_HUGE_FILE  =
 '出於效能考慮，已停止對此檔案解析：{}'
 WORKSPACE_NOT_ALLOWED     =
 '你的工作目錄被設定為了 `{}` ，Lua語言伺服拒絕載入此目錄，請檢查你的設定檔。[了解更多](https://luals.github.io/wiki/faq#why-is-the-server-scanning-the-wrong-folder)'
-WORKSPACE_SCAN_TOO_MUCH   = -- TODO: need translate!
-'已掃描了超過 {} 個檔案，目前掃描的目錄為 `{}`. Please see the [FAQ](https://luals.github.io/wiki/faq#how-can-i-improve-startup-speeds) to see how you can include fewer files. It is also possible that your [configuration is incorrect](https://luals.github.io/wiki/faq#why-is-the-server-scanning-the-wrong-folder).'
+WORKSPACE_SCAN_TOO_MUCH   =
+'已掃描了超過 {} 個檔案，目前掃描的目錄為 `{}`。請檢視[FAQ](https://luals.github.io/wiki/faq#how-can-i-improve-startup-speeds)以便了解你要如何引入更少檔案。也有可能你的[組態是錯的](https://luals.github.io/wiki/faq#why-is-the-server-scanning-the-wrong-folder)。'
 
 PARSER_CRASH            =
 '語法解析崩潰了！遺言：{}'
 PARSER_UNKNOWN          =
-'未知語法錯誤...'
+'未知語法錯誤…'
 PARSER_MISS_NAME        =
 '缺少名稱。'
 PARSER_UNKNOWN_SYMBOL   =
@@ -238,13 +238,13 @@ PARSER_MISS_FIELD       =
 PARSER_MISS_METHOD      =
 '缺少方法名。'
 PARSER_ARGS_AFTER_DOTS  =
-'`...`必須是最後一個引數。'
+'`...` 必須是最後一個引數。'
 PARSER_KEYWORD          =
 '關鍵字無法作為名稱。'
 PARSER_EXP_IN_ACTION    =
 '該表達式不能作為敘述。'
 PARSER_BREAK_OUTSIDE    =
-'`break`必須在循環內部。'
+'`break`必須在迴圈內部。'
 PARSER_MALFORMED_NUMBER =
 '無法構成有效數字。'
 PARSER_ACTION_AFTER_RETURN =
@@ -258,7 +258,7 @@ PARSER_REDEFINE_LABEL   =
 PARSER_UNSUPPORT_SYMBOL =
 '{version} 不支援該符號。'
 PARSER_UNEXPECT_DOTS    =
-'`...`只能在不定參函式中使用。'
+'`...` 只能在不定參函式中使用。'
 PARSER_UNEXPECT_SYMBOL  =
 '未知的符號 `{symbol}` 。'
 PARSER_UNKNOWN_TAG      =
@@ -303,14 +303,14 @@ PARSER_INDEX_IN_FUNC_NAME =
 '命名函式的名稱中不能使用 `[name]` 形式。'
 PARSER_UNKNOWN_ATTRIBUTE  =
 '區域變數屬性應該是 `const` 或 `close` 。'
-PARSER_AMBIGUOUS_SYNTAX   = -- TODO: need translate!
-'在 Lua 5.1 中，函数调用的左括号必须与函数在同一行。'
-PARSER_NEED_PAREN         = -- TODO: need translate!
-'需要添加一对括号。'
-PARSER_NESTING_LONG_MARK  = -- TODO: need translate!
-'Nesting of `[[...]]` is not allowed in Lua 5.1 .'
-PARSER_LOCAL_LIMIT        = -- TODO: need translate!
-'Only 200 active local variables and upvalues can be existed at the same time.'
+PARSER_AMBIGUOUS_SYNTAX   =
+'在 Lua 5.1 中，呼叫函式的左括號和函式必須在同一行。'
+PARSER_NEED_PAREN         =
+'需要添加一對括號。'
+PARSER_NESTING_LONG_MARK  =
+'Lua 5.1 不允許使用巢狀的 `[[...]]` 。'
+PARSER_LOCAL_LIMIT        =
+'只能同時存在200個活躍的區域變數與上值。'
 PARSER_LUADOC_MISS_CLASS_NAME           =
 '缺少類別名稱。'
 PARSER_LUADOC_MISS_EXTENDS_SYMBOL       =
@@ -456,10 +456,10 @@ ACTION_MARK_ASYNC       =
 '將目前函式標記為非同步。'
 ACTION_ADD_DICT         =
 '添加 \'{}\' 到工作區字典'
-ACTION_FIX_ADD_PAREN    = -- TODO: need translate!
-'添加括号。'
-ACTION_AUTOREQUIRE      = -- TODO: need translate!
-"Import '{}' as {}"
+ACTION_FIX_ADD_PAREN    =
+'添加括號。'
+ACTION_AUTOREQUIRE      =
+"引入 '{}' 作為 {}"
 
 COMMAND_DISABLE_DIAG       =
 '停用診斷'
@@ -481,8 +481,8 @@ COMMAND_JSON_TO_LUA_FAILED =
 'JSON 轉 Lua 失敗：{}'
 COMMAND_ADD_DICT           =
 '添加單字到字典裡'
-COMMAND_REFERENCE_COUNT    = -- TODO: need translate!
-'{} references'
+COMMAND_REFERENCE_COUNT    =
+'{} 個參考'
 
 COMPLETION_IMPORT_FROM           =
 '從 {} 中匯入'
@@ -501,31 +501,31 @@ WINDOW_COMPILING                 =
 WINDOW_DIAGNOSING                =
 '正在診斷'
 WINDOW_INITIALIZING              =
-'正在初始化...'
+'正在初始化…'
 WINDOW_PROCESSING_HOVER          =
-'正在處理懸浮提示...'
+'正在處理懸浮提示…'
 WINDOW_PROCESSING_DEFINITION     =
-'正在處理轉到定義...'
+'正在處理轉到定義…'
 WINDOW_PROCESSING_REFERENCE      =
-'正在處理轉到引用...'
+'正在處理轉到引用…'
 WINDOW_PROCESSING_RENAME         =
-'正在處理重新命名...'
+'正在處理重新命名…'
 WINDOW_PROCESSING_COMPLETION     =
-'正在處理自動完成...'
+'正在處理自動完成…'
 WINDOW_PROCESSING_SIGNATURE      =
-'正在處理參數提示...'
+'正在處理參數提示…'
 WINDOW_PROCESSING_SYMBOL         =
-'正在處理檔案符號...'
+'正在處理檔案符號…'
 WINDOW_PROCESSING_WS_SYMBOL      =
-'正在處理工作區符號...'
+'正在處理工作區符號…'
 WINDOW_PROCESSING_SEMANTIC_FULL  =
-'正在處理全量語義著色...'
+'正在處理全量語義著色…'
 WINDOW_PROCESSING_SEMANTIC_RANGE =
-'正在處理差量語義著色...'
+'正在處理差量語義著色…'
 WINDOW_PROCESSING_HINT           =
-'正在處理內嵌提示...'
-WINDOW_PROCESSING_BUILD_META     = -- TODO: need translate!
-'Processing build meta...'
+'正在處理內嵌提示…'
+WINDOW_PROCESSING_BUILD_META     =
+'正在處理編譯器中繼資料…'
 WINDOW_INCREASE_UPPER_LIMIT      =
 '增加上限'
 WINDOW_CLOSE                     =
@@ -582,15 +582,15 @@ WINDOW_APPLY_WHITOUT_SETTING     =
 WINDOW_ASK_APPLY_LIBRARY         =
 '是否需要將你的工作環境配置為 `{}` ？'
 WINDOW_SEARCHING_IN_FILES        =
-'正在檔案中搜尋...'
-WINDOW_CONFIG_LUA_DEPRECATED     = -- TODO: need translate!
-'`config.lua` is deprecated, please use `config.json` instead.'
-WINDOW_CONVERT_CONFIG_LUA        = -- TODO: need translate!
-'Convert to `config.json`'
-WINDOW_MODIFY_REQUIRE_PATH       = -- TODO: need translate!
-'Do you want to modify the require path?'
-WINDOW_MODIFY_REQUIRE_OK         = -- TODO: need translate!
-'Modify'
+'正在檔案中搜尋…'
+WINDOW_CONFIG_LUA_DEPRECATED     =
+'`config.lua` 已棄用，請改用 `config.json` 。'
+WINDOW_CONVERT_CONFIG_LUA        =
+'轉換為 `config.json`'
+WINDOW_MODIFY_REQUIRE_PATH       =
+'你想要修改 `require` 的路徑嗎？'
+WINDOW_MODIFY_REQUIRE_OK         =
+'修改'
 
 CONFIG_LOAD_FAILED               =
 '無法讀取設定檔案：{}'
@@ -598,22 +598,22 @@ CONFIG_LOAD_ERROR                =
 '設定檔案載入錯誤：{}'
 CONFIG_TYPE_ERROR                =
 '設定檔案必須是lua或json格式：{}'
-CONFIG_MODIFY_FAIL_SYNTAX_ERROR  = -- TODO: need translate!
-'Failed to modify settings, there are syntax errors in the settings file: {}'
-CONFIG_MODIFY_FAIL_NO_WORKSPACE  = -- TODO: need translate!
+CONFIG_MODIFY_FAIL_SYNTAX_ERROR  =
+'修改設定失敗，設定檔中有語法錯誤：{}'
+CONFIG_MODIFY_FAIL_NO_WORKSPACE  =
 [[
-Failed to modify settings:
-* The current mode is single-file mode, server cannot create `.luarc.json` without workspace.
-* The language client dose not support modifying settings from the server side.
+修改設定失敗：
+* 目前模式為單一檔案模式，伺服器只能在工作區中新增 `.luarc.json` 檔案。
+* 語言用戶端不支援從伺服端修改設定。
 
-Please modify following settings manually:
+請手動修改以下設定：
 {}
 ]]
-CONFIG_MODIFY_FAIL               = -- TODO: need translate!
+CONFIG_MODIFY_FAIL               =
 [[
-Failed to modify settings
+修改設定失敗
 
-Please modify following settings manually:
+請手動修改以下設定：
 {}
 ]]
 
@@ -645,58 +645,58 @@ CLI_CHECK_ERROR_URI =
 CLI_CHECK_ERROR_LEVEL =
 'checklevel 必須是這些值之一：{}'
 CLI_CHECK_INITING =
-'正在初始化...'
+'正在初始化…'
 CLI_CHECK_SUCCESS =
 '診斷完成，沒有發現問題'
-CLI_CHECK_PROGRESS = -- TODO: need translate!
-'Found {} problems in {} files'
+CLI_CHECK_PROGRESS =
+'在檔案 {2} 中檢測到問題 {1}'
 CLI_CHECK_RESULTS_OUTPATH =
 '診斷完成，共有 {} 個問題，請查看 {}'
 CLI_CHECK_RESULTS_PRETTY =
 '診斷完成，共有 {} 個問題'
-CLI_CHECK_MULTIPLE_WORKERS = -- TODO: need translate!
-'Starting {} worker tasks, progress output will be disabled. This may take a few minutes.'
-CLI_DOC_INITING   = -- TODO: need translate!
-'Loading documents ...'
-CLI_DOC_DONE      = -- TODO: need translate!
-'Document exporting completed!'
+CLI_CHECK_MULTIPLE_WORKERS =
+'開始 {} 個工作任務，將會停用進度輸出。這可能會花費幾分鐘。'
+CLI_DOC_INITING   =
+'文件載入中…'
+CLI_DOC_DONE      =
+'文件輸出完成！'
 CLI_DOC_WORKING   =
-'正在產生文件...'
-
-TYPE_ERROR_ENUM_GLOBAL_DISMATCH = -- TODO: need translate!
-'Type `{child}` cannot match enumeration type of `{parent}`'
-TYPE_ERROR_ENUM_GENERIC_UNSUPPORTED = -- TODO: need translate!
-'Cannot use generic `{child}` in enumeration'
-TYPE_ERROR_ENUM_LITERAL_DISMATCH = -- TODO: need translate!
-'Literal `{child}` cannot match the enumeration value of `{parent}`'
-TYPE_ERROR_ENUM_OBJECT_DISMATCH = -- TODO: need translate!
-'The object `{child}` cannot match the enumeration value of `{parent}`. They must be the same object'
-TYPE_ERROR_ENUM_NO_OBJECT = -- TODO: need translate!
-'The passed in enumeration value `{child}` is not recognized'
-TYPE_ERROR_INTEGER_DISMATCH = -- TODO: need translate!
-'Literal `{child}` cannot match integer `{parent}`'
-TYPE_ERROR_STRING_DISMATCH = -- TODO: need translate!
-'Literal `{child}` cannot match string `{parent}`'
-TYPE_ERROR_BOOLEAN_DISMATCH = -- TODO: need translate!
-'Literal `{child}` cannot match boolean `{parent}`'
-TYPE_ERROR_TABLE_NO_FIELD = -- TODO: need translate!
-'Field `{key}` does not exist in the table'
-TYPE_ERROR_TABLE_FIELD_DISMATCH = -- TODO: need translate!
-'The type of field `{key}` is `{child}`, which cannot match `{parent}`'
-TYPE_ERROR_CHILD_ALL_DISMATCH = -- TODO: need translate!
-'All subtypes in `{child}` cannot match `{parent}`'
-TYPE_ERROR_PARENT_ALL_DISMATCH = -- TODO: need translate!
-'`{child}` cannot match any subtypes in `{parent}`'
-TYPE_ERROR_UNION_DISMATCH = -- TODO: need translate!
-'`{child}` cannot match `{parent}`'
-TYPE_ERROR_OPTIONAL_DISMATCH = -- TODO: need translate!
-'Optional type cannot match `{parent}`'
-TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER = -- TODO: need translate!
-'The number `{child}` cannot be converted to an integer'
-TYPE_ERROR_NUMBER_TYPE_TO_INTEGER = -- TODO: need translate!
-'Cannot convert number type to integer type'
-TYPE_ERROR_DISMATCH = -- TODO: need translate!
-'Type `{child}` cannot match `{parent}`'
+'正在產生文件…'
+
+TYPE_ERROR_ENUM_GLOBAL_DISMATCH =
+'類型 `{child}` 不符合 `{parent}` 的列舉類型'
+TYPE_ERROR_ENUM_GENERIC_UNSUPPORTED =
+'無法在列舉中使用泛型 `{child}`'
+TYPE_ERROR_ENUM_LITERAL_DISMATCH =
+'字面常數 `{child}` 不符合 `{parent}` 的列舉值'
+TYPE_ERROR_ENUM_OBJECT_DISMATCH =
+'物件 `{child}` 不符合 `{parent}` 的列舉值，它們必須是同一個物件'
+TYPE_ERROR_ENUM_NO_OBJECT =
+'無法識別傳入的列舉值 `{child}`'
+TYPE_ERROR_INTEGER_DISMATCH =
+'字面常數 `{child}` 不符合整數 `{parent}`'
+TYPE_ERROR_STRING_DISMATCH =
+'字面常數 `{child}` 不符合字串 `{parent}`'
+TYPE_ERROR_BOOLEAN_DISMATCH =
+'字面常數 `{child}` 不符合布林值 `{parent}`'
+TYPE_ERROR_TABLE_NO_FIELD =
+'表中不存在欄位 `{key}`'
+TYPE_ERROR_TABLE_FIELD_DISMATCH =
+'欄位 `{key}` 的類型是 `{child}`，無法匹配 `{parent}`'
+TYPE_ERROR_CHILD_ALL_DISMATCH =
+'`{child}` 的所有子類型皆無法匹配 `{parent}`'
+TYPE_ERROR_PARENT_ALL_DISMATCH =
+'`{child}` 無法匹配 `{parent}` 中的任何子類型'
+TYPE_ERROR_UNION_DISMATCH =
+'`{child}` 無法匹配 `{parent}`'
+TYPE_ERROR_OPTIONAL_DISMATCH =
+'可選類型不符合 `{parent}`'
+TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER =
+'無法將數字 `{child}` 轉換成整數'
+TYPE_ERROR_NUMBER_TYPE_TO_INTEGER =
+'無法將數字類型轉換為整數類型'
+TYPE_ERROR_DISMATCH =
+'類型 `{child}` 無法匹配 `{parent}`'
 
 LUADOC_DESC_CLASS =
 [=[
@@ -980,7 +980,7 @@ function concat(...) end
 ]=]
 LUADOC_DESC_OVERLOAD =
 [=[
-允許定義多個函數簽章。
+允許定義多個函式簽章。
 
 ## 語法
 `---@overload fun(<name>[: <type>] [, <name>[: <type>]]...)[: <type>[, <type>]...]`
@@ -1152,15 +1152,15 @@ print(x) --> table
 ---
 [檢視文件](https://luals.github.io/wiki/annotations#cast)
 ]=]
-LUADOC_DESC_OPERATOR = -- TODO: need translate!
+LUADOC_DESC_OPERATOR =
 [=[
-Provide type declaration for [operator metamethods](http://lua-users.org/wiki/MetatableEvents).
+為 [運算子元方法](http://lua-users.org/wiki/MetatableEvents) 提供類型聲明
 
-## Syntax
+## 語法
 `@operator <operation>[(input_type)]:<resulting_type>`
 
-## Usage
-### Vector Add Metamethod
+## 用法
+### 向量加法元方法
 ```
 ---@class Vector
 ---@operator add(Vector):Vector
@@ -1171,7 +1171,7 @@ vB = Vector.new(10, 20, 30)
 vC = vA + vB
 --> Vector
 ```
-### Unary Minus
+### 一元減法
 ```
 ---@class Passcode
 ---@operator unm:integer
@@ -1180,18 +1180,17 @@ pA = Passcode.new(1234)
 pB = -pA
 --> integer
 ```
-[View Request](https://github.com/LuaLS/lua-language-server/issues/599)
+[檢視請求](https://github.com/LuaLS/lua-language-server/issues/599)
 ]=]
-LUADOC_DESC_ENUM = -- TODO: need translate!
+LUADOC_DESC_ENUM =
 [=[
-Mark a table as an enum. If you want an enum but can't define it as a Lua
-table, take a look at the [`@alias`](https://luals.github.io/wiki/annotations#alias)
-tag.
+將表標記為列舉。如果你想要一個列舉但是無法將其定義為 Lua 表，看一眼 [`@alias`](https://luals.github.io/wiki/annotations#alias)
+標籤。
 
-## Syntax
+## 語法
 `@enum <name>`
 
-## Usage
+## 用法
 ```
 ---@enum colors
 local colors = {
@@ -1209,15 +1208,14 @@ local function setColor(color) end
 setColor(colors.green)
 ```
 ]=]
-LUADOC_DESC_SOURCE = -- TODO: need translate!
+LUADOC_DESC_SOURCE =
 [=[
-Provide a reference to some source code which lives in another file. When
-searching for the definition of an item, its `@source` will be used.
+提供一個其他檔案中原始碼的引用。當查找某一項的定義時，將會使用它的 `@source`。
 
-## Syntax
+## 語法
 `@source <path>`
 
-## Usage
+## 用法
 ```
 ---You can use absolute paths
 ---@source C:/Users/me/Documents/program/myFile.c
@@ -1236,15 +1234,14 @@ local c
 local d
 ```
 ]=]
-LUADOC_DESC_PACKAGE = -- TODO: need translate!
+LUADOC_DESC_PACKAGE =
 [=[
-Mark a function as private to the file it is defined in. A packaged function
-cannot be accessed from another file.
+將函式標註為其所處檔案的私有成員。一個打包的函式不可以被其他檔案存取。
 
-## Syntax
+## 語法
 `@package`
 
-## Usage
+## 用法
 ```
 ---@class Animal
 ---@field private eyes integer
@@ -1257,15 +1254,14 @@ function Animal:eyesCount()
 end
 ```
 ]=]
-LUADOC_DESC_PRIVATE = -- TODO: need translate!
+LUADOC_DESC_PRIVATE =
 [=[
-Mark a function as private to a @class. Private functions can be accessed only
-from within their class and are not accessible from child classes.
+將欄位標註為類別的私有成員。私有欄位僅可在其所屬的類別中存取，並且不能被子類別存取。
 
-## Syntax
+## 語法
 `@private`
 
-## Usage
+## 用法
 ```
 ---@class Animal
 ---@field private eyes integer
@@ -1283,15 +1279,14 @@ local myDog = {}
 myDog:eyesCount();
 ```
 ]=]
-LUADOC_DESC_PROTECTED = -- TODO: need translate!
+LUADOC_DESC_PROTECTED =
 [=[
-Mark a function as protected within a @class. Protected functions can be
-accessed only from within their class or from child classes.
+將欄位標註為類別的保護成員。保護欄位僅可在其所屬的類別或子類別中存取。
 
-## Syntax
+## 語法
 `@protected`
 
-## Usage
+## 用法
 ```
 ---@class Animal
 ---@field private eyes integer
diff --git a/locale/zh-tw/setting.lua b/locale/zh-tw/setting.lua
index 1bc254aa9..0c5a7c7bd 100644
--- a/locale/zh-tw/setting.lua
+++ b/locale/zh-tw/setting.lua
@@ -1,22 +1,24 @@
 ---@diagnostic disable: undefined-global
 
-config.addonManager.enable        = -- TODO: need translate!
-"Whether the addon manager is enabled or not."
-config.addonManager.repositoryBranch = -- TODO: need translate!
-"Specifies the git branch used by the addon manager."
-config.addonManager.repositoryPath = -- TODO: need translate!
-"Specifies the git path used by the addon manager."
+config.addonManager.enable        =
+"是否啟用延伸模組的附加插件管理器（Addon Manager）。"
+config.addonManager.repositoryBranch =
+"指定插件管理器（Addon Manager）使用的git branch。"
+config.addonManager.repositoryPath =
+"指定插件管理器（Addon Manager）使用的git path。"
+config.addonRepositoryPath        = -- TODO: need translate!
+"Specifies the addon repository path (not related to the addon manager)."
 config.runtime.version            =
 "Lua執行版本。"
 config.runtime.path               =
 [[
 當使用 `require` 時，如何根據輸入的名字來尋找檔案。
-此選項設定為 `?/init.lua` 意味著當你輸入 `require 'myfile'` 時，會從已載入的檔案中搜尋 `{workspace}/myfile/init.lua`。
+此選項設定為 `?/init.lua` 時，代表當你輸入 `require 'myfile'` 時，會從已載入的檔案中搜尋 `{workspace}/myfile/init.lua`。
 當 `runtime.pathStrict` 設定為 `false` 時，還會嘗試搜尋 `${workspace}/**/myfile/init.lua`。
 如果你想要載入工作區以外的檔案，你需要先設定 `Lua.workspace.library`。
 ]]
 config.runtime.pathStrict         =
-'啟用後 `runtime.path` 將只搜尋第一層目錄，見 `runtime.path` 的説明。'
+'啟用後 `runtime.path` 將只搜尋第一層目錄，見 `runtime.path` 的說明。'
 config.runtime.special            =
 [[將自訂全域變數視為一些特殊的內建變數，語言伺服將提供特殊的支援。
 下面這個例子表示將 `include` 視為 `require` 。
@@ -32,8 +34,8 @@ config.runtime.nonstandardSymbol  =
 "支援非標準的符號。請務必確認你的執行環境支援這些符號。"
 config.runtime.plugin             =
 "延伸模組路徑，請查閱[文件](https://luals.github.io/wiki/plugins)瞭解用法。"
-config.runtime.pluginArgs         = -- TODO: need translate!
-"Additional arguments for the plugin."
+config.runtime.pluginArgs         =
+"延伸模組的額外引數。"
 config.runtime.fileEncoding       =
 "檔案編碼，選項 `ansi` 只在 `Windows` 平台下有效。"
 config.runtime.builtin            =
@@ -52,8 +54,8 @@ config.diagnostics.disable        =
 "停用的診斷（使用浮框括號內的程式碼）。"
 config.diagnostics.globals        =
 "已定義的全域變數。"
-config.diagnostics.globalsRegex   = -- TODO: need translate!
-"Find defined global variables using regex."
+config.diagnostics.globalsRegex   =
+"使用正規表示式尋找全域變數。"
 config.diagnostics.severity       =
 [[
 修改診斷等級。
@@ -69,13 +71,13 @@ config.diagnostics.neededFileStatus =
 ]]
 config.diagnostics.groupSeverity  =
 [[
-批量修改一個組中的診斷等級。
+批次修改一個組中的診斷等級。
 設定為 `Fallback` 意味著組中的診斷由 `diagnostics.severity` 單獨設定。
 其他設定將覆蓋單獨設定，但是不會覆蓋以 `!` 結尾的設定。
 ]]
 config.diagnostics.groupFileStatus =
 [[
-批量修改一個組中的檔案狀態。
+批次修改一個組中的檔案狀態。
 
 * Opened:  只診斷打開的檔案
 * Any:     診斷所有檔案
@@ -84,14 +86,14 @@ config.diagnostics.groupFileStatus =
 設定為 `Fallback` 意味著組中的診斷由 `diagnostics.neededFileStatus` 單獨設定。
 其他設定將覆蓋單獨設定，但是不會覆蓋以 `!` 結尾的設定。
 ]]
-config.diagnostics.workspaceEvent = -- TODO: need translate!
-"Set the time to trigger workspace diagnostics."
-config.diagnostics.workspaceEvent.OnChange = -- TODO: need translate!
-"Trigger workspace diagnostics when the file is changed."
-config.diagnostics.workspaceEvent.OnSave = -- TODO: need translate!
-"Trigger workspace diagnostics when the file is saved."
-config.diagnostics.workspaceEvent.None = -- TODO: need translate!
-"Disable workspace diagnostics."
+config.diagnostics.workspaceEvent =
+"設定觸發工作區診斷的時機。"
+config.diagnostics.workspaceEvent.OnChange =
+"當檔案發生變化時觸發工作區診斷。"
+config.diagnostics.workspaceEvent.OnSave =
+"當儲存檔案時觸發工作區診斷。"
+config.diagnostics.workspaceEvent.None =
+"停用工作區診斷。"
 config.diagnostics.workspaceDelay =
 "進行工作區診斷的延遲（毫秒）。"
 config.diagnostics.workspaceRate  =
@@ -114,8 +116,8 @@ config.diagnostics.ignoredFiles.Disable  =
 "不診斷這些檔案。"
 config.diagnostics.disableScheme  =
 '不診斷使用以下 scheme 的lua檔案。'
-config.diagnostics.unusedLocalExclude = -- TODO: need translate!
-'Do not diagnose `unused-local` when the variable name matches the following pattern.'
+config.diagnostics.unusedLocalExclude =
+'如果變數名符合以下規則，則不對其進行 `unused-local` 診斷。'
 config.workspace.ignoreDir        =
 "忽略的檔案與目錄（使用 `.gitignore` 語法）。"
 config.workspace.ignoreSubmodules =
@@ -123,9 +125,9 @@ config.workspace.ignoreSubmodules =
 config.workspace.useGitIgnore     =
 "忽略 `.gitignore` 中列舉的檔案。"
 config.workspace.maxPreload       =
-"最大預載入檔案數。"
+"最大預先載入檔案數。"
 config.workspace.preloadFileSize  =
-"預載入時跳過大小大於該值（KB）的檔案。"
+"預先載入時跳過大小大於該值（KB）的檔案。"
 config.workspace.library          =
 "除了目前工作區以外，還會從哪些目錄中載入檔案。這些目錄中的檔案將被視作外部提供的程式碼庫，部分操作（如重新命名欄位）不會修改這些檔案。"
 config.workspace.checkThirdParty  =
@@ -174,7 +176,7 @@ config.completion.showWord.Fallback      =
 config.completion.showWord.Disable       =
 "不顯示上下文單詞。"
 config.completion.autoRequire            =
-"輸入內容看起來是個檔名時，自動 `require` 此檔案。"
+"輸入內容看起來像檔名時，自動 `require` 此檔案。"
 config.completion.showParams             =
 "在建議列表中顯示函式的參數資訊，函式擁有多個定義時會分開顯示。"
 config.completion.requireSeparator       =
@@ -186,7 +188,7 @@ config.color.mode                        =
 config.color.mode.Semantic               =
 "語義著色。你可能需要同時將 `editor.semanticHighlighting.enabled` 設定為 `true` 才能生效。"
 config.color.mode.SemanticEnhanced       =
-"增強的語義顏色。類似於`Semantic`，但會進行額外的分析（也會帶來額外的開銷）。"
+"增強的語義顏色。類似於 `Semantic` ，但會進行額外的分析（也會帶來額外的開銷）。"
 config.color.mode.Grammar                =
 "語法著色。"
 config.semantic.enable                   =
@@ -215,7 +217,7 @@ config.hover.enumsLimit                  =
 "當值對應多個類型時，限制類型的顯示數量。"
 config.hover.expandAlias                 =
 [[
-是否展開別名。例如 `---@alias myType boolean|number` 展開後顯示為 `boolean|number`，否則顯示為 `myType'。
+是否展開別名。例如 `---@alias myType boolean|number` 展開後顯示為 `boolean|number`，否則顯示為 `myType`'。
 ]]
 config.develop.enable                    =
 '開發者模式。請勿開啟，會影響效能。'
@@ -254,9 +256,9 @@ config.hint.arrayIndex.Auto              =
 config.hint.arrayIndex.Disable           =
 '停用陣列索引提示。'
 config.hint.await                        =
-'如果呼叫的函數被標記為了 `---@async`，則在呼叫處提示 `await`。'
+'如果呼叫的函式被標記為了 `---@async`，則在呼叫處提示 `await`。'
 config.hint.awaitPropagate               =
-'啟用 `await` 的傳播，當一個函數呼叫了一個 `---@async` 標記的函數時，會自動標記為 `---@async`。'
+'啟用 `await` 的傳播，當一個函式呼叫了一個 `---@async` 標記的函式時，會自動標記為 `---@async`。'
 config.hint.semicolon                    =
 '若陳述式尾部沒有分號，則顯示虛擬分號。'
 config.hint.semicolon.All                =
@@ -265,8 +267,8 @@ config.hint.semicolon.SameLine            =
 '兩個陳述式在同一行時，在它們之間顯示分號。'
 config.hint.semicolon.Disable            =
 '停用虛擬分號。'
-config.codeLens.enable                   = -- TODO: need translate!
-'Enable code lens.'
+config.codeLens.enable                   =
+'啟用CodeLens。'
 config.format.enable                     =
 '啟用程式碼格式化程式。'
 config.format.defaultConfig              =
@@ -277,49 +279,62 @@ config.format.defaultConfig              =
 config.spell.dict                        =
 '拼寫檢查的自訂單詞。'
 config.nameStyle.config                  = -- TODO: need translate!
-'Set name style config'
+[[
+設定檢查命名風格的組態。
+Read [formatter docs](https://github.com/CppCXY/EmmyLuaCodeStyle/tree/master/docs) to learn usage.
+]]
 config.telemetry.enable                  =
 [[
 啟用遙測，透過網路發送你的編輯器資訊與錯誤日誌。在[此處](https://luals.github.io/privacy/#language-server)閱讀我們的隱私聲明。
 ]]
 config.misc.parameters                   =
-'VSCode中啟動語言伺服時的[命令列參數](https://luals.github.io/wiki/usage#arguments)。'
-config.misc.executablePath               = -- TODO: need translate!
-'Specify the executable path in VSCode.'
-config.language.fixIndent                = -- TODO: need translate!
-'(VSCode only) Fix incorrect auto-indentation, such as incorrect indentation when line breaks occur within a string containing the word "function."'
-config.language.completeAnnotation       = -- TODO: need translate!
-'(VSCode only) Automatically insert "---@ " after a line break following a annotation.'
+'VSCode內啟動語言伺服時的[命令列參數](https://luals.github.io/wiki/usage#arguments)。'
+config.misc.executablePath               =
+'指定VSCode內的可執行文件'
+config.language.fixIndent                =
+'（僅限VSCode）修復自動縮排錯誤，例如在有包含 "function" 的字串中換行時出現的錯誤縮排。'
+config.language.completeAnnotation       =
+'（僅限VSCode）在註解後換行時自動插入 "---@ "。'
 config.type.castNumberToInteger          =
 '允許將 `number` 類型賦值給 `integer` 類型。'
 config.type.weakUnionCheck               =
 [[
 同位類型中只要有一個子類型滿足條件，則同位類型也滿足條件。
 
-此設定為 `false` 時，`number|boolean` 類型無法賦給 `number` 類型；為 `true` 時則可以。
+此設定為 `false` 時，`number|boolean` 類型無法賦值給 `number` 類型；為 `true` 時則可以。
 ]]
-config.type.weakNilCheck                 = -- TODO: need translate!
+config.type.weakNilCheck                 =
 [[
-When checking the type of union type, ignore the `nil` in it.
+對同位類型進行類型檢查時，忽略其中的 `nil`。
 
-When this setting is `false`, the `number|nil` type cannot be assigned to the `number` type. It can be with `true`.
+此設定為 `false` 時，`number|boolean` 類型無法賦值給 `number` 類型；為 `true` 時則可以。
 ]]
-config.type.inferParamType               = -- TODO: need translate!
+config.type.inferParamType               =
 [[
-未注释参数类型时，参数类型由函数传入参数推断。
+未註解參數類型時，參數類型由函式傳入參數推斷。
 
-如果设置为 "false"，则在未注释时，参数类型为 "any"。
+如果設定為 "false"，則在未註解時，參數類型為 "any"。
 ]]
-config.type.checkTableShape              = -- TODO: need translate!
+config.type.checkTableShape              =
 [[
-对表的形状进行严格检查。
+對表的形狀進行嚴格檢查。
 ]]
-config.doc.privateName                   = -- TODO: need translate!
-'Treat specific field names as private, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are private, witch can only be accessed in the class where the definition is located.'
-config.doc.protectedName                 = -- TODO: need translate!
-'Treat specific field names as protected, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are protected, witch can only be accessed in the class where the definition is located and its subclasses.'
-config.doc.packageName                   = -- TODO: need translate!
-'Treat specific field names as package, e.g. `m_*` means `XXX.m_id` and `XXX.m_type` are package, witch can only be accessed in the file where the definition is located.'
+config.type.inferTableSize               = -- TODO: need translate!
+'Maximum number of table fields analyzed during type inference.'
+config.doc.privateName                   =
+'將特定名稱的欄位視為private，例如 `m_*` 代表 `XXX.m_id` 和 `XXX.m_type` 會是私有層級，只能在定義所在的類別內存取'
+config.doc.protectedName                 =
+'將特定名稱的欄位視為protected，例如 `m_*` 代表 `XXX.m_id` 和 `XXX.m_type` 會是保護層級，只能在定義所在的類別和其子類別內存取'
+config.doc.packageName                   =
+'將特定名稱的欄位視為package，例如 `m_*` 代表 `XXX.m_id` 和 `XXX.m_type` 只能在定義所在的檔案內存取'
+config.doc.regengine                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
+config.doc.regengine.glob                = -- TODO: need translate!
+'The default lightweight pattern syntax.'
+config.doc.regengine.lua                 = -- TODO: need translate!
+'Full Lua-style regular expressions.'
+config.docScriptPath                     = -- TODO: need translate!
+'The regular expression engine used for matching documentation scope names.'
 config.diagnostics['unused-local']          =
 '未使用的區域變數'
 config.diagnostics['unused-function']       =
@@ -354,110 +369,110 @@ config.diagnostics['empty-block']           =
 '空程式碼區塊'
 config.diagnostics['redundant-value']       =
 '賦值操作時，值的數量比被賦值的對象多'
-config.diagnostics['assign-type-mismatch']  = -- TODO: need translate!
-'Enable diagnostics for assignments in which the value\'s type does not match the type of the assigned variable.'
-config.diagnostics['await-in-sync']         = -- TODO: need translate!
-'Enable diagnostics for calls of asynchronous functions within a synchronous function.'
-config.diagnostics['cast-local-type']    = -- TODO: need translate!
-'Enable diagnostics for casts of local variables where the target type does not match the defined type.'
-config.diagnostics['cast-type-mismatch']    = -- TODO: need translate!
-'Enable diagnostics for casts where the target type does not match the initial type.'
-config.diagnostics['circular-doc-class']    = -- TODO: need translate!
-'Enable diagnostics for two classes inheriting from each other introducing a circular relation.'
-config.diagnostics['close-non-object']      = -- TODO: need translate!
-'Enable diagnostics for attempts to close a variable with a non-object.'
-config.diagnostics['code-after-break']      = -- TODO: need translate!
-'Enable diagnostics for code placed after a break statement in a loop.'
-config.diagnostics['codestyle-check']       = -- TODO: need translate!
-'Enable diagnostics for incorrectly styled lines.'
-config.diagnostics['count-down-loop']       = -- TODO: need translate!
-'Enable diagnostics for `for` loops which will never reach their max/limit because the loop is incrementing instead of decrementing.'
-config.diagnostics['deprecated']            = -- TODO: need translate!
-'Enable diagnostics to highlight deprecated API.'
-config.diagnostics['different-requires']    = -- TODO: need translate!
-'Enable diagnostics for files which are required by two different paths.'
-config.diagnostics['discard-returns']       = -- TODO: need translate!
-'Enable diagnostics for calls of functions annotated with `---@nodiscard` where the return values are ignored.'
-config.diagnostics['doc-field-no-class']    = -- TODO: need translate!
-'Enable diagnostics to highlight a field annotation without a defining class annotation.'
-config.diagnostics['duplicate-doc-alias']   = -- TODO: need translate!
-'Enable diagnostics for a duplicated alias annotation name.'
-config.diagnostics['duplicate-doc-field']   = -- TODO: need translate!
-'Enable diagnostics for a duplicated field annotation name.'
-config.diagnostics['duplicate-doc-param']   = -- TODO: need translate!
-'Enable diagnostics for a duplicated param annotation name.'
-config.diagnostics['duplicate-set-field']   = -- TODO: need translate!
-'Enable diagnostics for setting the same field in a class more than once.'
-config.diagnostics['incomplete-signature-doc'] = -- TODO: need translate!
-'Incomplete @param or @return annotations for functions.'
-config.diagnostics['invisible']             = -- TODO: need translate!
-'Enable diagnostics for accesses to fields which are invisible.'
-config.diagnostics['missing-global-doc']    = -- TODO: need translate!
-'Missing annotations for globals! Global functions must have a comment and annotations for all parameters and return values.'
-config.diagnostics['missing-local-export-doc'] = -- TODO: need translate!
-'Missing annotations for exported locals! Exported local functions must have a comment and annotations for all parameters and return values.'
-config.diagnostics['missing-parameter']     = -- TODO: need translate!
-'Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.'
-config.diagnostics['missing-return']        = -- TODO: need translate!
-'Enable diagnostics for functions with return annotations which have no return statement.'
-config.diagnostics['missing-return-value']  = -- TODO: need translate!
-'Enable diagnostics for return statements without values although the containing function declares returns.'
-config.diagnostics['need-check-nil']        = -- TODO: need translate!
-'Enable diagnostics for variable usages if `nil` or an optional (potentially `nil`) value was assigned to the variable before.'
-config.diagnostics['unnecessary-assert']    = -- TODO: need translate!
-'Enable diagnostics for redundant assertions on truthy values.'
-config.diagnostics['no-unknown']            = -- TODO: need translate!
-'Enable diagnostics for cases in which the type cannot be inferred.'
-config.diagnostics['not-yieldable']         = -- TODO: need translate!
-'Enable diagnostics for calls to `coroutine.yield()` when it is not permitted.'
-config.diagnostics['param-type-mismatch']   = -- TODO: need translate!
-'Enable diagnostics for function calls where the type of a provided parameter does not match the type of the annotated function definition.'
-config.diagnostics['redundant-return']      = -- TODO: need translate!
-'Enable diagnostics for return statements which are not needed because the function would exit on its own.'
-config.diagnostics['redundant-return-value']= -- TODO: need translate!
-'Enable diagnostics for return statements which return an extra value which is not specified by a return annotation.'
-config.diagnostics['return-type-mismatch']  = -- TODO: need translate!
-'Enable diagnostics for return values whose type does not match the type declared in the corresponding return annotation.'
-config.diagnostics['spell-check']           = -- TODO: need translate!
-'Enable diagnostics for typos in strings.'
-config.diagnostics['name-style-check']      = -- TODO: need translate!
-'Enable diagnostics for name style.'
-config.diagnostics['unbalanced-assignments']= -- TODO: need translate!
-'Enable diagnostics on multiple assignments if not all variables obtain a value (e.g., `local x,y = 1`).'
-config.diagnostics['undefined-doc-class']   = -- TODO: need translate!
-'Enable diagnostics for class annotations in which an undefined class is referenced.'
-config.diagnostics['undefined-doc-name']    = -- TODO: need translate!
-'Enable diagnostics for type annotations referencing an undefined type or alias.'
-config.diagnostics['undefined-doc-param']   = -- TODO: need translate!
-'Enable diagnostics for cases in which a parameter annotation is given without declaring the parameter in the function definition.'
-config.diagnostics['undefined-field']       = -- TODO: need translate!
-'Enable diagnostics for cases in which an undefined field of a variable is read.'
-config.diagnostics['unknown-cast-variable'] = -- TODO: need translate!
-'Enable diagnostics for casts of undefined variables.'
-config.diagnostics['unknown-diag-code']     = -- TODO: need translate!
-'Enable diagnostics in cases in which an unknown diagnostics code is entered.'
-config.diagnostics['unknown-operator']      = -- TODO: need translate!
-'Enable diagnostics for unknown operators.'
-config.diagnostics['unreachable-code']      = -- TODO: need translate!
-'Enable diagnostics for unreachable code.'
-config.diagnostics['global-element']       = -- TODO: need translate!
-'Enable diagnostics to warn about global elements.'
-config.typeFormat.config                    = -- TODO: need translate!
-'Configures the formatting behavior while typing Lua code.'
-config.typeFormat.config.auto_complete_end  = -- TODO: need translate!
-'Controls if `end` is automatically completed at suitable positions.'
-config.typeFormat.config.auto_complete_table_sep = -- TODO: need translate!
-'Controls if a separator is automatically appended at the end of a table declaration.'
-config.typeFormat.config.format_line        = -- TODO: need translate!
-'Controls if a line is formatted at all.'
+config.diagnostics['assign-type-mismatch']  =
+'賦值類型與變數類型不符合'
+config.diagnostics['await-in-sync']         =
+'同步函式中呼叫非同步函式'
+config.diagnostics['cast-local-type']    =
+'已顯式定義變數類型不符合要定義的值的類型'
+config.diagnostics['cast-type-mismatch']    =
+'變數被轉換為不符合其初始類型的類型'
+config.diagnostics['circular-doc-class']    =
+'兩個類別互相繼承、循環'
+config.diagnostics['close-non-object']      =
+'嘗試關閉非物件變數'
+config.diagnostics['code-after-break']      =
+'迴圈內break陳述式後的程式碼'
+config.diagnostics['codestyle-check']       =
+'行的格式不正確'
+config.diagnostics['count-down-loop']       =
+'因為 `for` 迴圈是遞增而不是遞減，所以不會到達上限/極限'
+config.diagnostics['deprecated']            =
+'API已標記deprecated（棄用）但仍在使用'
+config.diagnostics['different-requires']    =
+'required的同一個檔案使用了兩個不同的名字'
+config.diagnostics['discard-returns']       =
+'忽略了標註為 `@nodiscard` 的函式的回傳值'
+config.diagnostics['doc-field-no-class']    =
+'向沒有標註 `@class` 的類別標註 `@field` 欄位'
+config.diagnostics['duplicate-doc-alias']   =
+'`@alias` 標註名字衝突'
+config.diagnostics['duplicate-doc-field']   =
+'`@field` 標註名字衝突'
+config.diagnostics['duplicate-doc-param']   =
+'`@param` 標註名字衝突'
+config.diagnostics['duplicate-set-field']   =
+'在類別中多次定義相同的欄位'
+config.diagnostics['incomplete-signature-doc'] =
+'`@param` 或 `@return` 不完整'
+config.diagnostics['invisible']             =
+'嘗試存取不可見的欄位'
+config.diagnostics['missing-global-doc']    =
+'全域變數缺少標註（全域函式必須為所有參數和回傳值提供標註）'
+config.diagnostics['missing-local-export-doc'] =
+'匯出的區域函式缺少標註（匯出的區域函式、所有的參數和回傳值都必須有標註）'
+config.diagnostics['missing-parameter']     =
+'函式呼叫的引數數量比函式標註的參數數量少'
+config.diagnostics['missing-return']        =
+'函式有 `@return` 標註卻沒有 `return` 陳述式'
+config.diagnostics['missing-return-value']  =
+'函式沒有回傳值，但使用了 `@return` 標註了回傳值'
+config.diagnostics['need-check-nil']        =
+'變數曾被賦值為 `nil` 或可選值（可能是 `nil` ）'
+config.diagnostics['unnecessary-assert']    =
+'對始終為true的陳述式的冗餘斷言'
+config.diagnostics['no-unknown']            =
+'無法推斷變數的未知類型'
+config.diagnostics['not-yieldable']         =
+'不允許呼叫 `coroutine.yield()`'
+config.diagnostics['param-type-mismatch']   =
+'給定參數的類型不符合函式定義所要求的類型（ `@param` ）'
+config.diagnostics['redundant-return']      =
+'放了一個不需要的 `return` 陳述式，因為函式會自行退出'
+config.diagnostics['redundant-return-value']=
+'回傳了 `@return` 標註未指定的額外值'
+config.diagnostics['return-type-mismatch']  =
+'回傳值的類型不符合 `@return` 中宣告的類型'
+config.diagnostics['spell-check']           =
+'字串拼寫檢查'
+config.diagnostics['name-style-check']      =
+'變數命名風格檢查'
+config.diagnostics['unbalanced-assignments']=
+'多重賦值時沒有賦值所有變數（如 `local x,y = 1` ）'
+config.diagnostics['undefined-doc-class']   =
+'在 `@class` 標註中引用未定義的類別。'
+config.diagnostics['undefined-doc-name']    =
+'在 `@type` 標註中引用未定義的類型或 `@alias`'
+config.diagnostics['undefined-doc-param']   =
+'在 `@param` 標註中引用函式定義未宣告的參數'
+config.diagnostics['undefined-field']       =
+'讀取變數中為定義的欄位'
+config.diagnostics['unknown-cast-variable'] =
+'使用 `@cast` 對未定義的變數進行強制轉換'
+config.diagnostics['unknown-diag-code']     =
+'輸入了未知的診斷'
+config.diagnostics['unknown-operator']      =
+'未知的運算子'
+config.diagnostics['unreachable-code']      =
+'無法到達的程式碼'
+config.diagnostics['global-element']       =
+'對全域元素的警告'
+config.typeFormat.config                    =
+'寫Lua程式碼時的格式化組態'
+config.typeFormat.config.auto_complete_end  =
+'是否在合適的位置自動完成 `end`'
+config.typeFormat.config.auto_complete_table_sep =
+'是否在宣告表的結尾自動添加分隔符號'
+config.typeFormat.config.format_line        =
+'是否格式化某一行'
 
-command.exportDocument = -- TODO: need translate!
-'Lua: Export Document ...'
-command.addon_manager.open = -- TODO: need translate!
-'Lua: Open Addon Manager ...'
-command.reloadFFIMeta = -- TODO: need translate!
-'Lua: Reload luajit ffi meta'
-command.startServer = -- TODO: need translate!
-'Lua: (debug) Start Language Server'
-command.stopServer = -- TODO: need translate!
-'Lua: (debug) Stop Language Server'
+command.exportDocument =
+'Lua：輸出文件…'
+command.addon_manager.open =
+'Lua：打開插件管理器（Addon Manager）…'
+command.reloadFFIMeta =
+'Lua：重新生成luajit的FFI模組C語言中繼資料'
+command.startServer =
+'Lua：（除錯）重新啟動語言伺服'
+command.stopServer =
+'Lua：（除錯）停止語言伺服'
diff --git a/make.lua b/make.lua
index f51b6c356..0a9121f12 100644
--- a/make.lua
+++ b/make.lua
@@ -51,6 +51,7 @@ lm:executable "lua-language-server" {
     },
     linux = {
         crt = "static",
+        ldflags = { "-rdynamic" },
     }
 }
 
diff --git a/script/config/template.lua b/script/config/template.lua
index 74b7c4b8e..150dcf50f 100644
--- a/script/config/template.lua
+++ b/script/config/template.lua
@@ -401,6 +401,7 @@ local template = {
     ['Lua.language.completeAnnotation']     = Type.Boolean >> true,
     ['Lua.type.castNumberToInteger']        = Type.Boolean >> true,
     ['Lua.type.weakUnionCheck']             = Type.Boolean >> false,
+    ['Lua.type.maxUnionVariants']           = Type.Integer >> 0,
     ['Lua.type.weakNilCheck']               = Type.Boolean >> false,
     ['Lua.type.inferParamType']             = Type.Boolean >> false,
     ['Lua.type.checkTableShape']            = Type.Boolean >> false,
@@ -414,6 +415,7 @@ local template = {
                                             },
     --testma
     ["Lua.docScriptPath"]                   = Type.String,
+    ["Lua.addonRepositoryPath"]             = Type.String,
     -- VSCode
     ["Lua.addonManager.enable"]             = Type.Boolean >> true,
     ["Lua.addonManager.repositoryPath"]     = Type.String,
diff --git a/script/core/color.lua b/script/core/color.lua
index 2cbcce11f..a189234a7 100644
--- a/script/core/color.lua
+++ b/script/core/color.lua
@@ -2,15 +2,21 @@ local files = require "files"
 local guide = require "parser.guide"
 
 local colorPattern = string.rep('%x', 8)
+local hex6Pattern = string.format("^#%s", string.rep('%x', 6))
 ---@param source parser.object
 ---@return boolean
 local function isColor(source)
     ---@type string
     local text = source[1]
-    if text:len() ~= 8 then
-        return false
+    if text:len() == 8 then
+        return text:match(colorPattern)
     end
-    return text:match(colorPattern)
+
+    if text:len() == 7 then
+        return text:match(hex6Pattern)
+    end
+
+    return false
 end
 
 
@@ -25,6 +31,16 @@ local function textToColor(colorText)
     }
 end
 
+---@param colorText string
+---@return Color
+local function hexTextToColor(colorText)
+    return {
+        alpha = 255,
+        red   = tonumber(colorText:sub(2, 3), 16) / 255,
+        green = tonumber(colorText:sub(4, 5), 16) / 255,
+        blue  = tonumber(colorText:sub(6, 7), 16) / 255,
+    }
+end
 
 ---@param color Color
 ---@return string
@@ -63,10 +79,12 @@ local function colors(uri)
             ---@type string
             local colorText = source[1]
 
+            local color = colorText:match(colorPattern) and textToColor(colorText) or hexTextToColor(colorText)
+
             colorValues[#colorValues+1] = {
                 start  = source.start + 1,
                 finish = source.finish - 1,
-                color  = textToColor(colorText)
+                color  = color
             }
         end
     end)
diff --git a/script/core/diagnostics/missing-fields.lua b/script/core/diagnostics/missing-fields.lua
index ed9bf1a6a..07037ba8a 100644
--- a/script/core/diagnostics/missing-fields.lua
+++ b/script/core/diagnostics/missing-fields.lua
@@ -31,7 +31,7 @@ return function (uri, callback)
                     local class = vm.getGlobal('type', className)
                     ---@cast class -nil
                     for _, set in ipairs(class:getSets(uri)) do
-                        if set.type == 'doc.class'
+                        if  set.type == 'doc.class'
                         and vm.docHasAttr(set, 'partial')
                         then
                             sortedDefs[className].isPartial = true
@@ -70,6 +70,7 @@ return function (uri, callback)
 
                 for _, field in ipairs(fields) do
                     if  not field.optional
+                    and field.type == "doc.field"
                     and not vm.compileNode(field):isNullable() then
                         local key = vm.getKeyName(field)
                         if not key then
diff --git a/script/files.lua b/script/files.lua
index f61330e21..776b23f83 100644
--- a/script/files.lua
+++ b/script/files.lua
@@ -908,6 +908,25 @@ end
 
 local addonsPath
 
+---Updates the variable 'addonsPath' with the user's configuration.
+---The path is only updated if 'addonsPath' is not set and the provided path is a valid string.
+---It first expands the input path and then verifies its existence via fs.exists.
+---@param path string
+function m.updateAddonsPath(path)
+    if addonsPath then
+        return
+    end
+    if not (path and type(path) == "string") then
+        return
+    end
+
+    path = util.expandPath(fs.path(path):string())
+    if fs.exists(fs.path(path)) then
+        addonsPath = path
+        log.info('Updating addon repository path to: ', path)
+    end
+end
+
 ---Resolve path variables/placeholders like ${3rd} and ${addons}
 ---@param path string
 ---@return string resolvedPath
diff --git a/script/vm/type.lua b/script/vm/type.lua
index 24f095a01..d8d272016 100644
--- a/script/vm/type.lua
+++ b/script/vm/type.lua
@@ -374,10 +374,11 @@ function vm.isSubType(uri, child, parent, mark, errs)
     elseif child.type == 'vm.node' then
         if config.get(uri, 'Lua.type.weakUnionCheck') then
             local hasKnownType = 0
+            local maxUnionVariants = config.get(uri, 'Lua.type.maxUnionVariants') or 0
             local i = 0
             for n in child:eachObject() do
                 i = i + 1
-                if i > 100 then
+                if maxUnionVariants > 0 and i > maxUnionVariants then
                     break
                 end
                 if vm.getNodeName(n) then
@@ -403,10 +404,11 @@ function vm.isSubType(uri, child, parent, mark, errs)
         else
             local weakNil = config.get(uri, 'Lua.type.weakNilCheck')
             local skipTable
+            local maxUnionVariants = config.get(uri, 'Lua.type.maxUnionVariants') or 0
             local i = 0
             for n in child:eachObject() do
                 i = i + 1
-                if i > 100 then
+                if maxUnionVariants > 0 and i > maxUnionVariants then
                     break
                 end
                 if skipTable == nil and n.type == "table" and parent.type == "vm.node" then -- skip table type check if child has class
@@ -473,10 +475,11 @@ function vm.isSubType(uri, child, parent, mark, errs)
         parent = global
     elseif parent.type == 'vm.node' then
         local hasKnownType = 0
+        local maxUnionVariants = config.get(uri, 'Lua.type.maxUnionVariants') or 0
         local i = 0
         for n in parent:eachObject() do
             i = i + 1
-            if i > 100 then
+            if maxUnionVariants > 0 and i > maxUnionVariants then
                 break
             end
             if vm.getNodeName(n) then
diff --git a/script/workspace/workspace.lua b/script/workspace/workspace.lua
index 4ae3ba9e8..d58683424 100644
--- a/script/workspace/workspace.lua
+++ b/script/workspace/workspace.lua
@@ -131,6 +131,7 @@ local globInteferFace = {
     end
 }
 
+local addonRepositoryPathUpdated = false
 --- 创建排除文件匹配器
 ---@param scp scope
 function m.getNativeMatcher(scp)
@@ -175,6 +176,11 @@ function m.getNativeMatcher(scp)
         end
     end
     for _, path in ipairs(config.get(scp.uri, 'Lua.workspace.library')) do
+        if not addonRepositoryPathUpdated then
+            addonRepositoryPathUpdated = true
+            local addonRepositoryPath = config.get(scp.uri, 'Lua.addonRepositoryPath')
+            files.updateAddonsPath(addonRepositoryPath)
+        end
         path = m.getAbsolutePath(scp.uri, path)
         if path then
             log.debug('Ignore by library:', path)
diff --git a/test/diagnostics/missing-fields.lua b/test/diagnostics/missing-fields.lua
index 66abfe162..d0876ac74 100644
--- a/test/diagnostics/missing-fields.lua
+++ b/test/diagnostics/missing-fields.lua
@@ -51,6 +51,97 @@ local t = {
 }
 ]]
 
+TEST [[
+---@diagnostic disable: unused-local
+---@class A
+---@field x number
+---@field y? number
+---@field z number
+local A = {}
+
+function A:fun()
+end
+
+---@type A
+local t = {
+    x = 1,
+    y = 2,
+    z = 3,
+}
+]]
+
+TEST [[
+---@diagnostic disable: unused-local
+
+---@class Parent
+---@field a number
+local Parent = {}
+
+function Parent:fun2()
+end
+
+---@class A : Parent
+---@field x number
+---@field y? number
+---@field z number
+local A = {}
+
+function A:fun()
+end
+
+---@type A
+local t = <!{
+    x = 1,
+    y = 2,
+}!>
+]]
+
+TEST [[
+---@diagnostic disable: unused-local
+
+---@class Parent
+---@field a number
+local Parent = {}
+
+function Parent:fun2()
+end
+
+---@class A : Parent
+---@field x number
+---@field y? number
+---@field z number
+local A = {}
+
+function A:fun()
+end
+
+---@type A
+local t = {
+    x = 1,
+    y = 2,
+    z = 3,
+    a = 1,
+}
+]]
+
+TEST [[
+---@diagnostic disable: unused-local
+---@class A
+---@field x number
+---@field y? number
+---@field z number
+local A = {}
+
+function A:fun()
+end
+
+---@type A
+local t = <!{
+    x = 1,
+    y = 2,
+}!>
+]]
+
 TEST [[
 ---@diagnostic disable: unused-local
 ---@class A
@@ -336,7 +427,7 @@ local x = <!{
 }!>
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field [1] string
 ---@field x number
@@ -345,7 +436,7 @@ TEST[[
 local t = {x = 1, ""}
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field [1] string
 ---@field x number
@@ -356,7 +447,7 @@ local t = <!{x = 1}!>
 
 -- Inheritance
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
@@ -366,7 +457,7 @@ TEST[[
 local t = <!{}!>
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 ---@field y number
@@ -377,7 +468,7 @@ TEST[[
 local t = <!{y = 1}!>
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
@@ -390,7 +481,7 @@ local t = <!{y = 1}!>
 
 -- Inheritance + optional
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x? number
 
@@ -400,7 +491,7 @@ TEST[[
 local t = {}
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x? number
 ---@field y number
@@ -411,7 +502,7 @@ TEST[[
 local t = {y = 1}
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x? number
 
@@ -424,7 +515,7 @@ local t = {y = 1}
 
 -- Inheritance + function call
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
@@ -436,7 +527,7 @@ local function f(b) end
 f <!{}!>
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 ---@field y number
@@ -449,7 +540,7 @@ local function f(b) end
 f <!{y = 1}!>
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
@@ -464,7 +555,7 @@ f <!{y = 1}!>
 
 -- partial class
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
@@ -474,7 +565,7 @@ TEST[[
 local t = {}
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
@@ -485,7 +576,7 @@ TEST[[
 local t = <!{}!>
 ]]
 
-TEST[[
+TEST [[
 ---@class A
 ---@field x number
 
