From d02ac812e6da84bb527e9020080a8985104033d8 Mon Sep 17 00:00:00 2001 From: firest Date: Tue, 19 Apr 2022 18:12:42 +0800 Subject: [PATCH] feat(delayed): add i18n support for delayed --- .../i18n/emqx_delayed_api_i18n.conf | 164 ++++++++++++++++++ .../i18n/emqx_modules_schema_i18n.conf | 13 ++ apps/emqx_modules/src/emqx_delayed_api.erl | 70 ++++---- apps/emqx_modules/src/emqx_modules_schema.erl | 5 +- 4 files changed, 212 insertions(+), 40 deletions(-) create mode 100644 apps/emqx_modules/i18n/emqx_delayed_api_i18n.conf diff --git a/apps/emqx_modules/i18n/emqx_delayed_api_i18n.conf b/apps/emqx_modules/i18n/emqx_delayed_api_i18n.conf new file mode 100644 index 000000000..d16d61ccf --- /dev/null +++ b/apps/emqx_modules/i18n/emqx_delayed_api_i18n.conf @@ -0,0 +1,164 @@ +emqx_delayed_api { + + view_status_api { + desc { + en: "Get delayed status" + zh: "查看慢订阅状态" + } + } + + update_api { + desc { + en: "Enable or disable delayed, set max delayed messages" + zh: "开启或者关闭功能,或者设置延迟消息数量上限" + } + } + + update_success { + desc { + en: "Enable or disable delayed successfully" + zh: "开启或者关闭功能操作成功" + } + } + + illegality_limit { + desc { + en: "Max limit illegality" + zh: "数量上限不合法" + } + } + + get_message_api { + desc { + en: "View delayed message" + zh: "查看延迟消息" + } + } + + node { + desc { + en: "The node where message from" + zh: "消息的来源节点" + } + } + + msgid { + desc { + en: "Delayed Message ID" + zh: "延迟消息 ID" + } + } + + bad_msgid_format { + desc { + en: "Bad Message ID format" + zh: "消息 ID 格式错误" + } + } + + msgid_not_found { + desc { + en: "Message ID not found" + zh: "未找到对应消息" + } + } + + delete_api { + desc { + en: "Delete delayed message" + zh: "删除延迟消息" + } + } + + list_api { + desc { + en: "List delayed messages" + zh: "查看延迟消息列表" + } + } + + view_page { + desc { + en: "View page" + zh: "查看的页数" + } + } + + view_limit { + desc { + en: "Page limit" + zh: "每页数量" + } + } + + count { + desc { + en: "Count of delayed messages" + zh: "延迟消息总数" + } + } + + publish_at { + desc { + en: "Clinet publish message time, in RFC 3339 format" + zh: "客户端发送时间, RFC 3339 格式" + } + } + + delayed_interval { + desc { + en: "Delayed interval(second)" + zh: "延迟时间(秒)" + } + } + + delayed_remaining { + desc { + en: "Delayed remaining(second)" + zh: "剩余时间(秒)" + } + } + + expected_at { + desc { + en: "Expect publish time, in RFC 3339 format" + zh: "期望的发送时间, RFC 3339 格式" + } + } + + topic { + desc { + en: "Topic" + zh: "主题" + } + } + + qos { + desc { + en: "QoS" + zh: "QoS" + } + } + + from_clientid { + desc { + en: "From ClientID" + zh: "消息的 ClientID" + } + } + + from_username { + desc { + en: "From Username" + zh: "消息的 Username" + } + } + + payload { + desc { + en: "Payload, base64 encoded. Payload will be set to 'PAYLOAD_TO_LARGE' if its length is larger than 2048 bytes" + zh: "消息内容, base64 格式。如果消息的大小超过 2048 字节,则消息内容会被设置为 'PAYLOAD_TO_LARGE'" + } + } + +} diff --git a/apps/emqx_modules/i18n/emqx_modules_schema_i18n.conf b/apps/emqx_modules/i18n/emqx_modules_schema_i18n.conf index 128bb92b9..ce187b92f 100644 --- a/apps/emqx_modules/i18n/emqx_modules_schema_i18n.conf +++ b/apps/emqx_modules/i18n/emqx_modules_schema_i18n.conf @@ -71,4 +71,17 @@ all:全部重写主题""" } } + enable { + desc { + en: "Enable this feature" + zh: "是否开启该功能" + } + } + + max_delayed_messages { + desc { + en: "Maximum number of delayed messages (0 is no limit)." + zh: "延迟消息的数量上限(0 代表无限)" + } + } } diff --git a/apps/emqx_modules/src/emqx_delayed_api.erl b/apps/emqx_modules/src/emqx_delayed_api.erl index c1347922c..c6f6d5062 100644 --- a/apps/emqx_modules/src/emqx_delayed_api.erl +++ b/apps/emqx_modules/src/emqx_delayed_api.erl @@ -19,13 +19,11 @@ -behaviour(minirest_api). -include_lib("typerefl/include/types.hrl"). +-include_lib("hocon/include/hoconsc.hrl"). -include("emqx_modules.hrl"). -import(hoconsc, [mk/2, ref/1, ref/2]). --define(MAX_PAYLOAD_LENGTH, 2048). --define(PAYLOAD_TOO_LARGE, <<"PAYLOAD_TOO_LARGE">>). - -export([ status/2, delayed_messages/2, @@ -43,6 +41,9 @@ -export([api_spec/0]). +-define(MAX_PAYLOAD_LENGTH, 2048). +-define(PAYLOAD_TOO_LARGE, <<"PAYLOAD_TOO_LARGE">>). + -define(INTERNAL_ERROR, 'INTERNAL_ERROR'). -define(BAD_REQUEST, 'BAD_REQUEST'). @@ -65,24 +66,23 @@ schema("/mqtt/delayed") -> 'operationId' => status, get => #{ tags => ?API_TAG_MQTT, - description => <<"Get delayed status">>, - summary => <<"Get delayed status">>, + description => ?DESC(view_status_api), responses => #{ 200 => ref(emqx_modules_schema, "delayed") } }, put => #{ tags => ?API_TAG_MQTT, - description => <<"Enable or disable delayed, set max delayed messages">>, + description => ?DESC(update_api), 'requestBody' => ref(emqx_modules_schema, "delayed"), responses => #{ 200 => mk( ref(emqx_modules_schema, "delayed"), - #{desc => <<"Enable or disable delayed successfully">>} + #{desc => ?DESC(update_success)} ), 400 => emqx_dashboard_swagger:error_codes( [?BAD_REQUEST], - <<"Max limit illegality">> + ?DESC(illegality_limit) ) } } @@ -92,47 +92,47 @@ schema("/mqtt/delayed/messages/:node/:msgid") -> 'operationId' => delayed_message, get => #{ tags => ?API_TAG_MQTT, - description => <<"Get delayed message">>, + description => ?DESC(get_message_api), parameters => [ {node, mk( binary(), - #{in => path, desc => <<"The node where message from">>} + #{in => path, desc => ?DESC(node)} )}, - {msgid, mk(binary(), #{in => path, desc => <<"Delay message ID">>})} + {msgid, mk(binary(), #{in => path, desc => ?DESC(msgid)})} ], responses => #{ 200 => ref("message_without_payload"), 400 => emqx_dashboard_swagger:error_codes( [?MESSAGE_ID_SCHEMA_ERROR, ?INVALID_NODE], - <<"Bad MsgId format">> + ?DESC(bad_msgid_format) ), 404 => emqx_dashboard_swagger:error_codes( [?MESSAGE_ID_NOT_FOUND], - <<"MsgId not found">> + ?DESC(msgid_not_found) ) } }, delete => #{ tags => ?API_TAG_MQTT, - description => <<"Delete delayed message">>, + description => ?DESC(delete_api), parameters => [ {node, mk( binary(), - #{in => path, desc => <<"The node where message from">>} + #{in => path, desc => ?DESC(node)} )}, - {msgid, mk(binary(), #{in => path, desc => <<"Delay message ID">>})} + {msgid, mk(binary(), #{in => path, desc => ?DESC(msgid)})} ], responses => #{ 204 => <<"Delete delayed message success">>, 400 => emqx_dashboard_swagger:error_codes( [?MESSAGE_ID_SCHEMA_ERROR, ?INVALID_NODE], - <<"Bad MsgId format">> + ?DESC(bad_msgid_format) ), 404 => emqx_dashboard_swagger:error_codes( [?MESSAGE_ID_NOT_FOUND], - <<"MsgId not found">> + ?DESC(msgid_not_found) ) } } @@ -142,16 +142,16 @@ schema("/mqtt/delayed/messages") -> 'operationId' => delayed_messages, get => #{ tags => ?API_TAG_MQTT, - description => <<"List delayed messages">>, + description => ?DESC(list_api), parameters => [ref(emqx_dashboard_swagger, page), ref(emqx_dashboard_swagger, limit)], responses => #{ 200 => [ {data, mk(hoconsc:array(ref("message")), #{})}, {meta, [ - {page, mk(pos_integer(), #{})}, - {limit, mk(pos_integer(), #{})}, - {count, mk(non_neg_integer(), #{})} + {page, mk(pos_integer(), #{desc => ?DESC(view_page)})}, + {limit, mk(pos_integer(), #{desc => ?DESC(view_limit)})}, + {count, mk(non_neg_integer(), #{desc => ?DESC(count)})} ]} ] } @@ -160,24 +160,20 @@ schema("/mqtt/delayed/messages") -> fields("message_without_payload") -> [ - {msgid, mk(integer(), #{desc => <<"Message Id (MQTT message id hash)">>})}, - {node, mk(binary(), #{desc => <<"The node where message from">>})}, - {publish_at, mk(binary(), #{desc => <<"Client publish message time, rfc 3339">>})}, - {delayed_interval, mk(pos_integer(), #{desc => <<"Delayed interval, second">>})}, - {delayed_remaining, mk(non_neg_integer(), #{desc => <<"Delayed remaining, second">>})}, - {expected_at, mk(binary(), #{desc => <<"Expect publish time, rfc 3339">>})}, - {topic, mk(binary(), #{desc => <<"Topic">>, example => <<"/sys/#">>})}, - {qos, mk(emqx_schema:qos(), #{desc => <<"QoS">>})}, - {from_clientid, mk(binary(), #{desc => <<"From ClientId">>})}, - {from_username, mk(binary(), #{desc => <<"From Username">>})} + {msgid, mk(integer(), #{desc => ?DESC(msgid)})}, + {node, mk(binary(), #{desc => ?DESC(node)})}, + {publish_at, mk(binary(), #{desc => ?DESC(publish_at)})}, + {delayed_interval, mk(pos_integer(), #{desc => ?DESC(delayed_interval)})}, + {delayed_remaining, mk(non_neg_integer(), #{desc => ?DESC(delayed_remaining)})}, + {expected_at, mk(binary(), #{desc => ?DESC(expected_at)})}, + {topic, mk(binary(), #{desc => ?DESC(topic), example => <<"/sys/#">>})}, + {qos, mk(emqx_schema:qos(), #{desc => ?DESC(qos)})}, + {from_clientid, mk(binary(), #{desc => ?DESC(from_clientid)})}, + {from_username, mk(binary(), #{desc => ?DESC(from_username)})} ]; fields("message") -> - PayloadDesc = io_lib:format( - "Payload, base64 encoded. Payload will be set to ~p if its length is larger than ~p", - [?PAYLOAD_TOO_LARGE, ?MAX_PAYLOAD_LENGTH] - ), fields("message_without_payload") ++ - [{payload, mk(binary(), #{desc => iolist_to_binary(PayloadDesc)})}]. + [{payload, mk(binary(), #{desc => ?DESC(payload)})}]. %%-------------------------------------------------------------------- %% HTTP API diff --git a/apps/emqx_modules/src/emqx_modules_schema.erl b/apps/emqx_modules/src/emqx_modules_schema.erl index 9c1e07dbb..c8c26b20f 100644 --- a/apps/emqx_modules/src/emqx_modules_schema.erl +++ b/apps/emqx_modules/src/emqx_modules_schema.erl @@ -42,9 +42,8 @@ fields("telemetry") -> [{enable, hoconsc:mk(boolean(), #{default => false, desc => "Enable telemetry."})}]; fields("delayed") -> [ - {enable, hoconsc:mk(boolean(), #{default => false, desc => "Enable `delayed` module."})}, - {max_delayed_messages, - sc(integer(), #{desc => "Maximum number of delayed messages (0 is no limit)."})} + {enable, hoconsc:mk(boolean(), #{default => false, desc => ?DESC(enable)})}, + {max_delayed_messages, sc(integer(), #{desc => ?DESC(max_delayed_messages)})} ]; fields("rewrite") -> [