summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2018-12-26 11:50:46 +0800
committer最萌小汐 <sumneko@hotmail.com>2018-12-26 11:50:46 +0800
commit0d1b47eae7f43755aaf6a644f62b1c236ba8855a (patch)
treebebb216606edc74f33c198cae92e0fbd01391bc0 /server/src
parent48e0f29dc8b8f0f144e683c6df24f6f0bbabcee5 (diff)
downloadlua-language-server-0d1b47eae7f43755aaf6a644f62b1c236ba8855a.zip
翻译
Diffstat (limited to 'server/src')
-rw-r--r--server/src/language.lua69
-rw-r--r--server/src/matcher/diagnostics.lua2
-rw-r--r--server/src/matcher/library.lua7
3 files changed, 74 insertions, 4 deletions
diff --git a/server/src/language.lua b/server/src/language.lua
index 307b3b62..65768c8d 100644
--- a/server/src/language.lua
+++ b/server/src/language.lua
@@ -1,4 +1,5 @@
local fs = require 'bee.filesystem'
+local lni = require 'lni'
local function supportLanguage()
local list = {}
@@ -30,12 +31,78 @@ local function getLanguage(id)
return 'enUS'
end
+local function loadFileByLanguage(name, language)
+ local path = ROOT / 'locale' / language / (name .. '.lni')
+ local buf = io.load(path)
+ if not buf then
+ return {}
+ end
+ local suc, tbl = xpcall(lni.classics, log.error, buf, path:string())
+ if not suc then
+ return {}
+ end
+ return tbl
+end
+
+local function loadLang(name, language)
+ local tbl = loadFileByLanguage(name, 'en-US')
+ if language ~= 'en-US' then
+ local other = loadFileByLanguage(name, language)
+ for k, v in pairs(other) do
+ tbl[k] = v
+ end
+ end
+ return setmetatable(tbl, {
+ __index = function (self, key)
+ self[key] = key
+ return key
+ end,
+ __call = function (self, key, ...)
+ local str = self[key]
+ local index = 0
+ str:gsub('%{(.-)%}', function (pat)
+ local id, fmt
+ local pos = pat:find(':', 1, true)
+ if pos then
+ id = pat:sub(1, pos-1)
+ fmg = pat:sub(pos+1)
+ else
+ id = pat
+ fmt = 's'
+ end
+ id = tonumber(id)
+ if not id then
+ index = index + 1
+ id = index
+ end
+ local v = select(id, ...)
+ local suc, res = pcall(string.format, '%'..fmt, v)
+ if suc then
+ return res
+ else
+ -- 这里不能使用翻译,以免死循环
+ log.warn(('[%s][%s-%s]{%s} formated error.'):format(
+ language, name, key, pat
+ ))
+ return nil
+ end
+ end)
+ end,
+ })
+end
+
local function init()
local id = osLanguage()
local language = getLanguage(id)
log.info(('VSC language: %s'):format(id))
log.info(('LS language: %s'):format(language))
- return language
+ return setmetatable({ id = language }, {
+ __index = function (self, name)
+ local tbl = loadLang(name, language)
+ self[name] = tbl
+ return tbl
+ end,
+ })
end
return init()
diff --git a/server/src/matcher/diagnostics.lua b/server/src/matcher/diagnostics.lua
index 5e51f9ac..ba537694 100644
--- a/server/src/matcher/diagnostics.lua
+++ b/server/src/matcher/diagnostics.lua
@@ -1,3 +1,5 @@
+local lang = require 'language'
+
local function searchUnusedLocals(results, callback)
for _, var in ipairs(results.locals) do
if var.key == 'self'
diff --git a/server/src/matcher/library.lua b/server/src/matcher/library.lua
index 5b150513..68ec0fca 100644
--- a/server/src/matcher/library.lua
+++ b/server/src/matcher/library.lua
@@ -137,7 +137,8 @@ local function fix(libs)
end
local function init()
- local language = require 'language'
+ local lang = require 'language'
+ local id = lang.id
local alllibs = {
global = table.container(),
library = table.container(),
@@ -155,8 +156,8 @@ local function init()
local locale = loadLocale('en-US', relative)
mergeLocale(libs, locale)
- if language ~= 'en-US' then
- locale = loadLocale(language, relative)
+ if id ~= 'en-US' then
+ locale = loadLocale(id, relative)
mergeLocale(libs, locale)
end
mergeLibs(alllibs, libs)