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:
commit
082dfc02c9
2
Makefile
2
Makefile
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -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"
|
|
@ -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 {
|
|
@ -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"
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
emqx_ee_connector_clickhouse {
|
emqx_ee_connector_clickhouse {
|
||||||
|
|
||||||
base_url {
|
base_url {
|
|
@ -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"
|
|
@ -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"
|
|
@ -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"
|
|
@ -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.
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
emqx_mgmt_api_publish {
|
emqx_mgmt_api_publish {
|
||||||
publish_api {
|
publish_api {
|
||||||
desc {
|
desc {
|
|
@ -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"
|
|
@ -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"
|
|
@ -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) ->
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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.
|
|
||||||
|
|
Loading…
Reference in New Issue