Merge pull request #10262 from zmstone/0328-move-i18n-files-to-one-dir

0328 move i18n files to one dir
This commit is contained in:
Zaiming (Stone) Shi 2023-04-03 16:45:22 +02:00 committed by GitHub
commit 082dfc02c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
97 changed files with 56 additions and 131 deletions

View File

@ -82,7 +82,7 @@ ct: $(REBAR) merge-config
static_checks: static_checks:
@$(REBAR) as check do xref, dialyzer @$(REBAR) as check do xref, dialyzer
@if [ "$${PROFILE}" = 'emqx-enterprise' ]; then $(REBAR) ct --suite apps/emqx/test/emqx_static_checks --readable $(CT_READABLE); fi @if [ "$${PROFILE}" = 'emqx-enterprise' ]; then $(REBAR) ct --suite apps/emqx/test/emqx_static_checks --readable $(CT_READABLE); fi
@if [ "$${PROFILE}" = 'emqx-enterprise' ]; then ./scripts/check-i18n-style.sh; fi ./scripts/check-i18n-style.sh
APPS=$(shell $(SCRIPTS)/find-apps.sh) APPS=$(shell $(SCRIPTS)/find-apps.sh)

View File

@ -453,20 +453,20 @@ fields(translator) ->
]; ];
fields(udp_listeners) -> fields(udp_listeners) ->
[ [
{udp, sc(map(name, ref(udp_listener)), #{desc => ?DESC(udp_listener)})}, {udp, sc(map(name, ref(udp_listener)), #{desc => ?DESC(listener_name_to_settings_map)})},
{dtls, sc(map(name, ref(dtls_listener)), #{desc => ?DESC(dtls_listener)})} {dtls, sc(map(name, ref(dtls_listener)), #{desc => ?DESC(listener_name_to_settings_map)})}
]; ];
fields(tcp_listeners) -> fields(tcp_listeners) ->
[ [
{tcp, sc(map(name, ref(tcp_listener)), #{desc => ?DESC(tcp_listener)})}, {tcp, sc(map(name, ref(tcp_listener)), #{desc => ?DESC(listener_name_to_settings_map)})},
{ssl, sc(map(name, ref(ssl_listener)), #{desc => ?DESC(ssl_listener)})} {ssl, sc(map(name, ref(ssl_listener)), #{desc => ?DESC(listener_name_to_settings_map)})}
]; ];
fields(tcp_udp_listeners) -> fields(tcp_udp_listeners) ->
[ [
{tcp, sc(map(name, ref(tcp_listener)), #{desc => ?DESC(tcp_listener)})}, {tcp, sc(map(name, ref(tcp_listener)), #{desc => ?DESC(listener_name_to_settings_map)})},
{ssl, sc(map(name, ref(ssl_listener)), #{desc => ?DESC(ssl_listener)})}, {ssl, sc(map(name, ref(ssl_listener)), #{desc => ?DESC(listener_name_to_settings_map)})},
{udp, sc(map(name, ref(udp_listener)), #{desc => ?DESC(udp_listener)})}, {udp, sc(map(name, ref(udp_listener)), #{desc => ?DESC(listener_name_to_settings_map)})},
{dtls, sc(map(name, ref(dtls_listener)), #{desc => ?DESC(dtls_listener)})} {dtls, sc(map(name, ref(dtls_listener)), #{desc => ?DESC(listener_name_to_settings_map)})}
]; ];
fields(tcp_listener) -> fields(tcp_listener) ->
%% some special configs for tcp listener %% some special configs for tcp listener
@ -558,19 +558,19 @@ desc(udp_listeners) ->
desc(tcp_listeners) -> desc(tcp_listeners) ->
"Settings for the TCP listeners."; "Settings for the TCP listeners.";
desc(tcp_udp_listeners) -> desc(tcp_udp_listeners) ->
"Settings for the listeners."; "Settings for TCP and UDP listeners.";
desc(tcp_listener) -> desc(tcp_listener) ->
"Settings for the TCP listener."; "Settings for TCP listener.";
desc(ssl_listener) -> desc(ssl_listener) ->
"Settings for the SSL listener."; "Settings for SSL listener.";
desc(udp_listener) -> desc(udp_listener) ->
"Settings for the UDP listener."; "Settings for UDP listener.";
desc(dtls_listener) -> desc(dtls_listener) ->
"Settings for the DTLS listener."; "Settings for DTLS listener.";
desc(udp_opts) -> desc(udp_opts) ->
"Settings for the UDP sockets."; "Settings for UDP sockets.";
desc(dtls_opts) -> desc(dtls_opts) ->
"Settings for the DTLS protocol."; "Settings for DTLS protocol.";
desc(_) -> desc(_) ->
undefined. undefined.
@ -625,7 +625,7 @@ mountpoint(Default) ->
binary(), binary(),
#{ #{
default => iolist_to_binary(Default), default => iolist_to_binary(Default),
desc => ?DESC(gateway_common_mountpoint) desc => ?DESC(gateway_mountpoint)
} }
). ).
@ -674,7 +674,7 @@ common_listener_opts() ->
binary(), binary(),
#{ #{
default => undefined, default => undefined,
desc => ?DESC(gateway_common_listener_mountpoint) desc => ?DESC(gateway_mountpoint)
} }
)}, )},
{access_rules, {access_rules,

View File

@ -233,7 +233,7 @@ fields(socket_opts) ->
boolean(), boolean(),
#{ #{
default => true, default => true,
hidden => true, importance => ?IMPORTANCE_HIDDEN,
desc => ?DESC(socket_nodelay) desc => ?DESC(socket_nodelay)
} }
)} )}

View File

@ -6,11 +6,9 @@ emqx_ee_bridge_clickhouse {
matching the local_topic will be forwarded.</br> matching the local_topic will be forwarded.</br>
NOTE: if this bridge is used as the action of a rule (EMQX rule engine), and also local_topic is NOTE: if this bridge is used as the action of a rule (EMQX rule engine), and also local_topic is
configured, then both the data got from the rule and the MQTT messages that match local_topic configured, then both the data got from the rule and the MQTT messages that match local_topic
will be forwarded. will be forwarded."""
"""
zh: """发送到 'local_topic' 的消息都会转发到 Clickhouse。 </br> zh: """发送到 'local_topic' 的消息都会转发到 Clickhouse。 </br>
注意:如果这个 Bridge 被用作规则EMQX 规则引擎)的输出,同时也配置了 'local_topic' ,那么这两部分的消息都会被转发。 注意:如果这个 Bridge 被用作规则EMQX 规则引擎)的输出,同时也配置了 'local_topic' ,那么这两部分的消息都会被转发。"""
"""
} }
label { label {
en: "Local Topic" en: "Local Topic"

View File

@ -547,7 +547,7 @@ emqx_ee_bridge_kafka {
"<code>ts</code>: message timestamp.\n" "<code>ts</code>: message timestamp.\n"
"<code>ts_type</code>: message timestamp type, which is one of" "<code>ts_type</code>: message timestamp type, which is one of"
" <code>create</code>, <code>append</code> or <code>undefined</code>.\n" " <code>create</code>, <code>append</code> or <code>undefined</code>.\n"
"<code>value</code>: Kafka message value (uses the chosen value encoding).\n" "<code>value</code>: Kafka message value (uses the chosen value encoding)."
zh: "用于转换收到的 Kafka 消息的模板。 " zh: "用于转换收到的 Kafka 消息的模板。 "
"默认情况下,它将使用 JSON 格式来序列化来自 Kafka 的所有字段。 " "默认情况下,它将使用 JSON 格式来序列化来自 Kafka 的所有字段。 "
"这些字段包括:" "这些字段包括:"
@ -558,7 +558,7 @@ emqx_ee_bridge_kafka {
"<code>ts</code>: 消息的时间戳。\n" "<code>ts</code>: 消息的时间戳。\n"
"<code>ts_type</code>:消息的时间戳类型,值可能是:" "<code>ts_type</code>:消息的时间戳类型,值可能是:"
" <code>create</code> <code>append</code> 或 <code>undefined</code>。\n" " <code>create</code> <code>append</code> 或 <code>undefined</code>。\n"
"<code>value</code>: Kafka 消息值(使用选择的编码方式编码)。\n" "<code>value</code>: Kafka 消息值(使用选择的编码方式编码)。"
} }
label { label {

View File

@ -6,11 +6,9 @@ emqx_ee_bridge_tdengine {
matching the local_topic will be forwarded.</br> matching the local_topic will be forwarded.</br>
NOTE: if this bridge is used as the action of a rule (EMQX rule engine), and also local_topic is NOTE: if this bridge is used as the action of a rule (EMQX rule engine), and also local_topic is
configured, then both the data got from the rule and the MQTT messages that match local_topic configured, then both the data got from the rule and the MQTT messages that match local_topic
will be forwarded. will be forwarded."""
"""
zh: """发送到 'local_topic' 的消息都会转发到 TDengine。 </br> zh: """发送到 'local_topic' 的消息都会转发到 TDengine。 </br>
注意:如果这个 Bridge 被用作规则EMQX 规则引擎)的输出,同时也配置了 'local_topic' ,那么这两部分的消息都会被转发。 注意:如果这个 Bridge 被用作规则EMQX 规则引擎)的输出,同时也配置了 'local_topic' ,那么这两部分的消息都会被转发。"""
"""
} }
label { label {
en: "Local Topic" en: "Local Topic"

View File

@ -1,4 +1,3 @@
emqx_ee_connector_clickhouse { emqx_ee_connector_clickhouse {
base_url { base_url {

View File

@ -2,8 +2,8 @@ emqx_ee_connector_dynamo {
url { url {
desc { desc {
en: """The url of DynamoDB endpoint.<br/>""" en: """The url of DynamoDB endpoint."""
zh: """DynamoDB 的地址。<br/>""" zh: """DynamoDB 的地址。"""
} }
label: { label: {
en: "DynamoDB Endpoint" en: "DynamoDB Endpoint"

View File

@ -2,16 +2,12 @@ emqx_ee_connector_rocketmq {
server { server {
desc { desc {
en: """ en: """The IPv4 or IPv6 address or the hostname to connect to.<br/>
The IPv4 or IPv6 address or the hostname to connect to.<br/>
A host entry has the following form: `Host[:Port]`.<br/> A host entry has the following form: `Host[:Port]`.<br/>
The RocketMQ default port 9876 is used if `[:Port]` is not specified. The RocketMQ default port 9876 is used if `[:Port]` is not specified."""
""" zh: """将要连接的 IPv4 或 IPv6 地址,或者主机名。<br/>
zh: """
将要连接的 IPv4 或 IPv6 地址,或者主机名。<br/>
主机名具有以下形式:`Host[:Port]`。<br/> 主机名具有以下形式:`Host[:Port]`。<br/>
如果未指定 `[:Port]`,则使用 RocketMQ 默认端口 9876。 如果未指定 `[:Port]`,则使用 RocketMQ 默认端口 9876。"""
"""
} }
label: { label: {
en: "Server Host" en: "Server Host"

View File

@ -2,16 +2,12 @@ emqx_ee_connector_tdengine {
server { server {
desc { desc {
en: """ en: """The IPv4 or IPv6 address or the hostname to connect to.<br/>
The IPv4 or IPv6 address or the hostname to connect to.<br/>
A host entry has the following form: `Host[:Port]`.<br/> A host entry has the following form: `Host[:Port]`.<br/>
The TDengine default port 6041 is used if `[:Port]` is not specified. The TDengine default port 6041 is used if `[:Port]` is not specified."""
""" zh: """将要连接的 IPv4 或 IPv6 地址,或者主机名。<br/>
zh: """
将要连接的 IPv4 或 IPv6 地址,或者主机名。<br/>
主机名具有以下形式:`Host[:Port]`。<br/> 主机名具有以下形式:`Host[:Port]`。<br/>
如果未指定 `[:Port]`,则使用 TDengine 默认端口 6041。 如果未指定 `[:Port]`,则使用 TDengine 默认端口 6041。"""
"""
} }
label: { label: {
en: "Server Host" en: "Server Host"

View File

@ -370,13 +370,6 @@ After succeed observe a resource of LwM2M client, Gateway will send the notify e
} }
} }
gateway_common_mountpoint {
desc {
en: """"""
zh: """"""
}
}
gateway_common_clientinfo_override { gateway_common_clientinfo_override {
desc { desc {
en: """ClientInfo override.""" en: """ClientInfo override."""
@ -431,10 +424,10 @@ After succeed observe a resource of LwM2M client, Gateway will send the notify e
} }
} }
tcp_listener { listener_name_to_settings_map{
desc { desc {
en: """""" en: """A map from listener names to listener settings."""
zh: """""" zh: """从监听器名称到配置参数的映射。"""
} }
} }
@ -468,13 +461,6 @@ EMQX will close the TCP connection if proxy protocol packet is not received with
} }
} }
ssl_listener {
desc {
en: """"""
zh: """"""
}
}
ssl_listener_options { ssl_listener_options {
desc { desc {
en: """SSL Socket options.""" en: """SSL Socket options."""
@ -482,13 +468,6 @@ EMQX will close the TCP connection if proxy protocol packet is not received with
} }
} }
udp_listener {
desc {
en: """"""
zh: """"""
}
}
udp_listener_udp_opts { udp_listener_udp_opts {
desc { desc {
en: """Settings for the UDP sockets.""" en: """Settings for the UDP sockets."""
@ -533,13 +512,6 @@ See: https://erlang.org/doc/man/inet.html#setopts-2"""
} }
} }
dtls_listener {
desc {
en: """"""
zh: """"""
}
}
dtls_listener_acceptors { dtls_listener_acceptors {
desc { desc {
en: """Size of the acceptor pool.""" en: """Size of the acceptor pool."""
@ -592,7 +564,7 @@ When set to <code>false</code> clients will be allowed to connect without authen
} }
} }
gateway_common_listener_mountpoint { gateway_mountpoint {
desc { desc {
en: """When publishing or subscribing, prefix all topics with a mountpoint string. en: """When publishing or subscribing, prefix all topics with a mountpoint string.
The prefixed string will be removed from the topic name when the message is delivered to the subscriber. The prefixed string will be removed from the topic name when the message is delivered to the subscriber.

View File

@ -1,4 +1,3 @@
emqx_mgmt_api_publish { emqx_mgmt_api_publish {
publish_api { publish_api {
desc { desc {

View File

@ -35,8 +35,8 @@ emqx_rule_api_schema {
event_username { event_username {
desc { desc {
en: "The User Name" en: "Username"
zh: "" zh: "用户名"
} }
label: { label: {
en: "Username" en: "Username"

View File

@ -1505,8 +1505,8 @@ In case PSK cipher suites are intended, make sure to configure
common_ssl_opts_schema_hibernate_after { common_ssl_opts_schema_hibernate_after {
desc { desc {
en: """ Hibernate the SSL process after idling for amount of time reducing its memory footprint. """ en: """Hibernate the SSL process after idling for amount of time reducing its memory footprint."""
zh: """ 在闲置一定时间后休眠 SSL 进程,减少其内存占用。""" zh: """在闲置一定时间后休眠 SSL 进程,减少其内存占用。"""
} }
label: { label: {
en: "hibernate after" en: "hibernate after"

View File

@ -1,12 +1,15 @@
#!/usr/bin/env escript #!/usr/bin/env escript
%% called from check-i18n-style.sh
-mode(compile). -mode(compile).
-define(YELLOW, "\e[33m"). % -define(YELLOW, "\e[33m"). % not used
-define(RED, "\e[31m"). -define(RED, "\e[31m").
-define(RESET, "\e[39m"). -define(RESET, "\e[39m").
main([Files0]) -> main([Files0]) ->
io:format(user, "checking i18n file styles", []),
_ = put(errors, 0), _ = put(errors, 0),
Files = string:tokens(Files0, "\n"), Files = string:tokens(Files0, "\n"),
ok = load_hocon(), ok = load_hocon(),
@ -46,7 +49,7 @@ logerr(Fmt, Args) ->
check(File) -> check(File) ->
io:format(user, "checking: ~s~n", [File]), io:format(user, ".", []),
{ok, C} = hocon:load(File), {ok, C} = hocon:load(File),
maps:foreach(fun check_one_field/2, C), maps:foreach(fun check_one_field/2, C),
ok. ok.
@ -84,7 +87,7 @@ do_check_desc(Name, _) ->
die("~s: missing 'zh' or 'en'~n", [Name]). die("~s: missing 'zh' or 'en'~n", [Name]).
check_desc_string(Name, Tr, <<>>) -> check_desc_string(Name, Tr, <<>>) ->
io:format(standard_error, ?YELLOW ++ "WARNING: ~s.~s: empty string~n" ++ ?RESET, [Name, Tr]); logerr("~s.~s: empty string~n", [Name, Tr]);
check_desc_string(Name, Tr, BinStr) -> check_desc_string(Name, Tr, BinStr) ->
Str = unicode:characters_to_list(BinStr, utf8), Str = unicode:characters_to_list(BinStr, utf8),
Err = fun(Reason) -> Err = fun(Reason) ->

View File

@ -3,6 +3,6 @@ set -euo pipefail
cd -P -- "$(dirname -- "$0")/.." cd -P -- "$(dirname -- "$0")/.."
all_files="$(git ls-files '*i18n*.conf')" all_files="$(git ls-files 'rel/i18n/*.hocon')"
./scripts/check-i18n-style.escript "$all_files" ./scripts/check-i18n-style.escript "$all_files"

View File

@ -4,12 +4,8 @@
main(_) -> main(_) ->
BaseConf = <<"">>, BaseConf = <<"">>,
Cfgs0 = get_all_cfgs("apps/"), Cfgs0 = get_all_files(),
Cfgs1 = get_all_cfgs("lib-ee/"), Conf = merge(BaseConf, Cfgs0),
Conf0 = merge(BaseConf, Cfgs0),
Conf = [merge(Conf0, Cfgs1),
io_lib:nl()
],
OutputFile = "apps/emqx_dashboard/priv/i18n.conf", OutputFile = "apps/emqx_dashboard/priv/i18n.conf",
ok = filelib:ensure_dir(OutputFile), ok = filelib:ensure_dir(OutputFile),
ok = file:write_file(OutputFile, Conf). ok = file:write_file(OutputFile, Conf).
@ -25,39 +21,7 @@ merge(BaseConf, Cfgs) ->
end end
end, BaseConf, Cfgs). end, BaseConf, Cfgs).
get_all_cfgs(Root) -> get_all_files() ->
Apps = filelib:wildcard("*", Root) -- ["emqx_machine"], Dir = filename:join(["rel","i18n"]),
Dirs = [filename:join([Root, App]) || App <- Apps], Files = filelib:wildcard("*.hocon", Dir),
lists:foldl(fun get_cfgs/2, [], Dirs). lists:map(fun(Name) -> filename:join([Dir, Name]) end, Files).
get_all_cfgs(Dir, Cfgs) ->
Fun = fun(E, Acc) ->
Path = filename:join([Dir, E]),
get_cfgs(Path, Acc)
end,
lists:foldl(Fun, Cfgs, filelib:wildcard("*", Dir)).
get_cfgs(Dir, Cfgs) ->
case filelib:is_dir(Dir) of
false ->
Cfgs;
_ ->
Files = filelib:wildcard("*", Dir),
case lists:member("i18n", Files) of
false ->
try_enter_child(Dir, Files, Cfgs);
true ->
EtcDir = filename:join([Dir, "i18n"]),
Confs = filelib:wildcard("*.conf", EtcDir),
NewCfgs = [filename:join([EtcDir, Name]) || Name <- Confs],
try_enter_child(Dir, Files, NewCfgs ++ Cfgs)
end
end.
try_enter_child(Dir, Files, Cfgs) ->
case lists:member("src", Files) of
false ->
Cfgs;
true ->
get_all_cfgs(filename:join([Dir, "src"]), Cfgs)
end.