-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathconfig.lua
136 lines (119 loc) · 4.07 KB
/
config.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
local langs = require("js-i18n.lang_name_list")
local utils = require("js-i18n.utils")
local M = {}
local function normalize_lang(locale)
return locale:lower():gsub("-", "_")
end
local LangSet = {}
for _, l in ipairs(langs) do
LangSet[normalize_lang(l)] = true
end
--- Detect language from file path heuristically
--- @param path string File path
function M.default_detect_language(path)
local abs_path = vim.fn.fnamemodify(path, ":p")
local split = vim.split(abs_path, "[/.]")
local lang = "unknown"
for _, part in ipairs(vim.fn.reverse(split)) do
if LangSet[normalize_lang(part)] then
lang = part
break
end
end
return lang
end
--- バーチャルテキストのフォーマット関数
--- @param text string
--- @param opts I18n.VirtText.FormatOpts
--- @return string|string[][]
local function default_virt_text_format(text, opts)
local prefix = ""
local suffix = ""
if not opts.config.virt_text.conceal_key then
prefix = " : "
end
text = utils.escape_translation_text(text)
if opts.config.virt_text.max_length > 0 then
text = utils.utf_truncate(text, opts.config.virt_text.max_length, "...")
elseif opts.config.virt_text.max_width > 0 then
text = utils.truncate_display_width(text, opts.config.virt_text.max_width, "...")
end
return prefix .. text .. suffix
end
--- @class I18n.Config
--- @field primary_language string[] 優先表示する言語
--- @field translation_source string[] 翻訳ソースのパターン
--- @field detect_language fun(path: string): string ファイルパスから言語を検出する関数
--- @field namespace_separator string?
--- @field key_separator string キーのセパレータ
--- @field virt_text I18n.VirtTextConfig バーチャルテキストの設定
--- @field diagnostic I18n.Diagnostic 診断の設定
--- @field libraries table<string, table> ライブラリごとの設定
--- @class I18n.VirtTextConfig
--- @field enabled boolean バーチャルテキストを有効にするかどうか
--- @field format fun(text: string, opts: I18n.VirtText.FormatOpts): string|string[][] バーチャルテキストのフォーマット関数
--- @field max_length number バーチャルテキストの最大長 (0 の場合は無制限)
--- @field max_width number バーチャルテキストの最大幅 (0 の場合は無制限)
--- @field conceal_key boolean キーを隠すかどうか
--- @field fallback boolean 選択中の言語にキーが存在しない場合に他の言語を表示するかどうか
--- @class I18n.Diagnostic
--- @field enabled boolean diagnostics を有効にするかどうか
--- @field severity number 診断の重要度
--- デフォルト設定
--- @type I18n.Config
local default_config = {
primary_language = {},
translation_source = { "**/{locales,messages}/*.json" },
detect_language = M.default_detect_language,
namespace_separator = nil,
key_separator = ".",
virt_text = {
enabled = true,
format = default_virt_text_format,
conceal_key = false,
fallback = false,
max_length = 0,
max_width = 0,
},
diagnostic = {
enabled = true,
severity = vim.diagnostic.severity.WARN,
},
libraries = {
-- Config for i18next, react-i18next, next-i18next
i18next = {
plural_suffixes = {
"_ordinal_other",
"_ordinal_many",
"_ordinal_few",
"_ordinal_two",
"_ordinal_one",
"_ordinal_zero",
"_other",
"_many",
"_few",
"_two",
"_one",
"_zero",
},
},
},
}
--- 設定
--- @type I18n.Config
---@diagnostic disable-next-line: missing-fields
M.config = {}
setmetatable(M.config, {
-- セットアップが終わっていない場合はエラーを出す
__index = function(_, key)
error("Config is not set up yet. (key: " .. key .. ")")
end,
})
--- 設定のセットアップ
--- ユーザーの設定とデフォルト設定をマージする
--- @param user_config I18n.Config ユーザーの設定
function M.setup(user_config)
local config = vim.tbl_deep_extend("force", default_config, user_config or {})
M.config = config
end
return M