diff --git a/docs/releases.md b/docs/releases.md index 1e8fff71..cfb50825 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -4,6 +4,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## ntfy server v1.30.0 (UNRELEASED) +**Features:** + +* Web: Generate random topic name button ([#453](https://github.com/binwiederhier/ntfy/issues/453), thanks to [@yardenshoham](https://github.com/yardenshoham)) + **Bug fixes + maintenance:** * Remove `--env-topic` option from `ntfy publish` as per [deprecation](deprecations.md) (no ticket) diff --git a/web/public/static/langs/en.json b/web/public/static/langs/en.json index 4d12c072..6b831b79 100644 --- a/web/public/static/langs/en.json +++ b/web/public/static/langs/en.json @@ -129,6 +129,7 @@ "subscribe_dialog_subscribe_topic_placeholder": "Topic name, e.g. phil_alerts", "subscribe_dialog_subscribe_use_another_label": "Use another server", "subscribe_dialog_subscribe_base_url_label": "Service URL", + "subscribe_dialog_subscribe_button_generate_topic_name": "Generate name", "subscribe_dialog_subscribe_button_cancel": "Cancel", "subscribe_dialog_subscribe_button_subscribe": "Subscribe", "subscribe_dialog_login_title": "Login required", diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index 9da0e06b..09b9b489 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -10,15 +10,15 @@ "notifications_list_item": "通知", "notifications_mark_read": "標示已讀", "notifications_attachment_image": "附加圖片", - "notifications_attachment_copy_url_title": "複製附件URL到剪貼板", - "notifications_attachment_copy_url_button": "複製URL", + "notifications_attachment_copy_url_title": "複製附件 URL 到剪貼簿", + "notifications_attachment_copy_url_button": "複製 URL", "notifications_attachment_open_title": "前往 {{url}}", "notifications_attachment_open_button": "開啟附件", "notifications_attachment_link_expired": "下載連結已過期", "notifications_attachment_file_video": "影片檔案", "notifications_attachment_file_app": "Android 應用程式檔案", "notifications_attachment_file_document": "其他文件", - "notifications_click_copy_url_title": "複製連結URL到剪貼板", + "notifications_click_copy_url_title": "複製連結 URL 到剪貼板", "notifications_click_copy_url_button": "複製連結", "notifications_click_open_button": "開啟連結", "notifications_actions_not_supported": "網頁程式無法支援該動作", @@ -27,16 +27,16 @@ "notifications_none_for_topic_description": "如要寄送通知到此主題,請使用 PUT 或 POST 到此主題URL。", "notifications_none_for_any_title": "尚未收到任何通知。", "action_bar_settings": "設定", - "action_bar_send_test_notification": "寄送測試通知", + "action_bar_send_test_notification": "發送測試通知", "action_bar_clear_notifications": "清除所有通知", "action_bar_show_menu": "顯示選單", "nav_button_documentation": "文件", - "nav_button_publish_message": "發布通知", + "nav_button_publish_message": "發佈通知", "nav_button_muted": "通知已靜音", - "notifications_copied_to_clipboard": "複製到剪貼板", - "message_bar_publish": "發布訊息", - "message_bar_show_dialog": "顯示發布對話筐", - "message_bar_error_publishing": "無法發布通知", + "notifications_copied_to_clipboard": "已複製到剪貼簿", + "message_bar_publish": "發佈訊息", + "message_bar_show_dialog": "顯示發佈對話框", + "message_bar_error_publishing": "發佈通知時發生錯誤", "nav_topics_title": "訂閱主題", "nav_button_all_notifications": "所有通知", "nav_button_settings": "設定", @@ -50,7 +50,36 @@ "notifications_new_indicator": "新通知", "notifications_attachment_file_audio": "聲音檔案", "notifications_delete": "刪除", - "notifications_attachment_link_expires": "連結已過期 {{date}}", + "notifications_attachment_link_expires": "連結在 {{date}} 過期", "notifications_attachment_file_image": "圖片檔案", - "notifications_actions_open_url_title": "前往 {{url}}" + "notifications_actions_open_url_title": "前往 {{url}}", + "notifications_no_subscriptions_title": "你尚未有任何訂閱。", + "notifications_example": "範例", + "notifications_more_details": "你可以在 ntfy 網站或者技術文件中查看更多資訊。", + "notifications_loading": "載入中…", + "publish_dialog_title_topic": "發佈到 {{topic}}", + "publish_dialog_title_no_topic": "發佈通知", + "publish_dialog_progress_uploading": "上傳中…", + "publish_dialog_priority_label": "優先度", + "publish_dialog_email_label": "電郵地址", + "publish_dialog_filename_label": "檔案名稱", + "publish_dialog_button_cancel": "取消", + "publish_dialog_button_send": "傳送", + "publish_dialog_button_cancel_sending": "取消傳送", + "subscribe_dialog_subscribe_button_cancel": "取消", + "subscribe_dialog_subscribe_button_subscribe": "訂閱", + "emoji_picker_search_clear": "清除", + "subscribe_dialog_login_password_label": "密碼", + "subscribe_dialog_login_button_back": "返回", + "subscribe_dialog_login_button_login": "登入", + "prefs_notifications_delete_after_never": "從不", + "prefs_users_add_button": "新增使用者", + "prefs_users_dialog_password_label": "密碼", + "prefs_users_dialog_title_add": "新增使用者", + "prefs_users_dialog_button_save": "儲存", + "prefs_users_dialog_button_cancel": "取消", + "error_boundary_title": "歐買尬,ntfy 壞掉了", + "notifications_none_for_any_description": "要開始發送通知到一個主題,只需要對主題 URL 發送 HTTP PUT 或者 POST,例如:", + "notifications_no_subscriptions_description": "點選 「{{linktext}}」 連結以建立或訂閱主題。完成後,你就可以使用 HTTP PUT 或者 POST 發送通知到這裡了!", + "error_boundary_description": "很抱歉 ntfy 發生錯誤了。
如果你有時間,煩請到 Github 回報錯誤,或者到 Discord 或者 Matrix 聊天室裡面告訴我們。" } diff --git a/web/src/app/utils.js b/web/src/app/utils.js index d72c4c3f..2ed023fe 100644 --- a/web/src/app/utils.js +++ b/web/src/app/utils.js @@ -249,3 +249,12 @@ export async function* fetchLinesIterator(fileURL, headers) { yield chunk.substr(startIndex); // last line didn't end in a newline char } } + +export const randomAlphanumericString = (len) => { + const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; + let id = ""; + for (let i = 0; i < len; i++) { + id += alphabet[(Math.random() * alphabet.length) | 0]; + } + return id; +} diff --git a/web/src/components/SubscribeDialog.js b/web/src/components/SubscribeDialog.js index 3c83e1a1..2baecd61 100644 --- a/web/src/components/SubscribeDialog.js +++ b/web/src/components/SubscribeDialog.js @@ -9,7 +9,7 @@ import DialogTitle from '@mui/material/DialogTitle'; import {Autocomplete, Checkbox, FormControlLabel, useMediaQuery} from "@mui/material"; import theme from "./theme"; import api from "../app/Api"; -import {topicUrl, validTopic, validUrl} from "../app/utils"; +import {randomAlphanumericString, topicUrl, validTopic, validUrl} from "../app/utils"; import userManager from "../app/UserManager"; import subscriptionManager from "../app/SubscriptionManager"; import poller from "../app/Poller"; @@ -104,21 +104,26 @@ const SubscribePage = (props) => { {t("subscribe_dialog_subscribe_description")} - props.setTopic(ev.target.value)} - type="text" - fullWidth - variant="standard" - inputProps={{ - maxLength: 64, - "aria-label": t("subscribe_dialog_subscribe_topic_placeholder") - }} - /> +
+ props.setTopic(ev.target.value)} + type="text" + fullWidth + variant="standard" + inputProps={{ + maxLength: 64, + "aria-label": t("subscribe_dialog_subscribe_topic_placeholder") + }} + /> + +