diff --git a/js/app/package.json b/js/app/package.json index 09d3b8dd5..eb214d42f 100644 --- a/js/app/package.json +++ b/js/app/package.json @@ -7,17 +7,17 @@ "version": "0.12.6", "runtimeVersion": "0.12.0", "scripts": { - "start": "npx expo start -c --port 38081", + "start": "pnpm --filter @streamplace/i18n compile && npx expo start -c --port 38081", "start:fast": "npx expo start --port 38081", "dev:ios": "bash scripts/dev-ios.sh", "ui:shoot": "bash scripts/ui-shoot.sh", "android": "expo run:android --no-bundler", "ios": "expo run:ios --no-bundler", - "web": "npx expo start --web --port 38081", + "web": "pnpm --filter @streamplace/i18n compile && npx expo start --web --port 38081", "test": "jest --watchAll", "brand": "pnpm --filter @streamplace/brand generate", "build": "pnpm run build:web && pnpm run prebuild", - "build:web": "pnpm run brand && node scripts/generate-build-info.js && pnpm run export && node exportClientExpoConfig.js > dist/expoConfig.json", + "build:web": "pnpm --filter @streamplace/i18n compile && pnpm run brand && node scripts/generate-build-info.js && pnpm run export && node exportClientExpoConfig.js > dist/expoConfig.json", "export": "(expo export --dump-sourcemap || expo export --dump-sourcemap) && node scripts/bootstrap-web.mjs", "analyze:web": "pnpm run brand && EXPO_ATLAS=true expo export --platform web --output-dir .expo/atlas-web --dump-sourcemap && node scripts/bootstrap-web.mjs .expo/atlas-web && expo-atlas --no-open", "check": "pnpm --filter @streamplace/i18n compile && bash -c 'set -euo pipefail;export OUT=$(mktemp -d); npx tsc -p . --outDir $OUT; rm -rf $OUT'", diff --git a/js/i18n/locales/es-ES/common.ftl b/js/i18n/locales/es-ES/common.ftl index 56e240366..8d4b1a5dc 100644 --- a/js/i18n/locales/es-ES/common.ftl +++ b/js/i18n/locales/es-ES/common.ftl @@ -76,3 +76,7 @@ pds-selector-handle-policy-checkbox = He leído y acepto la polític ## Login login-show-live-on-bluesky = Mostrar cuando estoy en directo en Bluesky login-show-live-on-bluesky-description = Añade el anillo rojo LIVE a tu avatar de Bluesky mientras transmites y permite que Streamplace publique anuncios por ti. Desmárcalo para iniciar sesión sin conceder ningún acceso a tu cuenta de Bluesky. + +## Stream notifications +teleporting-in = Teletransportando en +teleporting-to = Teletransportando a @{ $handle } diff --git a/js/i18n/locales/fr-FR/common.ftl b/js/i18n/locales/fr-FR/common.ftl index 5b851b48f..9cf84e54d 100644 --- a/js/i18n/locales/fr-FR/common.ftl +++ b/js/i18n/locales/fr-FR/common.ftl @@ -76,3 +76,7 @@ pds-selector-handle-policy-checkbox = J'ai lu et j'accepte la politi ## Login login-show-live-on-bluesky = Afficher quand je suis en direct sur Bluesky login-show-live-on-bluesky-description = Ajoute l'anneau rouge LIVE à votre avatar Bluesky pendant vos streams et permet à Streamplace de publier des annonces pour vous. Décochez la case pour vous connecter sans accorder aucun accès à votre compte Bluesky. + +## Stream notifications +teleporting-in = Téléportation dans +teleporting-to = Téléportation vers @{ $handle } diff --git a/js/i18n/locales/pt-BR/common.ftl b/js/i18n/locales/pt-BR/common.ftl index 2809d4690..96adf49f7 100644 --- a/js/i18n/locales/pt-BR/common.ftl +++ b/js/i18n/locales/pt-BR/common.ftl @@ -76,3 +76,7 @@ pds-selector-handle-policy-checkbox = Li e concordo com a política ## Login login-show-live-on-bluesky = Mostrar quando estou ao vivo no Bluesky login-show-live-on-bluesky-description = Adiciona o anel vermelho LIVE ao seu avatar do Bluesky enquanto você transmite e permite que o Streamplace publique anúncios por você. Desmarque para entrar sem conceder nenhum acesso à sua conta do Bluesky. + +## Stream notifications +teleporting-in = Teletransportando em +teleporting-to = Teletransportando para @{ $handle } diff --git a/js/i18n/locales/ro-RO/common.ftl b/js/i18n/locales/ro-RO/common.ftl index 13b04bc3b..0187c4b35 100644 --- a/js/i18n/locales/ro-RO/common.ftl +++ b/js/i18n/locales/ro-RO/common.ftl @@ -76,3 +76,7 @@ pds-selector-handle-policy-checkbox = Am citit și sunt de acord cu ## Login login-show-live-on-bluesky = Arată când sunt live pe Bluesky login-show-live-on-bluesky-description = Adaugă inelul roșu LIVE avatarului dvs. de Bluesky în timp ce transmiteți și permite Streamplace să publice anunțuri în numele dvs. Debifați pentru a vă conecta fără a acorda niciun acces la contul dvs. de Bluesky. + +## Stream notifications +teleporting-in = Teleportare în +teleporting-to = Teleportare către @{ $handle } diff --git a/js/i18n/locales/zh-Hans/common.ftl b/js/i18n/locales/zh-Hans/common.ftl index abf41d910..c45a12883 100644 --- a/js/i18n/locales/zh-Hans/common.ftl +++ b/js/i18n/locales/zh-Hans/common.ftl @@ -71,3 +71,7 @@ pds-selector-handle-policy-checkbox = 我已阅读并同意处理政 ## Login login-show-live-on-bluesky = 在 Bluesky 上显示我的直播状态 login-show-live-on-bluesky-description = 直播时为您的 Bluesky 头像加上红色 LIVE 圆环,并允许 Streamplace 代您发布直播公告。取消勾选即可在不授予任何 Bluesky 账号访问权限的情况下登录。 + +## Stream notifications +teleporting-in = 传送倒计时 +teleporting-to = 正在传送至 @{ $handle } diff --git a/js/i18n/locales/zh-Hant/common.ftl b/js/i18n/locales/zh-Hant/common.ftl index 42d720c68..9ec07cc46 100644 --- a/js/i18n/locales/zh-Hant/common.ftl +++ b/js/i18n/locales/zh-Hant/common.ftl @@ -76,3 +76,7 @@ pds-selector-handle-policy-checkbox = 我已閱讀並同意識別碼 ## Login login-show-live-on-bluesky = 在 Bluesky 上顯示我的直播狀態 login-show-live-on-bluesky-description = 直播時為您的 Bluesky 頭像加上紅色 LIVE 圓環,並允許 Streamplace 代您發布直播公告。取消勾選即可在不授予任何 Bluesky 帳號存取權限的情況下登入。 + +## Stream notifications +teleporting-in = 傳送倒數 +teleporting-to = 正在傳送至 @{ $handle } diff --git a/js/i18n/public/locales/en-US/common.json b/js/i18n/public/locales/en-US/common.json deleted file mode 100644 index 2deeccfed..000000000 --- a/js/i18n/public/locales/en-US/common.json +++ /dev/null @@ -1,388 +0,0 @@ -{ - "loading": "Loading...", - "error": "Error", - "cancel": "Cancel", - "confirm": "Confirm", - "close": "Close", - "open": "Open", - "ok": "OK", - "yes": "Yes", - "no": "No", - "continue": "Continue", - "back": "Back", - "next": "Next", - "finish": "Finish", - "save": "Save", - "delete": "Delete", - "edit": "Edit", - "create": "Create", - "update": "Update", - "refresh": "Refresh", - "success": "Success", - "warning": "Warning", - "info": "Information", - "content-warning-badge": "Intended for certain audiences", - "content-warning-title": "Heads up!", - "content-warning-description": "This may contain:", - "search-placeholder": "Search...", - "search-for-streamers": "Search for streamers...", - "message-input": "Enter your message...", - "please-log-in-to-access-this-page": "Please log in to access this page", - "go-to-settings": "Go to Settings", - "go-back": "Go Back", - "sign-in": "Sign In", - "log-in": "Log in", - "sign-up": "Sign up", - "go-home": "Go home", - "try-again": "Try again", - "completing-sign-in": "Completing sign-in…", - "already-logged-in": "You're already logged in.", - "signed-in-as": "Signed in as @{$handle}", - "signed-in-as-code": "Signed in as {$handle}", - "sign-in-description": "Sign in with your Atmosphere account, such as your {$network} account.", - "handle-label": "Handle", - "redirecting": "Redirecting…", - "sign-in-failed": "Sign-in failed", - "welcome-user": "Welcome, {$username}!", - "notification-count": "{$count ->\n [0] No notifications\n [1] One notification\n *[other] {$count} notifications\n }", - "user-offline": "user is offline", - "user-offline-message": "{$source ->\n [streamer] Looks like <1>@{$handle} is offline, but they recommend checking out:\n *[default] Looks like <1>@{$handle} is offline, but we recommend checking out:\n }", - "user-offline-no-recommendations": "Looks like <1>@{$handle} is offline right now.\nCheck back later.", - "streaming-title": "streaming {$title}", - "viewer-count": "{$count ->\n [0] 0 viewers\n [1] 1 viewer\n *[other] {$count} viewers\n }", - "pds-selector-title": "New to the Atmosphere?", - "pds-selector-description": "Choose where your Atmosphere account is hosted. You can use it with {$network}, Streamplace, and other Atmosphere apps.", - "pds-selector-show-other-hosts": "See {$count} other account hosts", - "pds-selector-custom-label": "Another account host", - "pds-selector-custom-description": "Enter your own account host URL", - "pds-selector-custom-url-label": "Account host URL", - "pds-selector-custom-url-placeholder": "https://pds.example.com", - "pds-selector-learn-more": "Learn more about self-hosting", - "pds-selector-info": "Each host has their own policies and reliability standards. Your account data lives on the host you choose, and you can migrate later.", - "pds-selector-different-policies": "Streamplace has separate moderation policies. You can be banned from Streamplace regardless of which account host you choose.", - "pds-selector-read-policies": "Read {$label}'s Terms of Service and Privacy Policy before continuing.", - "pds-selector-handle-policy-checkbox": "I have read and agree to the handle policy", - "creator-not-found-title": "Creator not found", - "creator-not-found-description": "We couldn't find an Atmosphere account for @{$handle}.", - "creator-lookup-failed-title": "We couldn't load this creator", - "creator-lookup-failed-description": "The Atmosphere directory isn't responding right now. Try again in a moment.", - "profile": "Profile", - "more-results": "More results", - "nav-home": "Home", - "nav-videos": "Videos", - "nav-following": "Following", - "nav-account": "Account", - "chat-no-messages": "No messages yet", - "chat-scroll-to-top": "Scroll to top", - "chat-scroll-to-bottom": "Scroll to bottom", - "chat-reply-to-message": "Reply to message", - "chat-pin-message": "Pin message", - "chat-unpin-message": "Unpin message", - "chat-dismiss-pinned": "Dismiss pinned message", - "chat-view-profile-bluesky": "View profile on {$network}", - "chat-send-message": "Send a message", - "chat-replying-to": "Replying to {$handle}", - "chat-insert-emoji": "Insert emoji", - "chat-skin-tone": "Skin tone", - "chat-send-button": "Chat", - "chat-failed-send": "Failed to send message", - "chat-log-in-to": "Log in to chat", - "chat-pop-out": "Pop out chat", - "chat-close": "Close chat", - "chat-open": "Open chat", - "chat-moderation-menu": "Message options", - "chat-pin-until-stream-end": "Until stream end", - "chat-pin-duration-minutes": "{$count} min", - "chat-hide-message": "Hide message", - "chat-block-user": "Block user", - "chat-delete-message": "Delete message", - "chat-delete-confirm": "Are you sure? Click again to confirm.", - "streamer-fallback": "Streamer", - "view-profile": "View profile", - "moderation-error-title": "Moderation action failed", - "moderation-message-pinned": "Comment pinned", - "moderation-user-blocked": "{$handle} has been blocked from this channel", - "moderation-hide-failed": "Failed to hide message", - "moderation-block-failed": "Failed to block user", - "moderation-pin-failed": "Failed to pin message", - "moderation-delete-failed": "Failed to delete message", - "moderators-title": "Moderators", - "moderators-add": "Add", - "moderators-adding": "Adding…", - "moderators-loading": "Loading moderators…", - "moderators-empty": "No moderators yet", - "moderators-empty-hint": "Add moderators to help manage your chat", - "moderators-add-title": "Add Moderator", - "moderators-add-description": "Enter the DID or handle of the user you want to add as a moderator and select their permissions.", - "moderators-handle-label": "Moderator DID or handle", - "moderators-handle-placeholder": "handle.bsky.social or did:plc:…", - "moderators-permissions-label": "Permissions", - "moderators-permission-ban": "Ban users", - "moderators-permission-ban-desc": "Block users from chat", - "moderators-permission-hide": "Hide messages", - "moderators-permission-hide-desc": "Hide individual chat messages", - "moderators-permission-manage": "Manage livestream", - "moderators-permission-manage-desc": "Update stream title", - "moderators-permission-pin": "Pin messages", - "moderators-permission-pin-desc": "Pin and unpin chat messages", - "moderators-added-toast": "Moderator added", - "moderators-add-failed": "Failed to add moderator", - "moderators-remove": "Remove", - "moderators-remove-title": "Remove moderator?", - "moderators-remove-description": "This will revoke all moderation permissions for {$handle}.", - "moderators-removed-toast": "Moderator removed", - "moderators-remove-failed": "Failed to remove moderator", - "moderators-expired": "Expired", - "moderators-expires": "Expires {$date}", - "moderators-error-required": "Please enter a DID or handle", - "moderators-error-permissions": "Please select at least one permission", - "moderators-cancel": "Cancel", - "chat-report-message": "Report message…", - "report-live-stream": "Report Live Stream", - "report-something-else": "Report Something Else", - "report-title": "Report", - "report-description": "Why are you submitting this report?", - "report-reason-spam": "Spam", - "report-reason-spam-desc": "Excessive unwanted promotion, replies, mentions", - "report-reason-violation": "Rule Violation", - "report-reason-violation-desc": "Direct, blatant violation of laws or terms of service", - "report-reason-misleading": "Misleading Content", - "report-reason-misleading-desc": "Misleading identity, affiliation, or content", - "report-reason-sexual": "Sexual Content", - "report-reason-sexual-desc": "Unwanted or mislabeled sexual content", - "report-reason-rude": "Harassment", - "report-reason-rude-desc": "Rude, harassing, explicit, or otherwise unwelcoming behavior", - "report-reason-other": "Other", - "report-reason-other-desc": "Reports not falling under another report category", - "report-comments-label": "Additional comments (optional)", - "report-comments-placeholder": "Provide additional context for this report…", - "report-submit": "Submit", - "report-submitting": "Submitting…", - "report-submitted": "Report submitted", - "report-failed": "Failed to submit report", - "badge-moderator": "Moderator", - "badge-streamer": "Streamer", - "badge-vip": "VIP", - "badge-bot": "Bot", - "badge-event": "Event", - "badge-fallback": "Badge", - "badge-issued-by-streamplace": "Issued by Streamplace", - "badge-issued-by": "Issued by {$issuer}", - "badge-issued": "Issued", - "badge-self-labeled": "Self-labeled", - "badge-details": "Badge details", - "badge-back-to-profile": "Back to profile", - "badge-previous": "Previous badge", - "badge-next": "Next badge", - "badge-count": "Badge {$current} of {$total}", - "stream-details": "Stream details", - "edit-title": "Edit title", - "edit-title-dialog-title": "Edit stream title", - "edit-title-label": "Stream title", - "edit-title-saving": "Saving…", - "edit-title-saved": "Stream title updated", - "edit-title-failed": "Failed to update stream title", - "activity-events": "Events", - "activity-just-chatting": "Just Chatting", - "activity-music": "Music", - "activity-art": "Art", - "activity-software-dev": "Software Dev", - "activity-cooking": "Cooking", - "activity-miniatures": "Miniatures", - "activity-makers-crafting": "Makers & Crafting", - "activity-fitness": "Fitness", - "activity-sports": "Sports", - "watching-count": "{$count} watching", - "follow": "Follow", - "share-copy": "Copy", - "share-copied": "Copied", - "share-copy-link": "Copy Link", - "share-copy-embed-code": "Copy Embed Code", - "share-copy-embed-url": "Copy Embed URL", - "share-copy-failed": "Couldn’t copy that", - "share-video": "Share", - "share-video-message": "Watch {$title} on Streamplace", - "share-to-bluesky": "Share to {$network}", - "share-more-options": "More sharing options", - "share-failed": "Couldn’t open sharing options", - "like-video": "Like", - "unlike-video": "Unlike", - "like-update-failed": "Couldn’t update like", - "like-state-restored": "Your previous like state was restored.", - "more-actions": "More actions", - "video-tools": "Video tools", - "video-embed": "Embed", - "more-details": "More details", - "less-details": "Less details", - "offline": "Offline", - "live-badge": "Live", - "player-buffering": "Buffering", - "reconnecting": "Reconnecting…", - "stream-may-resume": "The stream may resume shortly.", - "stream-offline": "Stream offline", - "user-not-streaming": "{$user} is not currently streaming", - "stream-is-offline-title": "Stream is offline", - "user-not-streaming-check-back": "{$user} is not currently streaming. Check back later.", - "back-to-home": "Back to home", - "download-video": "Download video", - "untitled": "Untitled", - "default-stream-title": "A livestream!", - "pip-enter": "Picture-in-picture", - "pip-exit": "Exit picture-in-picture", - "theatre-enter": "Theatre mode", - "theatre-exit": "Exit theatre mode", - "teleporting-in": "Teleporting in", - "teleporting-to": "Teleporting to @{$handle}", - "views-count": "{$count ->\n [one] {$count} view\n *[other] {$count} views\n }", - "likes-count": "{$count ->\n [one] {$count} like\n *[other] {$count} likes\n }", - "could-not-load-streams": "Could not load streams. You might be offline.", - "live-now-count": "{$count ->\n [one] {$count} person live now\n *[other] {$count} people live now\n }", - "no-one-streaming": "No one is streaming right now", - "check-back-later": "Check back later?", - "hero-title": "The video layer for everything.", - "hero-description": "Streamplace is a streaming platform built on the AT Protocol.", - "learn-more": "Learn more", - "videos-title": "Videos", - "no-videos-yet": "No videos yet.", - "could-not-load-videos": "Couldn't load videos: {$error}", - "no-results-for": "No results for \"{$query}\"", - "find-streamers": "Find streamers by name or handle", - "search": "Search", - "search-failed": "Search failed", - "something-went-wrong": "Something went wrong", - "unexpected-error": "An unexpected error occurred.", - "upload-add-tag": "Add tag, press Enter", - "upload-add-thumbnail": "Add thumbnail image", - "upload-cancel": "Cancel", - "upload-choose-file": "Choose a video file", - "upload-choose-file-btn": "Choose file", - "upload-content-warnings": "Content Warnings", - "upload-delete": "Delete", - "upload-deleting": "Deleting...", - "upload-description": "Description", - "upload-description-placeholder": "Describe your video...", - "upload-details": "Details", - "upload-file": "File", - "upload-license": "License", - "upload-optional-info": "Optional · JPG, PNG up to 975KB", - "upload-preparing": "Preparing upload...", - "upload-processing": "Processing video", - "upload-publish": "Publish", - "upload-published": "Published", - "upload-publishing": "Publishing...", - "upload-publishing-btn": "Publishing...", - "upload-ready-publish": "Ready to publish", - "upload-status": "Status", - "upload-tags": "Tags", - "upload-thumbnail": "Thumbnail", - "upload-thumbnail-preview": "Thumbnail preview", - "upload-title": "Title", - "upload-title-placeholder": "Give your video a title", - "upload-update-video": "Update Video", - "upload-updating": "Updating...", - "upload-view-video": "View video →", - "upload-waiting-process": "Waiting to process...", - "create-key-description-delete-if-exposed": "If you think your stream key has been exposed, delete it immediately and create a new key.", - "create-key-description-staff": "We will never, ever, ask for your key.", - "create-key-do-not-share": "DO NOT SHARE THIS KEY, including showing it on stream. Anyone in possession of your key may be able to stream from your account.", - "create-key-title": "Are you sure about creating a new stream key?", - "create-stream-key": "Create Stream Key", - "stream-key": "Stream Key", - "stream-key-help": "Your stream key identifies you to Streamplace. You can have more than one stream key at a time, and it's a good idea to prune old keys that you aren't using via the key manager.", - "stream-key-info-description": "For security reasons, you won't be able to view it again through your account. If you lose this stream key, you'll need to generate a new one.", - "stream-key-label": "Stream Key", - "stream-key-save-now": "Please save this stream key somewhere safe.", - "allow-everyone-archive": "Allow everyone to archive your content indefinitely", - "allow-everyone-distribute": "Allow everyone to distribute your content", - "allowed-broadcasters": "Allowed Broadcasters", - "allowed-broadcasters-help": "Enter the DIDs of the broadcasters you want to allow, one per line.", - "content-rights": "Content Rights", - "content-rights-help": "Optional copyright and license information for your stream.", - "content-warnings": "Content Warnings", - "content-warnings-help": "You're required to flag your stream with themes that viewers may want a heads-up about.", - "copied-to-clipboard": "Copied to clipboard", - "copy-link": "Copy link", - "copyright-notice": "Copyright Notice", - "copyright-year": "Copyright Year", - "credit-line": "Credit Line", - "custom-license": "Custom…", - "custom-license-url": "Custom License URL/Text", - "delete-after": "Delete After", - "delete-after-help": "Duration in seconds (e.g. 300 for 5 minutes).", - "distribution": "Distribution", - "distribution-help": "Control who can redistribute your stream and for how long archives are kept.", - "editing-video": "Editing video", - "failed-to-create-key": "Failed to create key", - "go-to-video": "Go to video", - "key-manager": "Key Manager", - "license": "License", - "login-to-manage-videos": "Please log in to manage your videos.", - "login-to-upload": "Please log in to upload videos.", - "metadata": "Metadata", - "metadata-learn-more": "Learn more about content metadata", - "metadata-save-failed": "Failed to save metadata", - "metadata-saved": "Metadata saved", - "moderation": "Moderation", - "moderation-help": "Add/remove stream moderators. Moderators can hide chat messages and time out users in your chat.", - "nav-dashboard": "Dashboard", - "nav-settings": "Settings", - "no-videos-yet-upload": "No videos yet.", - "optional": "Optional", - "required": "Required", - "select-license": "Select a license…", - "login-show-live-on-bluesky": "Show when I'm live on {$network}", - "login-show-live-on-bluesky-description": "Gives your {$network} avatar the red LIVE ring while you stream and lets Streamplace post announcements for you. Uncheck to sign in without granting any access to your {$network} account.", - "player-play": "Play", - "player-pause": "Pause", - "player-mute": "Mute", - "player-unmute": "Unmute", - "player-seek": "Seek", - "player-settings": "Settings", - "player-fullscreen": "Fullscreen", - "player-exit-fullscreen": "Exit fullscreen", - "player-theatre": "Theatre mode", - "player-exit-theatre": "Exit theatre mode", - "player-pip": "Picture-in-picture", - "player-exit-pip": "Exit picture-in-picture", - "player-danmu": "Danmu", - "player-enable-danmu": "Enable danmu", - "player-disable-danmu": "Disable danmu", - "player-quality": "Quality", - "player-latency": "Latency", - "player-quality-auto": "Auto", - "player-stats": "Player stats", - "player-stats-resolution": "Resolution", - "player-stats-viewport": "Viewport", - "player-stats-bitrate": "Bitrate", - "player-stats-skipped": "Skipped", - "player-stats-buffer": "Buffer", - "player-stats-codecs": "Codecs", - "player-stats-protocol": "Protocol", - "player-stats-latency-mode": "Latency Mode", - "player-stats-render-surface": "Render Surface", - "player-stats-session": "Session", - "player-protocol-webrtc": "WebRTC", - "player-protocol-hls": "HLS", - "player-latency-low": "Low Latency", - "player-latency-standard": "Standard", - "player-error-network": "Network error", - "player-error-playback": "Playback error", - "player-error-format": "Stream format not supported", - "player-error-stream-not-live": "Stream not live", - "player-error-network-retrying": "Network error. Retrying.", - "player-error-media-recovering": "Media error. Recovering.", - "player-error-hls-unsupported": "Your browser doesn't support HLS playback.", - "player-error-stream-unavailable": "Stream unavailable. Stopped reconnecting.", - "player-error-sdp-failed": "Failed to create SDP offer", - "player-error-ice-failed": "Failed to gather ICE candidates", - "player-error-negotiation-failed": "WebRTC negotiation failed", - "player-error-stream-stalled": "Stream stalled. Reconnecting.", - "player-error-connection-lost": "Connection lost. Reconnecting.", - "upload-error-format": "File doesn't appear to be a supported video format (MP4, WebM, MKV, MOV, AVI, OGG, FLV, MPEG-TS).", - "upload-error-timeout": "Processing timed out. Please try again later.", - "upload-error-processing": "Processing failed", - "upload-error-not-logged-in": "Not logged in", - "upload-title-untitled": "Untitled", - "emoji-skin-tone": "Skin tone", - "emoji-search": "Search emoji…" -} diff --git a/js/i18n/public/locales/en-US/settings.json b/js/i18n/public/locales/en-US/settings.json deleted file mode 100644 index 1b664285a..000000000 --- a/js/i18n/public/locales/en-US/settings.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Download New Update", - "check-for-updates": "Check for Updates", - "bundled-runtype": "Bundled", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Recovery Mode", - "modal-latest-version": "You are using the latest version.", - "modal-no-update-available": "You are on the latest version of Streamplace, hooray!", - "modal-update-available-title": "Update Available", - "modal-update-available-description": "A new version of Streamplace is ready to download", - "modal-update-failed": "Update check failed. You may need to update the app through the {$store}.", - "modal-update-failed-title": "Update Failed", - "modal-update-failed-description": "Update check failed. You may need to update the app through the {$store}.", - "button-reload-app-on-update": "Apply Update (will reload app)", - "use-custom-node": "Use Custom Node", - "default-url": "Default: {$url}", - "enter-custom-node-url": "Enter custom node URL", - "save-button": "Save", - "try-new-web": "Try the new web (beta)", - "try-new-web-description": "Switch to the new web interface. You can switch back anytime from this same setting.", - "try-old-app": "Use the original interface", - "try-old-app-description": "Go back to the original Streamplace interface.", - "language-selection": "Language", - "language-selection-description": "Choose your preferred language", - "input-search-languages": "Search languages...", - "help-translate": "Help us translate Streamplace", - "help-translate-description": "We're looking for volunteers to help translate Streamplace into more languages. If you're interested, please reach out to us on Discord or GitHub!", - "currently-translating": "Translations are on the way", - "currently-translating-description": "Some parts of the app may look incomplete. Thank you for your patience!", - "debug-recording-title": "Allow {$host} to record your livestream for debugging and improving the service", - "debug-recording-description": "Optional", - "livestream-recording-title": "Record my livestreams into VODs on {$host}", - "livestream-recording-description": "When enabled, your livestreams are saved so you can finalize and publish them as videos", - "auto-publish-vods-title": "Publish my livestreams as VODs automatically", - "auto-publish-vods-description": "When a recorded livestream ends, {$host} publishes it as a video right away, without waiting for you to finalize it", - "auto-publish-vods-stream-label": "Publish VOD automatically", - "auto-publish-vods-stream-description": "Publish recorded streams as VODs automatically. Applies to future streams too, until you turn it off.", - "manage-keys": "Manage Keys", - "settings-title": "Settings", - "error": "Error", - "about": "About", - "account": "Account", - "advanced": "Advanced", - "danmu": "Danmu", - "developer": "Developer", - "languages": "Languages", - "privacy-security": "Privacy & Security", - "streaming": "Streaming", - "notifications": "Notifications", - "notifications-title": "Push Notifications", - "notifications-web-description": "Get notified when streamers you follow go live.", - "notifications-mobile-description": "Push notifications are managed by your device settings.", - "notifications-blocked-description": "Blocked — you denied notification permission in your browser.", - "notifications-blocked-help": "To re-enable, update site permissions in your browser settings, then toggle this on again.", - "cancel": "Cancel", - "create": "Create", - "delete": "Delete", - "refresh": "Refresh", - "sign-in": "Sign In", - "update": "Update", - "log-out": "Log out", - "optional": "optional", - "account-greeting": "Hey, @{$handle}.", - "edit-profile-bluesky": "Edit profile (on {$network})", - "change-name-color": "Change name color", - "key-management": "Key Management", - "key-manager": "Key Manager", - "your-stream-pubkeys": "Your Stream Public Keys", - "no-keys": "No keys configured", - "pubkey-description": "Public keys are paired with stream keys (used in streaming software) to sign and verify your stream", - "keys-count": "{$count ->\n [one] {$count} key\n *[other] {$count} keys\n }", - "backup": "Backup", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Automatically backup recordings to S3-compatible storage", - "backup-connection-url": "Connection URL", - "backup-connection-url-placeholder": "Must be a valid S3 URL in the format s3+https://ACCESS_KEY:SECRET_KEY@region.endpoi.nt/bucket", - "backup-endpoint": "Endpoint", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Bucket", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Access Key", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Secret Key", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "backup-region": "Region", - "backup-region-placeholder": "us-east-1", - "backup-test-connection": "Test Connection", - "backup-testing-connection": "Testing connection...", - "backup-connection-successful": "Connection successful", - "backup-connection-failed": "Failed to connect", - "show-password-in-url": "Show password in URL", - "show-password-in-url-description": "Display the secret key in the connection URL (if input)", - "requested-seconds-per-segment": "Seconds per segment", - "requested-seconds-per-segment-description": "Set the seconds per segment you wish to request the server use", - "recommendations": "Recommendations", - "manage-recommendations": "Manage Recommendations", - "recommendations-to-others": "Recommendations", - "recommendations-description": "Share up to 8 streamers you recommend to your viewers", - "no-recommendations-yet": "No recommendations configured yet", - "add-recommendation": "Add Recommendation", - "streamer-did": "Streamer DID", - "recommendations-count": "{$count ->\n [one] {$count} recommendation\n *[other] {$count} recommendations\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Webhook Integrations", - "webhook-integrations-description": "Connect external services to receive real-time updates about your streams", - "create-webhook": "Create Webhook", - "edit-webhook": "Edit Webhook", - "delete-webhook": "Delete Webhook", - "no-webhooks-yet": "No webhooks configured yet", - "failed-load-webhooks": "Failed to load webhooks", - "webhook-will-no-longer-receive-events": "This webhook will no longer receive events", - "create-first-webhook-description": "Create your first webhook to start receiving stream events", - "example-captain-hook": "Captain Hook", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "Activates on:", - "events": "Events", - "events-livestream": "Livestream Events", - "events-chat": "Chat Events", - "events-stream-received": "Stream Received Events", - "untitled-webhook": "Untitled Webhook", - "inactive": "Inactive", - "active": "Active", - "multistream": "Multistreaming", - "multistream-targets": "Multistream Targets", - "multistream-description": "Automatically push your Streamplace livestreams to other streaming services like Twitch or YouTube.", - "create-multistream-target": "Create Multistream Target", - "untitled-multistream-target": "Untitled Target", - "failed-load-multistream-targets": "Failed to load multistream targets. Please try again.", - "failed-toggle-multistream-target": "Failed to toggle multistream target. Please try again.", - "failed-delete-multistream-target": "Failed to delete multistream target. Please try again.", - "no-multistream-targets-yet": "No targets yet!", - "no-multistream-destinations": "No multistream destinations yet", - "multistream-targets-count": "{$count ->\n [one] {$count} target\n *[other] {$count} targets\n }", - "multistream-delete-target-confirmation": "Are you sure you want to delete \"{$target}\"?", - "this-action-cannot-be-undone": "This action cannot be undone.", - "rtmp-target-name": "RTMP Target", - "rtmp-target-url": "RTMP URL", - "rtmp-target-name-placeholder": "My Multistream Target", - "multistream-create-target": "Create Target", - "multistream-edit-target": "Edit Target", - "created": "created", - "status": "status", - "debug-recording": "Debug Recording", - "danmu-enabled": "Enable Danmu", - "danmu-enabled-description": "Display live chat messages as floating comments on your screen", - "danmu-opacity": "Opacity", - "danmu-speed": "Speed", - "danmu-lane-count": "Lane Count", - "danmu-max-messages": "Max Messages", - "app-version-description": "No updates are available at this time", - "confirm-delete": "Are you sure you want to delete this?", - "action-cannot-be-undone": "This action cannot be undone", - "name-optional": "Name (optional)", - "deleting": "Deleting...", - "saving": "Saving...", - "go-to-dashboard": "Go to Dashboard", - "need-setup-live-dashboard": "Need to set up streaming first? Visit the live dashboard", - "no-languages-found": "No languages found", - "branding": "Branding", - "branding-admin": "Branding Administration", - "branding-admin-description": "Customize your Streamplace instance. Note that settings may take a few hours to propagate.", - "branding-login-required": "Please log in to manage branding", - "branding-configuration": "Configuration", - "branding-text-settings": "Text Settings", - "branding-colors": "Colors", - "branding-legal-links": "Legal Links", - "branding-bundle": "Export and import", - "branding-bundle-description": "A bundle is a zip with branding.yaml (everything set here, with the defaults listed for reference) plus the image files. Edit the YAML by hand or import it on another node.", - "branding-bundle-export": "Download bundle", - "branding-bundle-import": "Import bundle…", - "branding-bundle-merge": "Merge: keep settings the bundle doesn't mention (otherwise they are removed)", - "branding-bundle-preview": "Changes from {$name}", - "branding-bundle-no-changes": "Nothing would change.", - "branding-bundle-apply": "Apply", - "branding-bundle-imported": "Branding imported ({$count} keys)", - "branding-bundle-import-failed": "Import failed", - "branding-bundle-export-failed": "Export failed", - "branding-bundle-invalid": "That bundle can't be imported", - "branding-navigation": "Navigation", - "branding-chat-layout": "Chat message layout", - "branding-chat-layout-description": "Compact is one line per message with the time and handle. Avatar shows each message as a post: avatar, display name, handle and age above the text.", - "branding-chat-compact": "Compact", - "branding-chat-avatar": "Avatar", - "branding-chat-name-colors": "Chat name colors", - "branding-chat-name-colors-description": "Show display names in each user's chosen chat color, or in the default text color.", - "branding-chat-name-colors-on": "User colors", - "branding-chat-name-colors-off": "Default color", - "branding-chat-badges": "Chat badges", - "branding-chat-badges-description": "Badges beside names in chat. All shows everything; Custom only shows badges issued from your badge definitions and hides the built-in streamer, moderator and bot marks; None hides every badge. Verified checks are separate.", - "branding-chat-badges-all": "All", - "branding-chat-badges-custom": "Custom only", - "branding-chat-badges-none": "None", - "branding-nav-links": "Navigation links", - "branding-nav-links-description": "Replace the sidebar's browse and creator sections with your own links: a JSON list of objects with label, url and an optional icon (home, search, play, live, bell, message, hash, list, bookmark, user, settings, video, book). Paths starting with / navigate inside the app; other URLs open as links.", - "branding-nav-cta": "Navigation button", - "branding-nav-cta-description": "A highlighted button under the navigation links: JSON with label and url.", - "branding-app-banner": "Mobile app suggestion", - "branding-app-banner-description": "On phones, the web app suggests the Streamplace mobile app: a banner in the page and, on iOS, the App Store's Smart App Banner. Turn it off for a node that is its own product.", - "branding-app-banner-on": "Suggest the app", - "branding-app-banner-off": "Off", - "branding-social-links": "Social links", - "branding-social-links-description": "The row of icon links at the bottom of the sidebar. The first field is its heading; the second is a JSON list of objects with label, url and icon, where icon is bluesky, discord, one of the navigation icon names, or socialIcon1 to socialIcon4 for an uploaded icon. Unset shows the Streamplace links; Hide removes the row.", - "branding-social-heading-placeholder": "Say Hello?", - "branding-social-hide": "Hide", - "branding-upload": "Upload", - "branding-remove": "Remove", - "branding-social-icons-description": "Uploaded icons, referenced from the list above by slot name. SVG preferred, 24 x 24, max 64KB; an SVG drawn with currentColor takes the sidebar's icon color.", - "branding-theme": "Theme", - "branding-theme-description": "Page background and text color, one pair per color scheme; the app derives its raised surfaces, muted text and hairline borders from them. Hex colors (#rrggbb). Accent and status colors are separate settings above. Leave a value unset to use the default, or set only the background and the text color is chosen to read on it.", - "branding-background-dark": "Page background (dark mode)", - "branding-foreground-dark": "Text color (dark mode)", - "branding-background-light": "Page background (light mode)", - "branding-foreground-light": "Text color (light mode)", - "branding-reset": "Reset", - "branding-default": "default", - "branding-status-colors": "Status Colors", - "branding-status-colors-description": "Colors for errors, success, warnings, informational notes and the live badge. Hex colors (#rrggbb); text on top of them is chosen automatically.", - "branding-danger-color": "Danger / error", - "branding-success-color": "Success", - "branding-warning-color": "Warning", - "branding-info-color": "Info", - "branding-live-color": "Live badge", - "branding-images": "Images", - "branding-broadcaster-did": "Broadcaster DID", - "branding-broadcaster-did-description": "Leave empty to use server default", - "branding-site-title": "Site Title", - "branding-site-title-placeholder": "Enter new site title", - "branding-site-description": "Site Description", - "branding-site-description-placeholder": "Enter site description", - "branding-link-cards": "Link cards", - "branding-link-cards-description": "What a shared link shows for each page: the stream page, the front page (live tab), the videos tab, a video page and the go-live tab. Templates take {} (the site name below, or the site title), and on pages about one account {} (their display name, else handle) and {}. Descriptions of stream and video pages are their post text.", - "branding-network-name": "Network name", - "branding-network-name-description": "What the app calls the social network viewers sign in with and share to: \"Sign in with your {$network} account\", \"Share to {$network}\", the live-ring permission. Default Bluesky.", - "branding-network-profile-url": "Profile link", - "branding-network-profile-url-description": "Where a chat user's profile link goes, from the profile card and the message menu. Use {} and {} as placeholders. Default is the Bluesky profile page.", - "branding-network-icon-description": "Icon shown on those profile links. SVG preferred, max 64KB; unset shows the Bluesky butterfly.", - "branding-verified-icon-description": "Badge shown beside verified users. SVG preferred, max 64KB, currentColor takes the primary color; unset shows a check in the primary color.", - "branding-login-placeholder": "Login handle example", - "branding-login-placeholder-description": "The example handle shown in the login form's empty handle field, e.g. you.example.com.", - "branding-default-streamer": "Default Streamer", - "branding-default-streamer-none": "None", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-default-video": "Default video", - "branding-default-video-description": "While set, the front page shows this video instead of the default streamer's stream: the replay to send everyone to after an event. Its at:// URI, or its page path (handle/video/rkey). Clear it to return the front page to the streamer.", - "branding-default-video-placeholder": "at://did:plc:.../place.stream.video/... or handle/video/rkey", - "branding-clear-default-video": "Clear default video", - "branding-clear-default-streamer": "Clear Default Streamer", - "branding-primary-color": "Primary Color", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Accent Color (secondary surfaces, highlights)", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Main Logo", - "branding-main-logo-description": "SVG, PNG, or JPEG (max 500KB)", - "branding-favicon": "Default favicon", - "branding-favicon-light": "Light mode favicon", - "branding-favicon-dark": "Dark mode favicon", - "branding-favicon-description": "SVG, PNG, or ICO (max 100KB). Used when an override is absent or the client does not support theme selection. An icon with a background works well as the default.", - "branding-favicon-override-description": "SVG, PNG, or ICO (max 100KB). Overrides the default for the browser or OS appearance, not the app theme. Transparent backgrounds are supported.", - "branding-sidebar-bg": "Sidebar Background Image", - "branding-sidebar-bg-description": "SVG, PNG, or JPEG (max 500kb) - appears aligned to bottom of sidebar, full width. Upload an image with opacity for best results, as there is not currently a separate opacity option.", - "branding-current": "Current: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Upload Logo", - "branding-delete-logo": "Delete Logo", - "branding-upload-favicon": "Upload Favicon", - "branding-delete-favicon": "Delete Favicon", - "branding-upload-background": "Upload Background", - "branding-link-banner": "Link Preview Image", - "branding-link-banner-description": "The image shown when the site's link is shared (OpenGraph / Twitter card). PNG, JPEG or WebP, 1200 x 630 recommended, max 2MB. The card's title and description come from the Site Title and Site Description above.", - "branding-upload-link-banner": "Upload Image", - "branding-delete-link-banner": "Remove Image", - "branding-delete-background": "Delete Background", - "branding-web-only": "Image uploads are only available on web.", - "refresh-branding": "Refresh branding assets", - "branding-add-legal-link": "Add Legal Link", - "branding-edit-legal-link": "Edit Legal Link", - "branding-legal-link-text-placeholder": "Link text (e.g., Privacy Policy)", - "branding-legal-link-url-placeholder": "URL (e.g., https://example.com/privacy)", - "add": "Add", - "edit": "Edit", - "branding-not-authenticated": "Please log in first", - "branding-empty-value": "Please enter a value", - "branding-update-success": "{$key} updated successfully", - "branding-upload-success": "{$key} uploaded successfully", - "branding-delete-success": "{$key} deleted successfully", - "branding-upload-failed": "Failed to upload", - "branding-delete-failed": "Failed to delete", - "branding-not-available": "File uploads are only available on web", - "node-legal-documents": "Broadcaster-specific Documents", - "backup-save": "Save backup settings", - "backup-saving": "Saving backup settings...", - "backup-secret-key-set-placeholder": "(Password already set)", - "backup-error-invalid-endpoint": "Must be a valid domain name", - "backup-error-invalid-bucket": "Must contain only lowercase letters, numbers, dots, and hyphens", - "backup-error-invalid-segment-duration": "Must be between 1 and 60 seconds", - "backup-error-load-failed": "Failed to load storage settings", - "backup-error-update-failed": "Failed to update backup status", - "backup-error-save-failed": "Failed to save storage settings", - "backup-error-missing-secret": "Cannot update S3 settings without the secret key. Please re-enter it.", - "backup-segment-duration-placeholder": "6", - "badges": "Badges", - "badges-cosmetic-section": "Cosmetic Badges", - "badges-empty-state": "You haven't been issued any badges yet.", - "badges-failed-load": "Failed to load badges", - "badges-failed-update": "Failed to update badge selection", - "badges-issued-by": "Issued by {$issuer}", - "badges-streamer-section": "Streamer Badges", - "issue-badges": "Issue Badges", - "issue-badges-back-to-definitions": "Badge Definitions", - "issue-badges-badge-name": "Badge Name", - "issue-badges-badge-name-placeholder": "e.g. VIP, Supporter", - "issue-badges-badge-type": "Badge Type", - "issue-badges-choose-image": "Choose Image", - "issue-badges-create-definition": "Create Badge Definition", - "issue-badges-create-definition-description": "Define a new badge type that can be issued to viewers", - "issue-badges-create-definition-subtitle": "Define a new badge type", - "issue-badges-definition-created": "Badge definition created", - "issue-badges-description-optional": "Description (optional)", - "issue-badges-description-placeholder": "Optional description for this badge", - "issue-badges-failed-create": "Failed to create badge definition", - "issue-badges-failed-issue": "Failed to issue badge", - "issue-badges-failed-load": "Failed to load badge definitions", - "issue-badges-image-optional": "Image (optional)", - "issue-badges-image-too-large": "Image must be under 256KB", - "issue-badges-image-web-only": "Image upload is only available on web", - "issue-badges-issue-badge": "Issue Badge", - "issue-badges-issue-badge-description": "Issue the \"{$name}\" badge to a viewer by their DID", - "issue-badges-issued": "Badge issued", - "issue-badges-issued-to": "Issued to {$did}", - "issue-badges-manage-description": "Create badge definitions and issue them to viewers", - "issue-badges-recipient-did": "Recipient DID", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Tap to issue", - "issue-badges-your-definitions": "Your Badge Definitions", - "chat-profile": "Chat Profile", - "chat-profile-login-required": "Please log in to edit your chat profile.", - "chat-profile-saved": "Chat profile saved", - "chat-profile-save-failed": "Failed to save chat profile", - "chat-profile-name-color": "Name Color", - "chat-profile-name-color-description": "Choose the color of your name in chat.", - "chat-profile-preview-message": "Hello, world!", - "chat-profile-self-labels": "Self Labels", - "chat-profile-label-bot": "Bot", - "chat-profile-label-bot-description": "Mark your chat messages as coming from a bot.", - "control-panel": "Control Panel", - "create-stream-key-in-stream-settings": "Create a stream key in Stream Settings", - "creator-settings": "Creator Settings", - "delete-all-keys": "Delete All Keys", - "delete-all-keys-btn": "Delete All", - "delete-all-keys-description": "This will permanently remove all {$count} stream keys. Any streaming software configured with these keys will stop working.", - "delete-all-keys-title": "Delete all stream keys?", - "failed-delete-keys": "Failed to delete {$count} key(s)", - "failed-to-delete-key": "Failed to delete key", - "my-videos": "My Videos", - "stream-settings": "Stream Settings", - "stream-settings-link": "Stream Settings", - "time-ago-days": "{$days}d ago", - "time-ago-hours": "{$hours}h ago", - "time-ago-minutes": "{$minutes}m ago", - "time-ago-seconds": "{$seconds}s ago", - "upload-videos": "Upload Videos" -} diff --git a/js/i18n/public/locales/es-ES/common.json b/js/i18n/public/locales/es-ES/common.json deleted file mode 100644 index c4448a6fc..000000000 --- a/js/i18n/public/locales/es-ES/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Cargando...", - "error": "Error", - "cancel": "Cancelar", - "confirm": "Confirmar", - "close": "Cerrar", - "open": "Abrir", - "ok": "OK", - "yes": "Sí", - "no": "No", - "continue": "Continuar", - "back": "Atrás", - "next": "Siguiente", - "finish": "Finalizar", - "save": "Guardar", - "delete": "Eliminar", - "edit": "Editar", - "create": "Crear", - "update": "Actualizar", - "refresh": "Actualizar", - "success": "Éxito", - "warning": "Advertencia", - "info": "Información", - "search-placeholder": "Buscar...", - "message-input": "Escribe tu mensaje...", - "please-log-in-to-access-this-page": "Por favor, inicia sesión para acceder a esta página", - "go-to-settings": "Ir a Configuración", - "go-back": "Volver", - "welcome-user": "¡Bienvenido, {$username}!", - "notification-count": "{$count ->\n [0] Sin notificaciones\n [1] Una notificación\n *[other] {$count} notificaciones\n }", - "user-offline": "usuario desconectado", - "user-offline-message": "{$source ->\n [streamer] Parece que <1>@{$handle} está desconectado, pero ellos recomiendan ver:\n *[default] Parece que <1>@{$handle} está desconectado, pero te recomendamos ver:\n }", - "user-offline-no-recommendations": "Parece que <1>@{$handle} está desconectado ahora mismo.\nVuelve más tarde.", - "streaming-title": "transmitiendo {$title}", - "viewer-count": "{$count ->\n [0] 0 espectadores\n [1] 1 espectador\n *[other] {$count} espectadores\n }", - "pds-selector-title": "¿Nuevo en Atmosphere?", - "pds-selector-description": "Necesitarás seleccionar un PDS (Servidor de Datos Personal) para acceder a apps en Atmosphere, como Bluesky, Tangled y Spark.", - "pds-selector-custom-label": "Otro PDS", - "pds-selector-custom-description": "Introduce la URL de tu propio servidor PDS", - "pds-selector-custom-url-label": "URL de PDS personalizado", - "pds-selector-custom-url-placeholder": "https://pds.ejemplo.com", - "pds-selector-learn-more": "Más información sobre el autoalojamiento", - "pds-selector-info": "Cada servidor tiene sus propias políticas y estándares de fiabilidad. Tus datos ATProto viven en el servidor que elijas y puedes migrar más tarde. Nota: Streamplace tiene sus propias reglas de moderación; puedes ser expulsado de Streamplace independientemente del servidor que elijas.", - "pds-selector-read-policies": "Lee los Términos de Servicio y la Política de Privacidad de {$label} antes de continuar.", - "pds-selector-handle-policy-checkbox": "He leído y acepto la política de identificadores", - "login-show-live-on-bluesky": "Mostrar cuando estoy en directo en Bluesky", - "login-show-live-on-bluesky-description": "Añade el anillo rojo LIVE a tu avatar de Bluesky mientras transmites y permite que Streamplace publique anuncios por ti. Desmárcalo para iniciar sesión sin conceder ningún acceso a tu cuenta de Bluesky." -} diff --git a/js/i18n/public/locales/es-ES/settings.json b/js/i18n/public/locales/es-ES/settings.json deleted file mode 100644 index cda42b357..000000000 --- a/js/i18n/public/locales/es-ES/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Descargar Nueva Actualización", - "check-for-updates": "Buscar Actualizaciones", - "bundled-runtype": "Empaquetado", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Modo de Recuperación", - "modal-latest-version": "Estás usando la última versión.", - "modal-no-update-available": "¡Tienes la versión más reciente de Streamplace, genial!", - "modal-update-available-title": "Actualización Disponible", - "modal-update-available-description": "Una nueva versión de Streamplace está lista para descargar", - "modal-update-failed": "La búsqueda de actualizaciones falló. Es posible que necesites actualizar\nla aplicación a través de {$store}.", - "modal-update-failed-title": "Actualización Falló", - "modal-update-failed-description": "La búsqueda de actualizaciones falló. Es posible que necesites actualizar\nla aplicación a través de {$store}.", - "button-reload-app-on-update": "Aplicar Actualización (recargará la aplicación)", - "use-custom-node": "Usar Nodo Personalizado", - "default-url": "Predeterminado: {$url}", - "enter-custom-node-url": "Introduce la URL del nodo personalizado", - "save-button": "Guardar", - "try-new-web": "Probar la nueva web (beta)", - "try-new-web-description": "Cambia a la nueva interfaz web. Puedes volver en cualquier momento desde este mismo ajuste.", - "try-old-app": "Usar la interfaz original", - "try-old-app-description": "Vuelve a la interfaz original de Streamplace.", - "language-selection": "Idioma", - "language-selection-description": "Elige tu idioma preferido", - "help-translate": "Ayúdanos a traducir Streamplace", - "help-translate-description": "Buscamos voluntarios para ayudar a traducir Streamplace a más idiomas. Si te interesa, contáctanos en Discord o GitHub!", - "currently-translating": "Las traducciones están en camino", - "currently-translating-description": "Algunas partes de la aplicación pueden verse incompletas. ¡Gracias por tu paciencia!", - "debug-recording-title": "Permitir que {$host} grabe tu retransmisión en directo para depuración y mejora del servicio", - "debug-recording-description": "Opcional", - "input-search-languages": "Buscar idiomas...", - "manage-keys": "Gestionar Claves", - "settings-title": "Configuración", - "loading": "Cargando...", - "error": "Error", - "cancel": "Cancelar", - "confirm": "Confirmar", - "welcome-user": "¡Bienvenido, {$username}!", - "notification-count": "{$count ->\n [0] Sin notificaciones\n [1] Una notificación\n *[other] {$count} notificaciones\n }", - "search-placeholder": "Buscar...", - "message-input": "Introduce tu mensaje...", - "success": "Éxito", - "warning": "Aviso", - "info": "Información", - "close": "Cerrar", - "open": "Abrir", - "delete": "Eliminar", - "edit": "Editar", - "create": "Crear", - "update": "Actualizar", - "refresh": "Actualizar", - "save": "Guardar", - "cancel-button": "Cancelar", - "ok": "Aceptar", - "yes": "Sí", - "no": "No", - "continue": "Continuar", - "back": "Volver", - "next": "Siguiente", - "finish": "Finalizar", - "about": "Acerca de", - "account": "Cuenta", - "advanced": "Avanzado", - "danmu": "Danmu", - "developer": "Desarrollador", - "languages": "Idiomas", - "privacy-security": "Privacidad y Seguridad", - "streaming": "Transmisión", - "notifications": "Notificaciones", - "sign-in": "Iniciar Sesión", - "log-out": "Cerrar sesión", - "account-greeting": "Hola, @{$handle}.", - "edit-profile-bluesky": "Editar perfil (en Bluesky)", - "change-name-color": "Cambiar color de nombre", - "key-management": "Gestión de Claves", - "key-manager": "Gestor de Claves", - "your-stream-pubkeys": "Tus Claves Públicas de Transmisión", - "no-keys": "No hay claves configuradas", - "pubkey-description": "Las claves públicas se emparejan con claves de transmisión (usadas en software de transmitiendo) para firmar y verificar tu transmisión", - "keys-count": "{$count ->\n [one] {$count} clave\n [many] {$count} claves\n *[other] {$count} claves\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Integraciones de Webhook", - "webhook-integrations-description": "Conecta servicios externos para recibir actualizaciones en tiempo real sobre tus transmisiones", - "create-webhook": "Crear Webhook", - "edit-webhook": "Editar Webhook", - "delete-webhook": "Eliminar Webhook", - "no-webhooks-yet": "Aún no hay webhooks configurados", - "failed-load-webhooks": "Error al cargar webhooks", - "webhook-will-no-longer-receive-events": "Este webhook ya no recibirá eventos", - "create-first-webhook-description": "Crea tu primer webhook para empezar a recibir eventos de transmisión", - "example-captain-hook": "Capitán Garfio", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "Activa en:", - "events-livestream": "Eventos de Transmisión en Directo", - "events-chat": "Eventos de Chat", - "untitled-webhook": "Webhook Sin Título", - "inactive": "Inactivo", - "debug-recording": "Grabación de Depuración", - "danmu-enabled": "Habilitar Danmu", - "danmu-enabled-description": "Muestra mensajes de chat en vivo como comentarios flotantes en tu pantalla", - "danmu-opacity": "Opacidad", - "danmu-speed": "Velocidad", - "danmu-lane-count": "Número de Carriles", - "danmu-max-messages": "Mensajes Máximos", - "app-version-description": "Información de la versión actual", - "confirm-delete": "¿Estás seguro de que quieres eliminar esto?", - "action-cannot-be-undone": "Esta acción no se puede deshacer", - "name-optional": "Nombre (opcional)", - "deleting": "Eliminando...", - "saving": "Guardando...", - "go-to-dashboard": "Ir al Panel", - "need-setup-live-dashboard": "Primero necesitas configurar una transmisión en directo en el panel", - "no-languages-found": "No se encontraron idiomas", - "backup-save": "Guardar ajustes de copia de seguridad", - "backup-saving": "Guardando ajustes de copia de seguridad...", - "backup-secret-key-set-placeholder": "(Contraseña ya establecida)", - "backup-error-invalid-endpoint": "Debe ser un nombre de dominio válido", - "backup-error-invalid-bucket": "Debe contener solo letras minúsculas, números, puntos y guiones", - "backup-error-invalid-segment-duration": "Debe estar entre 1 y 60 segundos", - "backup-error-load-failed": "Error al cargar los ajustes de almacenamiento", - "backup-error-update-failed": "Error al actualizar el estado de la copia de seguridad", - "backup-error-save-failed": "Error al guardar los ajustes de almacenamiento", - "backup-error-missing-secret": "No se pueden actualizar los ajustes de S3 sin la clave secreta. Por favor, vuelva a introducirla.", - "backup-segment-duration-placeholder": "6", - "backup": "Copia de seguridad", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Respaldar automáticamente las grabaciones en almacenamiento compatible con S3", - "backup-connection-url": "URL de conexión", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "Punto de conexión", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Contenedor", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Clave de acceso", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Clave secreta", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "Mostrar contraseña en la URL", - "show-password-in-url-description": "Mostrar la clave secreta en la URL de conexión (si se introduce)", - "recommendations-to-others": "Recomendaciones a otros", - "recommendations-description": "Comparte hasta 8 streamers que recomiendas a tus espectadores", - "no-recommendations-yet": "No hay recomendaciones configuradas todavía", - "multistream": "Multi-transmisión", - "multistream-targets": "Objetivos de multi-transmisión", - "multistream-description": "Envía automáticamente tus transmisiones en directo de Streamplace a otros servicios de streaming como Twitch o YouTube.", - "create-multistream-target": "Crear objetivo de multi-transmisión", - "untitled-multistream-target": "Objetivo sin título", - "failed-load-multistream-targets": "Error al cargar los objetivos de multi-transmisión. Por favor, inténtalo de nuevo.", - "failed-toggle-multistream-target": "Error al cambiar el estado del objetivo de multi-transmisión. Por favor, inténtalo de nuevo.", - "no-multistream-targets-yet": "¡Aún no hay objetivos!", - "multistream-targets-count": "{$count ->\n [one] {$count} objetivo\n [many] {$count} objetivos\n *[other] {$count} objetivos\n }", - "multistream-delete-target-confirmation": "¿Estás seguro de que quieres eliminar \"{$target}\"?", - "this-action-cannot-be-undone": "Esta acción no se puede deshacer.", - "rtmp-target-name": "Objetivo RTMP", - "rtmp-target-url": "URL de RTMP", - "rtmp-target-name-placeholder": "Mi objetivo de multi-transmisión", - "multistream-create-target": "Crear objetivo", - "multistream-edit-target": "Editar objetivo", - "created": "creado", - "status": "estado", - "branding": "Branding", - "branding-admin": "Administración de branding", - "branding-admin-description": "Personaliza tu instancia de Streamplace. Ten en cuenta que la configuración puede tardar varias horas en propagarse.", - "branding-login-required": "Por favor, inicia sesión para gestionar el branding", - "branding-configuration": "Configuración", - "branding-text-settings": "Configuración de texto", - "branding-colors": "Colores", - "branding-legal-links": "Vínculos legales", - "branding-images": "Imágenes", - "branding-broadcaster-did": "DID del radiodifusor", - "branding-broadcaster-did-description": "Dejar vacío para usar el valor predeterminado del servidor", - "branding-site-title": "Título del sitio", - "branding-site-title-placeholder": "Introduce un nuevo título de sitio", - "branding-site-description": "Descripción del sitio", - "branding-site-description-placeholder": "Introduce la descripción del sitio", - "branding-default-streamer": "Streamer predeterminado", - "branding-default-streamer-none": "Ninguno", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Quitar streamer predeterminado", - "branding-primary-color": "Color principal", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Color de acento", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG o JPEG (máx. 500KB)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG o ICO (máx. 100KB)", - "branding-sidebar-bg": "Imagen de fondo de la barra lateral", - "branding-sidebar-bg-description": "SVG, PNG o JPEG (máx. 500kb) - aparece alineada en la parte inferior de la barra lateral, a todo el ancho. Sube una imagen con opacidad para mejores resultados, ya que actualmente no hay una opción de opacidad separada.", - "branding-current": "Actual: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Subir logo", - "branding-delete-logo": "Eliminar logo", - "branding-upload-favicon": "Subir favicon", - "branding-delete-favicon": "Eliminar favicon", - "branding-upload-background": "Subir imagen de fondo", - "branding-delete-background": "Eliminar imagen de fondo", - "branding-web-only": "La subida de imágenes solo está disponible en la web.", - "refresh-branding": "Actualizar recursos de branding", - "branding-add-legal-link": "Agregar vínculo legal", - "branding-edit-legal-link": "Editar vínculo legal", - "branding-legal-link-text-placeholder": "Texto del vínculo (ej., Política de Privacidad)", - "branding-legal-link-url-placeholder": "URL (ej., https://ejemplo.com/privacidad)", - "add": "Agregar", - "active": "Activo", - "optional": "opcional", - "branding-not-authenticated": "Por favor, inicia sesión primero", - "branding-empty-value": "Por favor, introduce un valor", - "branding-update-success": "{$key} actualizado correctamente", - "branding-upload-success": "{$key} subido correctamente", - "branding-delete-success": "{$key} eliminado correctamente", - "branding-upload-failed": "Error al subir", - "branding-delete-failed": "Error al eliminar", - "branding-not-available": "La subida de archivos solo está disponible en la web", - "node-legal-documents": "Documentos específicos del radiodifusor", - "badges": "Insignias", - "badges-cosmetic-section": "Insignias cosméticas", - "badges-empty-state": "Aún no te han otorgado ninguna insignia.", - "badges-failed-load": "Error al cargar las insignias", - "badges-failed-update": "Error al actualizar la selección de insignias", - "badges-issued-by": "Otorgada por {$issuer}", - "badges-streamer-section": "Insignias del streamer", - "issue-badges": "Emitir insignias", - "issue-badges-back-to-definitions": "Definiciones de insignias", - "issue-badges-badge-name": "Nombre de la insignia", - "issue-badges-badge-name-placeholder": "ej. VIP, Colaborador", - "issue-badges-badge-type": "Tipo de insignia", - "issue-badges-choose-image": "Elegir imagen", - "issue-badges-create-definition": "Crear definición de insignia", - "issue-badges-create-definition-description": "Define un nuevo tipo de insignia que se puede otorgar a los espectadores", - "issue-badges-create-definition-subtitle": "Define un nuevo tipo de insignia", - "issue-badges-definition-created": "Definición de insignia creada", - "issue-badges-description-optional": "Descripción (opcional)", - "issue-badges-description-placeholder": "Descripción opcional para esta insignia", - "issue-badges-failed-create": "Error al crear la definición de insignia", - "issue-badges-failed-issue": "Error al emitir la insignia", - "issue-badges-failed-load": "Error al cargar las definiciones de insignias", - "issue-badges-image-optional": "Imagen (opcional)", - "issue-badges-image-too-large": "La imagen debe ser menor de 256KB", - "issue-badges-image-web-only": "La subida de imágenes solo está disponible en la web", - "issue-badges-issue-badge": "Emitir insignia", - "issue-badges-issue-badge-description": "Emite la insignia \"{$name}\" a un espectador mediante su DID", - "issue-badges-issued": "Insignia emitida", - "issue-badges-issued-to": "Emitida a {$did}", - "issue-badges-manage-description": "Crea definiciones de insignias y emítelas a los espectadores", - "issue-badges-recipient-did": "DID del destinatario", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Toca para emitir", - "issue-badges-your-definitions": "Tus definiciones de insignias" -} diff --git a/js/i18n/public/locales/fr-FR/common.json b/js/i18n/public/locales/fr-FR/common.json deleted file mode 100644 index 1a6809ae6..000000000 --- a/js/i18n/public/locales/fr-FR/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Chargement...", - "error": "Erreur", - "cancel": "Annuler", - "confirm": "Confirmer", - "close": "Fermer", - "open": "Ouvrir", - "ok": "OK", - "yes": "Oui", - "no": "Non", - "continue": "Continuer", - "back": "Retour", - "next": "Suivant", - "finish": "Terminer", - "save": "Enregistrer", - "delete": "Supprimer", - "edit": "Modifier", - "create": "Créer", - "update": "Mettre à jour", - "refresh": "Actualiser", - "success": "Succès", - "warning": "Avertissement", - "info": "Information", - "search-placeholder": "Rechercher...", - "message-input": "Entrez votre message...", - "please-log-in-to-access-this-page": "Veuillez vous connecter pour accéder à cette page", - "go-to-settings": "Aller aux Paramètres", - "go-back": "Retour", - "welcome-user": "Bienvenue, {$username} !", - "notification-count": "{$count ->\n [0] Aucune notification\n [1] Une notification\n *[other] {$count} notifications\n }", - "user-offline": "utilisateur hors ligne", - "user-offline-message": "{$source ->\n [streamer] On dirait que <1>@{$handle} est hors ligne, mais ils recommandent de regarder :\n *[default] On dirait que <1>@{$handle} est hors ligne, mais nous recommandons de regarder :\n }", - "user-offline-no-recommendations": "On dirait que <1>@{$handle} est hors ligne maintenant.\nRevenez plus tard.", - "streaming-title": "diffusion de {$title}", - "viewer-count": "{$count ->\n [0] 0 spectateurs\n [1] 1 spectateur\n *[other] {$count} spectateurs\n }", - "pds-selector-title": "Nouveau sur Atmosphere ?", - "pds-selector-description": "Vous devrez sélectionner un PDS (Serveur de Données Personnel) pour accéder aux applications sur Atmosphere, comme Bluesky, Tangled et Spark.", - "pds-selector-custom-label": "Un autre PDS", - "pds-selector-custom-description": "Saisissez l'URL de votre propre hôte PDS", - "pds-selector-custom-url-label": "URL PDS personnalisée", - "pds-selector-custom-url-placeholder": "https://pds.exemple.com", - "pds-selector-learn-more": "En savoir plus sur l'auto-hébergement", - "pds-selector-info": "Chaque hôte a ses propres politiques et normes de fiabilité. Vos données ATProto se trouvent sur l'hôte que vous choisissez et vous pouvez migrer ultérieurement. Remarque : Streamplace a ses propres règles de modération — vous pouvez être banni de Streamplace quel que soit l'hôte choisi.", - "pds-selector-read-policies": "Lisez les Conditions d'utilisation et la Politique de confidentialité de {$label} avant de continuer.", - "pds-selector-handle-policy-checkbox": "J'ai lu et j'accepte la politique des identifiants", - "login-show-live-on-bluesky": "Afficher quand je suis en direct sur Bluesky", - "login-show-live-on-bluesky-description": "Ajoute l'anneau rouge LIVE à votre avatar Bluesky pendant vos streams et permet à Streamplace de publier des annonces pour vous. Décochez la case pour vous connecter sans accorder aucun accès à votre compte Bluesky." -} diff --git a/js/i18n/public/locales/fr-FR/settings.json b/js/i18n/public/locales/fr-FR/settings.json deleted file mode 100644 index 4cdf81ac7..000000000 --- a/js/i18n/public/locales/fr-FR/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Télécharger la nouvelle mise à jour", - "check-for-updates": "Vérifier les mises à jour", - "bundled-runtype": "Inclus", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Mode de récupération", - "modal-latest-version": "Vous utilisez la dernière version.", - "modal-no-update-available": "Vous avez la dernière version de Streamplace, génial !", - "modal-update-available-title": "Mise à jour disponible", - "modal-update-available-description": "Une nouvelle version de Streamplace est prête à télécharger", - "modal-update-failed": "La vérification des mises à jour a échoué. Vous devrez peut-être mettre à jour l'application via {$store}.", - "modal-update-failed-title": "Échec de la mise à jour", - "modal-update-failed-description": "La vérification des mises à jour a échoué. Vous devrez peut-être mettre à jour l'application via {$store}.", - "button-reload-app-on-update": "Appliquer la mise à jour (l'application va se recharger)", - "use-custom-node": "Utiliser un nœud personnalisé", - "default-url": "Par défaut : {$url}", - "enter-custom-node-url": "Saisir l'URL du nœud personnalisé", - "save-button": "Enregistrer", - "try-new-web": "Essayer la nouvelle web (bêta)", - "try-new-web-description": "Passez à la nouvelle interface web. Vous pouvez revenir à tout moment depuis ce même réglage.", - "try-old-app": "Utiliser l'interface d'origine", - "try-old-app-description": "Revenir à l'interface d'origine de Streamplace.", - "language-selection": "Langue", - "language-selection-description": "Choisissez votre langue préférée", - "help-translate": "Aidez-nous à traduire Streamplace", - "help-translate-description": "Nous recherchons des bénévoles pour aider à traduire Streamplace dans plus de langues. Si vous êtes intéressé, contactez-nous sur Discord ou GitHub !", - "currently-translating": "Les traductions sont en cours", - "currently-translating-description": "Certaines parties de l'application peuvent sembler incomplètes. Merci pour votre patience !", - "debug-recording-title": "Autoriser {$host} à enregistrer votre diffusion en direct pour le débogage et l'amélioration du service", - "debug-recording-description": "Optionnel", - "input-search-languages": "Rechercher des langues...", - "manage-keys": "Gérer les Clés", - "settings-title": "Paramètres", - "loading": "Chargement...", - "error": "Erreur", - "cancel": "Annuler", - "confirm": "Confirmer", - "welcome-user": "Bienvenue, {$username} !", - "notification-count": "{$count ->\n [0] Aucune notification\n [1] Une notification\n *[other] {$count} notifications\n }", - "search-placeholder": "Rechercher...", - "message-input": "Saisissez votre message...", - "success": "Succès", - "warning": "Attention", - "info": "Information", - "close": "Fermer", - "open": "Ouvrir", - "delete": "Supprimer", - "edit": "Modifier", - "create": "Créer", - "update": "Mettre à jour", - "refresh": "Actualiser", - "save": "Enregistrer", - "cancel-button": "Annuler", - "ok": "OK", - "yes": "Oui", - "no": "Non", - "continue": "Continuer", - "back": "Retour", - "next": "Suivant", - "finish": "Terminer", - "about": "À propos", - "account": "Compte", - "advanced": "Avancé", - "danmu": "Danmu", - "developer": "Développeur", - "languages": "Langues", - "privacy-security": "Confidentialité et Sécurité", - "streaming": "Diffusion", - "notifications": "Notifications", - "sign-in": "Se connecter", - "log-out": "Se déconnecter", - "account-greeting": "Salut, @{$handle}.", - "edit-profile-bluesky": "Modifier le profil (sur Bluesky)", - "change-name-color": "Changer la couleur du nom", - "key-management": "Gestion des Clés", - "key-manager": "Gestionnaire de Clés", - "your-stream-pubkeys": "Vos Clés Publiques de Diffusion", - "no-keys": "Aucune clé configurée", - "pubkey-description": "Les clés publiques sont associées aux clés de diffusion (utilisées dans le logiciel de streaming) pour signer et vérifier votre diffusion", - "keys-count": "{$count ->\n [one] {$count} clé\n [many] {$count} clés\n *[other] {$count} clés\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Intégrations de Webhook", - "webhook-integrations-description": "Connectez des services externes pour recevoir des mises à jour en temps réel sur vos diffusions", - "create-webhook": "Créer un Webhook", - "edit-webhook": "Modifier le Webhook", - "delete-webhook": "Supprimer le Webhook", - "no-webhooks-yet": "Aucun webhook configuré pour le moment", - "failed-load-webhooks": "Échec du chargement des webhooks", - "webhook-will-no-longer-receive-events": "Ce webhook ne recevra plus d'événements", - "create-first-webhook-description": "Créez votre premier webhook pour commencer à recevoir des événements de diffusion", - "example-captain-hook": "Capitaine Crochet", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "S'active sur :", - "events-livestream": "Événements de Diffusion en Direct", - "events-chat": "Événements de Chat", - "untitled-webhook": "Webhook Sans Titre", - "inactive": "Inactif", - "debug-recording": "Enregistrement de Débogage", - "danmu-enabled": "Activer Danmu", - "danmu-enabled-description": "Afficher les messages de chat en direct sous forme de commentaires flottants sur votre écran", - "danmu-opacity": "Opacité", - "danmu-speed": "Vitesse", - "danmu-lane-count": "Nombre de Voies", - "danmu-max-messages": "Messages Maximum", - "app-version-description": "Informations sur la version actuelle", - "confirm-delete": "Êtes-vous sûr de vouloir supprimer ceci ?", - "action-cannot-be-undone": "Cette action ne peut pas être annulée", - "name-optional": "Nom (optionnel)", - "deleting": "Suppression...", - "saving": "Enregistrement...", - "go-to-dashboard": "Aller au Tableau de Bord", - "need-setup-live-dashboard": "Vous devez d'abord configurer une diffusion en direct dans le tableau de bord", - "no-languages-found": "Aucune langue trouvée", - "backup-save": "Enregistrer les paramètres de sauvegarde", - "backup-saving": "Enregistrement des paramètres de sauvegarde...", - "backup-secret-key-set-placeholder": "(Mot de passe déjà défini)", - "backup-error-invalid-endpoint": "Doit être un nom de domaine valide", - "backup-error-invalid-bucket": "Doit contenir uniquement des lettres minuscules, des chiffres, des points et des traits d'union", - "backup-error-invalid-segment-duration": "Doit être compris entre 1 et 60 secondes", - "backup-error-load-failed": "Échec du chargement des paramètres de stockage", - "backup-error-update-failed": "Échec de la mise à jour de l'état de la sauvegarde", - "backup-error-save-failed": "Échec de l'enregistrement des paramètres de stockage", - "backup-error-missing-secret": "Impossible de mettre à jour les paramètres S3 sans la clé secrète. Veuillez la saisir à nouveau.", - "backup-segment-duration-placeholder": "6", - "backup": "Sauvegarde", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Sauvegarder automatiquement les enregistrements dans un stockage compatible S3", - "backup-connection-url": "URL de connexion", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "Point de terminaison", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Compartiment", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Clé d'accès", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Clé secrète", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "Afficher le mot de passe dans l'URL", - "show-password-in-url-description": "Afficher la clé secrète dans l'URL de connexion (si saisie)", - "recommendations-to-others": "Recommandations aux autres", - "recommendations-description": "Partagez jusqu'à 8 streameurs que vous recommandez à vos spectateurs", - "no-recommendations-yet": "Aucune recommandation configurée pour le moment", - "multistream": "Multidiffusion", - "multistream-targets": "Cibles de multidiffusion", - "multistream-description": "Envoyez automatiquement vos diffusions en direct Streamplace vers d'autres services comme Twitch ou YouTube.", - "create-multistream-target": "Créer une cible de multidiffusion", - "untitled-multistream-target": "Cible sans titre", - "failed-load-multistream-targets": "Échec du chargement des cibles de multidiffusion. Veuillez réessayer.", - "failed-toggle-multistream-target": "Échec du basculement de la cible de multidiffusion. Veuillez réessayer.", - "no-multistream-targets-yet": "Aucune cible pour le moment !", - "multistream-targets-count": "{$count ->\n [one] {$count} cible\n [many] {$count} cibles\n *[other] {$count} cibles\n }", - "multistream-delete-target-confirmation": "Êtes-vous sûr de vouloir supprimer \"{$target}\" ?", - "this-action-cannot-be-undone": "Cette action ne peut pas être annulée.", - "rtmp-target-name": "Cible RTMP", - "rtmp-target-url": "URL RTMP", - "rtmp-target-name-placeholder": "Ma cible de multidiffusion", - "multistream-create-target": "Créer la cible", - "multistream-edit-target": "Modifier la cible", - "created": "créé", - "status": "statut", - "branding": "Image de marque", - "branding-admin": "Administration de l'image de marque", - "branding-admin-description": "Personnalisez votre instance Streamplace. Notez que les paramètres peuvent prendre quelques heures à se propager.", - "branding-login-required": "Veuillez vous connecter pour gérer l'image de marque", - "branding-configuration": "Configuration", - "branding-text-settings": "Paramètres de texte", - "branding-colors": "Couleurs", - "branding-legal-links": "Liens légaux", - "branding-images": "Images", - "branding-broadcaster-did": "DID du diffuseur", - "branding-broadcaster-did-description": "Laisser vide pour utiliser la valeur par défaut du serveur", - "branding-site-title": "Titre du site", - "branding-site-title-placeholder": "Saisir un nouveau titre de site", - "branding-site-description": "Description du site", - "branding-site-description-placeholder": "Saisir la description du site", - "branding-default-streamer": "Streameur par défaut", - "branding-default-streamer-none": "Aucun", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Effacer le streameur par défaut", - "branding-primary-color": "Couleur principale", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Couleur d'accent", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG ou JPEG (max 500 Ko)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG ou ICO (max 100 Ko)", - "branding-sidebar-bg": "Image d'arrière-plan de la barre latérale", - "branding-sidebar-bg-description": "SVG, PNG ou JPEG (max 500 ko) - apparaît aligné en bas de la barre latérale, pleine largeur. Téléchargez une image avec opacité pour de meilleurs résultats, car il n'existe pas actuellement d'option d'opacité séparée.", - "branding-current": "Actuel : {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Télécharger le logo", - "branding-delete-logo": "Supprimer le logo", - "branding-upload-favicon": "Télécharger le favicon", - "branding-delete-favicon": "Supprimer le favicon", - "branding-upload-background": "Télécharger l'arrière-plan", - "branding-delete-background": "Supprimer l'arrière-plan", - "branding-web-only": "Les téléchargements d'images ne sont disponibles que sur le web.", - "refresh-branding": "Actualiser les ressources de l'image de marque", - "branding-add-legal-link": "Ajouter un lien légal", - "branding-edit-legal-link": "Modifier le lien légal", - "branding-legal-link-text-placeholder": "Texte du lien (ex., Politique de confidentialité)", - "branding-legal-link-url-placeholder": "URL (ex., https://exemple.com/confidentialite)", - "add": "Ajouter", - "active": "Actif", - "optional": "optionnel", - "branding-not-authenticated": "Veuillez d'abord vous connecter", - "branding-empty-value": "Veuillez saisir une valeur", - "branding-update-success": "{$key} mis à jour avec succès", - "branding-upload-success": "{$key} téléchargé avec succès", - "branding-delete-success": "{$key} supprimé avec succès", - "branding-upload-failed": "Échec du téléchargement", - "branding-delete-failed": "Échec de la suppression", - "branding-not-available": "Les téléchargements de fichiers ne sont disponibles que sur le web", - "node-legal-documents": "Documents spécifiques au diffuseur", - "badges": "Badges", - "badges-cosmetic-section": "Badges cosmétiques", - "badges-empty-state": "Vous n'avez pas encore reçu de badges.", - "badges-failed-load": "Échec du chargement des badges", - "badges-failed-update": "Échec de la mise à jour de la sélection de badges", - "badges-issued-by": "Délivré par {$issuer}", - "badges-streamer-section": "Badges du streameur", - "issue-badges": "Délivrer des badges", - "issue-badges-back-to-definitions": "Définitions de badges", - "issue-badges-badge-name": "Nom du badge", - "issue-badges-badge-name-placeholder": "ex. VIP, Supporter", - "issue-badges-badge-type": "Type de badge", - "issue-badges-choose-image": "Choisir une image", - "issue-badges-create-definition": "Créer une définition de badge", - "issue-badges-create-definition-description": "Définissez un nouveau type de badge qui peut être délivré aux spectateurs", - "issue-badges-create-definition-subtitle": "Définir un nouveau type de badge", - "issue-badges-definition-created": "Définition de badge créée", - "issue-badges-description-optional": "Description (optionnelle)", - "issue-badges-description-placeholder": "Description optionnelle pour ce badge", - "issue-badges-failed-create": "Échec de la création de la définition de badge", - "issue-badges-failed-issue": "Échec de la délivrance du badge", - "issue-badges-failed-load": "Échec du chargement des définitions de badges", - "issue-badges-image-optional": "Image (optionnelle)", - "issue-badges-image-too-large": "L'image doit faire moins de 256 Ko", - "issue-badges-image-web-only": "Le téléchargement d'images n'est disponible que sur le web", - "issue-badges-issue-badge": "Délivrer un badge", - "issue-badges-issue-badge-description": "Délivrez le badge \"{$name}\" à un spectateur par son DID", - "issue-badges-issued": "Badge délivré", - "issue-badges-issued-to": "Délivré à {$did}", - "issue-badges-manage-description": "Créez des définitions de badges et délivrez-les aux spectateurs", - "issue-badges-recipient-did": "DID du destinataire", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Appuyer pour délivrer", - "issue-badges-your-definitions": "Vos définitions de badges" -} diff --git a/js/i18n/public/locales/pt-BR/common.json b/js/i18n/public/locales/pt-BR/common.json deleted file mode 100644 index 348dd8f80..000000000 --- a/js/i18n/public/locales/pt-BR/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Carregando...", - "error": "Erro", - "cancel": "Cancelar", - "confirm": "Confirmar", - "close": "Fechar", - "open": "Abrir", - "ok": "OK", - "yes": "Sim", - "no": "Não", - "continue": "Continuar", - "back": "Voltar", - "next": "Próximo", - "finish": "Concluir", - "save": "Salvar", - "delete": "Excluir", - "edit": "Editar", - "create": "Criar", - "update": "Atualizar", - "refresh": "Atualizar", - "success": "Sucesso", - "warning": "Aviso", - "info": "Informação", - "search-placeholder": "Pesquisar...", - "message-input": "Digite sua mensagem...", - "please-log-in-to-access-this-page": "Por favor, faça login para acessar esta página", - "go-to-settings": "Ir para Configurações", - "go-back": "Voltar", - "welcome-user": "Bem-vindo, {$username}!", - "notification-count": "{$count ->\n [0] Nenhuma notificação\n [1] Uma notificação\n *[other] {$count} notificações\n }", - "user-offline": "usuário offline", - "user-offline-message": "{$source ->\n [streamer] Parece que <1>@{$handle} está offline, mas eles recomendam assistir:\n *[default] Parece que <1>@{$handle} está offline, mas recomendamos assistir:\n }", - "user-offline-no-recommendations": "Parece que <1>@{$handle} está offline agora.\nVolte mais tarde.", - "streaming-title": "transmitindo {$title}", - "viewer-count": "{$count ->\n [0] 0 espectadores\n [1] 1 espectador\n *[other] {$count} espectadores\n }", - "pds-selector-title": "Novo no Atmosphere?", - "pds-selector-description": "Você precisará selecionar um PDS (Servidor de Dados Pessoal) para acessar apps no Atmosphere, como Bluesky, Tangled e Spark.", - "pds-selector-custom-label": "Outro PDS", - "pds-selector-custom-description": "Digite a URL do seu próprio host PDS", - "pds-selector-custom-url-label": "URL do PDS personalizado", - "pds-selector-custom-url-placeholder": "https://pds.exemplo.com", - "pds-selector-learn-more": "Saiba mais sobre auto-hospedagem", - "pds-selector-info": "Cada host tem suas próprias políticas e padrões de confiabilidade. Seus dados ATProto ficam no host que você escolher e você pode migrar depois. Nota: O Streamplace tem suas próprias regras de moderação — você pode ser banido do Streamplace independentemente do host escolhido.", - "pds-selector-read-policies": "Leia os Termos de Serviço e a Política de Privacidade de {$label} antes de continuar.", - "pds-selector-handle-policy-checkbox": "Li e concordo com a política de identificadores", - "login-show-live-on-bluesky": "Mostrar quando estou ao vivo no Bluesky", - "login-show-live-on-bluesky-description": "Adiciona o anel vermelho LIVE ao seu avatar do Bluesky enquanto você transmite e permite que o Streamplace publique anúncios por você. Desmarque para entrar sem conceder nenhum acesso à sua conta do Bluesky." -} diff --git a/js/i18n/public/locales/pt-BR/settings.json b/js/i18n/public/locales/pt-BR/settings.json deleted file mode 100644 index f0d956b57..000000000 --- a/js/i18n/public/locales/pt-BR/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Baixar Nova Atualização", - "check-for-updates": "Verificar Atualizações", - "bundled-runtype": "Empacotado", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Modo de Recuperação", - "modal-latest-version": "Você está usando a versão mais recente.", - "modal-no-update-available": "Você está na versão mais recente do Streamplace, eba!", - "modal-update-available-title": "Atualização Disponível", - "modal-update-available-description": "Uma nova versão do Streamplace está pronta para download", - "modal-update-failed": "A verificação de atualizações falhou. Você pode precisar atualizar o aplicativo através do {$store}.", - "modal-update-failed-title": "Atualização Falhou", - "modal-update-failed-description": "A verificação de atualizações falhou. Você pode precisar atualizar o aplicativo através do {$store}.", - "button-reload-app-on-update": "Aplicar Atualização (o aplicativo será recarregado)", - "use-custom-node": "Usar Nó Personalizado", - "default-url": "Padrão: {$url}", - "enter-custom-node-url": "Digite a URL do nó personalizado", - "save-button": "Salvar", - "try-new-web": "Experimentar a nova web (beta)", - "try-new-web-description": "Mude para a nova interface web. Você pode voltar a qualquer momento nesta mesma configuração.", - "try-old-app": "Usar a interface original", - "try-old-app-description": "Volte para a interface original do Streamplace.", - "language-selection": "Idioma", - "language-selection-description": "Escolha seu idioma preferido", - "help-translate": "Ajude-nos a traduzir o Streamplace", - "help-translate-description": "Estamos procurando voluntários para ajudar a traduzir o Streamplace para mais idiomas. Se você estiver interessado, entre em contato conosco no Discord ou GitHub!", - "currently-translating": "As traduções estão a caminho", - "currently-translating-description": "Algumas partes do aplicativo podem parecer incompletas. Obrigado pela sua paciência!", - "debug-recording-title": "Permitir que {$host} grave sua transmissão ao vivo para depuração e melhoria do serviço", - "debug-recording-description": "Opcional", - "input-search-languages": "Pesquisar idiomas...", - "manage-keys": "Gerenciar Chaves", - "settings-title": "Configurações", - "loading": "Carregando...", - "error": "Erro", - "cancel": "Cancelar", - "confirm": "Confirmar", - "welcome-user": "Bem-vindo, {$username}!", - "notification-count": "{$count ->\n [0] Nenhuma notificação\n [1] Uma notificação\n *[other] {$count} notificações\n }", - "search-placeholder": "Pesquisar...", - "message-input": "Digite sua mensagem...", - "success": "Sucesso", - "warning": "Aviso", - "info": "Informação", - "close": "Fechar", - "open": "Abrir", - "delete": "Excluir", - "edit": "Editar", - "create": "Criar", - "update": "Atualizar", - "refresh": "Atualizar", - "save": "Salvar", - "cancel-button": "Cancelar", - "ok": "OK", - "yes": "Sim", - "no": "Não", - "continue": "Continuar", - "back": "Voltar", - "next": "Próximo", - "finish": "Finalizar", - "about": "Sobre", - "account": "Conta", - "advanced": "Avançado", - "danmu": "Danmu", - "developer": "Desenvolvedor", - "languages": "Idiomas", - "privacy-security": "Privacidade e Segurança", - "streaming": "Transmissão", - "notifications": "Notificações", - "sign-in": "Entrar", - "log-out": "Sair", - "account-greeting": "Olá, @{$handle}.", - "edit-profile-bluesky": "Editar perfil (no Bluesky)", - "change-name-color": "Mudar cor do nome", - "key-management": "Gerenciamento de Chaves", - "key-manager": "Gerenciador de Chaves", - "your-stream-pubkeys": "Suas Chaves Públicas de Transmissão", - "no-keys": "Nenhuma chave configurada", - "pubkey-description": "Chaves públicas são emparelhadas com chaves de transmissão (usadas em software de transmitindo) para assinar e verificar sua transmissão", - "keys-count": "{$count ->\n [one] {$count} chave\n [many] {$count} chaves\n *[other] {$count} chaves\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Integrações de Webhook", - "webhook-integrations-description": "Conecte serviços externos para receber atualizações em tempo real sobre suas transmissões", - "create-webhook": "Criar Webhook", - "edit-webhook": "Editar Webhook", - "delete-webhook": "Excluir Webhook", - "no-webhooks-yet": "Nenhum webhook configurado ainda", - "failed-load-webhooks": "Falha ao carregar webhooks", - "webhook-will-no-longer-receive-events": "Este webhook não receberá mais eventos", - "create-first-webhook-description": "Crie seu primeiro webhook para começar a receber eventos de transmissão", - "example-captain-hook": "Capitão Gancho", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "Ativa em:", - "events-livestream": "Eventos de Transmissão ao Vivo", - "events-chat": "Eventos de Chat", - "untitled-webhook": "Webhook Sem Título", - "inactive": "Inativo", - "debug-recording": "Gravação de Depuração", - "danmu-enabled": "Ativar Danmu", - "danmu-enabled-description": "Exibir mensagens de chat ao vivo como comentários flutuantes na sua tela", - "danmu-opacity": "Opacidade", - "danmu-speed": "Velocidade", - "danmu-lane-count": "Número de Faixas", - "danmu-max-messages": "Mensagens Máximas", - "app-version-description": "Informações da versão atual", - "confirm-delete": "Tem certeza de que deseja excluir isso?", - "action-cannot-be-undone": "Esta ação não pode ser desfeita", - "name-optional": "Nome (opcional)", - "deleting": "Excluindo...", - "saving": "Salvando...", - "go-to-dashboard": "Ir para o Painel", - "need-setup-live-dashboard": "Você precisa configurar uma transmissão ao vivo no painel primeiro", - "no-languages-found": "Nenhum idioma encontrado", - "backup-save": "Salvar configurações de backup", - "backup-saving": "Salvando configurações de backup...", - "backup-secret-key-set-placeholder": "(Senha já definida)", - "backup-error-invalid-endpoint": "Deve ser um nome de domínio válido", - "backup-error-invalid-bucket": "Deve conter apenas letras minúsculas, números, pontos e hifens", - "backup-error-invalid-segment-duration": "Deve estar entre 1 e 60 segundos", - "backup-error-load-failed": "Falha ao carregar as configurações de armazenamento", - "backup-error-update-failed": "Falha ao atualizar o status do backup", - "backup-error-save-failed": "Falha ao salvar as configurações de armazenamento", - "backup-error-missing-secret": "Não é possível atualizar as configurações do S3 sem a chave secreta. Por favor, insira-a novamente.", - "backup-segment-duration-placeholder": "6", - "backup": "Backup", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Fazer backup automaticamente das gravações em armazenamento compatível com S3", - "backup-connection-url": "URL de conexão", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "Endpoint", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Bucket", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Chave de acesso", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Chave secreta", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "Mostrar senha na URL", - "show-password-in-url-description": "Exibir a chave secreta na URL de conexão (se inserida)", - "recommendations-to-others": "Recomendações para outros", - "recommendations-description": "Compartilhe até 8 streamers que você recomenda aos seus espectadores", - "no-recommendations-yet": "Nenhuma recomendação configurada ainda", - "multistream": "Multitransmissão", - "multistream-targets": "Destinos de multitransmissão", - "multistream-description": "Envie automaticamente suas transmissões ao vivo do Streamplace para outros serviços como Twitch ou YouTube.", - "create-multistream-target": "Criar destino de multitransmissão", - "untitled-multistream-target": "Destino sem título", - "failed-load-multistream-targets": "Falha ao carregar os destinos de multitransmissão. Por favor, tente novamente.", - "failed-toggle-multistream-target": "Falha ao alternar o destino de multitransmissão. Por favor, tente novamente.", - "no-multistream-targets-yet": "Nenhum destino ainda!", - "multistream-targets-count": "{$count ->\n [one] {$count} destino\n [many] {$count} destinos\n *[other] {$count} destinos\n }", - "multistream-delete-target-confirmation": "Tem certeza de que deseja excluir \"{$target}\"?", - "this-action-cannot-be-undone": "Esta ação não pode ser desfeita.", - "rtmp-target-name": "Destino RTMP", - "rtmp-target-url": "URL RTMP", - "rtmp-target-name-placeholder": "Meu destino de multitransmissão", - "multistream-create-target": "Criar destino", - "multistream-edit-target": "Editar destino", - "created": "criado", - "status": "status", - "branding": "Identidade visual", - "branding-admin": "Administração de identidade visual", - "branding-admin-description": "Personalize sua instância do Streamplace. As configurações podem levar algumas horas para se propagar.", - "branding-login-required": "Faça login para gerenciar a identidade visual", - "branding-configuration": "Configuração", - "branding-text-settings": "Configurações de texto", - "branding-colors": "Cores", - "branding-legal-links": "Links legais", - "branding-images": "Imagens", - "branding-broadcaster-did": "DID do transmissor", - "branding-broadcaster-did-description": "Deixe vazio para usar o padrão do servidor", - "branding-site-title": "Título do site", - "branding-site-title-placeholder": "Digite o novo título do site", - "branding-site-description": "Descrição do site", - "branding-site-description-placeholder": "Digite a descrição do site", - "branding-default-streamer": "Streamer padrão", - "branding-default-streamer-none": "Nenhum", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Limpar streamer padrão", - "branding-primary-color": "Cor principal", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Cor de destaque", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG ou JPEG (máx. 500KB)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG ou ICO (máx. 100KB)", - "branding-sidebar-bg": "Imagem de fundo da barra lateral", - "branding-sidebar-bg-description": "SVG, PNG ou JPEG (máx. 500kb) - aparece alinhada na parte inferior da barra lateral, largura total. Faça upload de uma imagem com opacidade para melhores resultados, pois atualmente não há uma opção de opacidade separada.", - "branding-current": "Atual: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Enviar logo", - "branding-delete-logo": "Excluir logo", - "branding-upload-favicon": "Enviar favicon", - "branding-delete-favicon": "Excluir favicon", - "branding-upload-background": "Enviar plano de fundo", - "branding-delete-background": "Excluir plano de fundo", - "branding-web-only": "O upload de imagens só está disponível na web.", - "refresh-branding": "Atualizar recursos de identidade visual", - "branding-add-legal-link": "Adicionar link legal", - "branding-edit-legal-link": "Editar link legal", - "branding-legal-link-text-placeholder": "Texto do link (ex., Política de Privacidade)", - "branding-legal-link-url-placeholder": "URL (ex., https://exemplo.com/privacidade)", - "add": "Adicionar", - "active": "Ativo", - "optional": "opcional", - "branding-not-authenticated": "Faça login primeiro", - "branding-empty-value": "Por favor, insira um valor", - "branding-update-success": "{$key} atualizado com sucesso", - "branding-upload-success": "{$key} enviado com sucesso", - "branding-delete-success": "{$key} excluído com sucesso", - "branding-upload-failed": "Falha ao enviar", - "branding-delete-failed": "Falha ao excluir", - "branding-not-available": "O upload de arquivos só está disponível na web", - "node-legal-documents": "Documentos específicos do transmissor", - "badges": "Emblemas", - "badges-cosmetic-section": "Emblemas cosméticos", - "badges-empty-state": "Você ainda não recebeu nenhum emblema.", - "badges-failed-load": "Falha ao carregar emblemas", - "badges-failed-update": "Falha ao atualizar a seleção de emblemas", - "badges-issued-by": "Emitido por {$issuer}", - "badges-streamer-section": "Emblemas do streamer", - "issue-badges": "Emitir emblemas", - "issue-badges-back-to-definitions": "Definições de emblemas", - "issue-badges-badge-name": "Nome do emblema", - "issue-badges-badge-name-placeholder": "ex. VIP, Apoiador", - "issue-badges-badge-type": "Tipo de emblema", - "issue-badges-choose-image": "Escolher imagem", - "issue-badges-create-definition": "Criar definição de emblema", - "issue-badges-create-definition-description": "Defina um novo tipo de emblema que pode ser emitido para espectadores", - "issue-badges-create-definition-subtitle": "Defina um novo tipo de emblema", - "issue-badges-definition-created": "Definição de emblema criada", - "issue-badges-description-optional": "Descrição (opcional)", - "issue-badges-description-placeholder": "Descrição opcional para este emblema", - "issue-badges-failed-create": "Falha ao criar a definição de emblema", - "issue-badges-failed-issue": "Falha ao emitir o emblema", - "issue-badges-failed-load": "Falha ao carregar as definições de emblemas", - "issue-badges-image-optional": "Imagem (opcional)", - "issue-badges-image-too-large": "A imagem deve ter menos de 256KB", - "issue-badges-image-web-only": "O upload de imagens só está disponível na web", - "issue-badges-issue-badge": "Emitir emblema", - "issue-badges-issue-badge-description": "Emita o emblema \"{$name}\" para um espectador pelo seu DID", - "issue-badges-issued": "Emblema emitido", - "issue-badges-issued-to": "Emitido para {$did}", - "issue-badges-manage-description": "Crie definições de emblemas e emita-os para espectadores", - "issue-badges-recipient-did": "DID do destinatário", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Toque para emitir", - "issue-badges-your-definitions": "Suas definições de emblemas" -} diff --git a/js/i18n/public/locales/ro-RO/common.json b/js/i18n/public/locales/ro-RO/common.json deleted file mode 100644 index 8b7137fdb..000000000 --- a/js/i18n/public/locales/ro-RO/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Se încarcă...", - "error": "Eroare", - "cancel": "Anulare", - "confirm": "Confirmare", - "close": "Închidere", - "open": "Deschidere", - "ok": "OK", - "yes": "Da", - "no": "Nu", - "continue": "Continuare", - "back": "Înapoi", - "next": "Următorul", - "finish": "Finalizare", - "save": "Salvare", - "delete": "Ștergere", - "edit": "Editare", - "create": "Creare", - "update": "Actualizare", - "refresh": "Reîmprospătare", - "success": "Succes", - "warning": "Avertisment", - "info": "Informație", - "search-placeholder": "Căutare...", - "message-input": "Introduceți-vă mesajul...", - "please-log-in-to-access-this-page": "Vă rugăm să vă conectați pentru a accesa această pagină", - "go-to-settings": "Mergeți la Setări", - "go-back": "Mergeți înapoi", - "welcome-user": "Bun venit, {$username}!", - "notification-count": "{$count ->\n [0] Nici o notificare\n [1] O notificare\n *[other] {$count} (de) notificări\n }", - "user-offline": "utilizatorul este offline", - "user-offline-message": "{$source ->\n [streamer] Se pare că <1>@{$handle} este offline, dar recomandă să vizionați:\n *[default] Se pare că <1>@{$handle} este offline, dar vă recomandăm să vizionați:\n }", - "user-offline-no-recommendations": "Se pare că <1>@{$handle} este offline acum.\nReveniți mai târziu.", - "streaming-title": "transmisie în direct {$title}", - "viewer-count": "{$count ->\n [0] 0 vizionări\n [1] 1 vizionare\n *[other] {$count} (de) vizionări\n }", - "pds-selector-title": "Nou pe Atmosphere?", - "pds-selector-description": "Va trebui să selectați un PDS (Personal Data Server) pentru a accesa aplicațiile de pe Atmosphere, cum ar fi Bluesky, Tangled și Spark.", - "pds-selector-custom-label": "Alt PDS", - "pds-selector-custom-description": "Introduceți adresa URL a propriei gazde PDS", - "pds-selector-custom-url-label": "URL PDS personalizat", - "pds-selector-custom-url-placeholder": "https://pds.exemplu.ro", - "pds-selector-learn-more": "Aflați mai multe despre găzduirea proprie", - "pds-selector-info": "Fiecare gazdă are propriile politici și standarde de fiabilitate. Datele dvs. ATProto se află pe gazda pe care o alegeți și le puteți migra ulterior. Notă: Streamplace are propriile reguli de moderare - accesul dvs. poate fi interzis pe Streamplace indiferent de gazda pe care o alegeți.", - "pds-selector-read-policies": "Citiți Termenii și condițiile și Politica de confidențialitate ale {$label} înainte de a continua.", - "pds-selector-handle-policy-checkbox": "Am citit și sunt de acord cu politica de gestionare", - "login-show-live-on-bluesky": "Arată când sunt live pe Bluesky", - "login-show-live-on-bluesky-description": "Adaugă inelul roșu LIVE avatarului dvs. de Bluesky în timp ce transmiteți și permite Streamplace să publice anunțuri în numele dvs. Debifați pentru a vă conecta fără a acorda niciun acces la contul dvs. de Bluesky." -} diff --git a/js/i18n/public/locales/ro-RO/settings.json b/js/i18n/public/locales/ro-RO/settings.json deleted file mode 100644 index 38ee3e585..000000000 --- a/js/i18n/public/locales/ro-RO/settings.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Descărcați noua actualizare", - "check-for-updates": "Căutați actualizări", - "bundled-runtype": "Bundled", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Mod de recuperare", - "modal-latest-version": "Aveți cea mai recentă versiune.", - "modal-no-update-available": "Aveți cea mai recentă versiune de Streamplace, ura!", - "modal-update-available-title": "Actualizare disponibilă", - "modal-update-available-description": "O nouă versiune de Streamplace este gata de descărcare", - "modal-update-failed": "Căutarea actualizării a eșuat. Este posibil să fie nevoie să actualizați aplicația prin {$store}.", - "modal-update-failed-title": "Actualizare eșuată", - "modal-update-failed-description": "Căutarea actualizării a eșuat. Este posibil să fie nevoie să actualizați aplicația prin {$store}.", - "button-reload-app-on-update": "Aplicați actualizarea (va reîncărca aplicația)", - "use-custom-node": "Utilizați nodul personalizat", - "default-url": "Default: {$url}", - "enter-custom-node-url": "Introduceți adresa URL a nodului personalizat", - "save-button": "Salvare", - "try-new-web": "Încercați noul web (beta)", - "try-new-web-description": "Comutați la noua interfață web. Puteți reveni oricând din aceeași setare.", - "try-old-app": "Folosiți interfața originală", - "try-old-app-description": "Reveniți la interfața originală Streamplace.", - "language-selection": "Limbă", - "language-selection-description": "Alegeți-vă limba preferată", - "input-search-languages": "Căutați limbi...", - "help-translate": "Ajutați-ne să traducem Streamplace", - "help-translate-description": "Căutăm voluntari care să ne ajute la traducerea Streamplace în mai multe limbi. Dacă sunteți interesați, vă rugăm să ne contactați pe Discord sau GitHub!", - "currently-translating": "Traducerile sunt pe drum", - "currently-translating-description": "Este posibil ca unele părți ale aplicației să pară incomplete. Vă mulțumim pentru răbdare!", - "debug-recording-title": "Permiteți-i lui {$host} să înregistreze transmisiunea live pentru depanare și îmbunătățirea serviciului", - "debug-recording-description": "Opțional", - "manage-keys": "Gestionare chei", - "settings-title": "Setări", - "about": "Despre", - "account": "Cont", - "advanced": "Complex", - "danmu": "Danmu", - "developer": "Dezvoltator", - "languages": "Limbi", - "privacy-security": "Confidențialitate și securitate", - "streaming": "Streaming", - "notifications": "Notificări", - "cancel": "Anulare", - "create": "Creare", - "delete": "Ștergere", - "refresh": "Reîmprospătare", - "sign-in": "Conectare", - "update": "Actualizare", - "log-out": "Deconectare", - "optional": "opțional", - "account-greeting": "Hei, @{$handle}.", - "edit-profile-bluesky": "Editare profil (pe Bluesky)", - "change-name-color": "Schimbați culoarea numelui", - "key-management": "Gestionare chei", - "key-manager": "Manager cheie", - "your-stream-pubkeys": "Cheile publice ale transmisiunii dvs.", - "no-keys": "Nicio cheie configurată", - "pubkey-description": "Cheile publice sunt asociate cu cheile de transmisiune (utilizate în software-ul de streaming) pentru a semna și verifica transmisiunea.", - "keys-count": "{$count ->\n [one] {$count} cheie\n *[other] {$count} chei\n }", - "recommendations": "Recomandări", - "manage-recommendations": "Gestionați recomandările", - "recommendations-to-others": "Recomandări pentru Alții", - "recommendations-description": "Distribuie până la 8 streameri pe care îi recomandați spectatorilor dvs.", - "no-recommendations-yet": "Nu au fost configurate recomandări încă", - "add-recommendation": "Adăugare recomandare", - "streamer-did": "DID Streamer", - "recommendations-count": "{$count ->\n [one] {$count} recomandare\n *[other] {$count} (de) recomandări\n }", - "webhooks": "Webhook-uri", - "webhook-integrations": "Integrari Webhook", - "webhook-integrations-description": "Conectați servicii externe pentru a primi actualizări în timp real despre transmisiunile dvs.", - "create-webhook": "Creare Webhook", - "edit-webhook": "Editare Webhook", - "delete-webhook": "Ștergere Webhook", - "no-webhooks-yet": "Nu sunt încă configurate webhook-uri", - "failed-load-webhooks": "Nu s-au putut încărca webhook-urile", - "webhook-will-no-longer-receive-events": "Acest webhook nu va mai primi evenimente", - "create-first-webhook-description": "Creați-vă primul webhook pentru a începe să primiți evenimente de transmisiune", - "example-captain-hook": "Captain Hook", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} (de) webhook-uri\n }", - "activates-on": "Se activează la:", - "events": "Evenimente", - "events-livestream": "Evenimente în transmisiuni", - "events-chat": "Evenimente de conversașie", - "untitled-webhook": "Webhook fără titlu", - "inactive": "Inactiv", - "active": "Activ", - "multistream": "Multi-transmisiune", - "multistream-targets": "Ținte multi-transmisiune", - "multistream-description": "Distribuie automat transmisiunile tale live Streamplace către alte servicii de streaming precum Twitch sau YouTube.", - "create-multistream-target": "Creare țintă multi-transmisiune", - "untitled-multistream-target": "Țintă fără titlu", - "failed-load-multistream-targets": "Nu s-au putut încărca țintele multi-transmisiune. Vă rugăm să încercați din nou.", - "failed-toggle-multistream-target": "Nu s-a putut comuta ținta multi-transmisiune. Vă rugăm să încercați din nou.", - "failed-delete-multistream-target": "Ștergerea țintei multi-transmisiune nu a reușit. Încercați din nou.", - "no-multistream-targets-yet": "Nu există încă ținte!", - "multistream-targets-count": "{$count ->\n [one] {$count} țintă\n *[other] {$count} (de) ținte\n }", - "multistream-delete-target-confirmation": "Sunteți sigur că vreți să ștergeți „{$target}”?", - "this-action-cannot-be-undone": "Această acțiune nu poate fi anulată.", - "rtmp-target-name": "Țintă RTMP", - "rtmp-target-url": "URL RTMP", - "rtmp-target-name-placeholder": "Ținta mea transmisiune", - "multistream-create-target": "Creare țintă", - "multistream-edit-target": "Editare țintă", - "created": "creată", - "status": "stare", - "debug-recording": "Depanare înregistrare", - "danmu-enabled": "Activare Danmu", - "danmu-enabled-description": "Afișați mesajele din chatul live ca comentarii plutitoare pe ecran", - "danmu-opacity": "Opacitate", - "danmu-speed": "Viteză", - "danmu-lane-count": "Număr de benzi", - "danmu-max-messages": "Mesaje maxime", - "app-version-description": "Nu sunt disponibile actualizări în acest moment", - "confirm-delete": "Sigur vreți să ștergeți asta?", - "action-cannot-be-undone": "Această acțiune nu poate fi anulată", - "name-optional": "Nume (opțional)", - "deleting": "Se șterge...", - "saving": "Se salvează...", - "go-to-dashboard": "Mergeți la tabloul de bord", - "need-setup-live-dashboard": "Trebuie să configurați mai întâi transmisiunile? Vizitați tabloul de bord al transmisiunilor", - "no-languages-found": "Nu s-au găsit limbi", - "branding": "Branding", - "branding-admin": "Administrarea brandingului", - "branding-admin-description": "Personalizați-vă instanța Streamplace. Rețineți că propagarea setărilor poate dura câteva ore.", - "branding-login-required": "Vă rugăm să vă conectați pentru a gestiona brandingul", - "branding-configuration": "Configurare", - "branding-text-settings": "Setări text", - "branding-colors": "Culori", - "branding-legal-links": "Link-uri legale", - "branding-images": "Imagini", - "branding-broadcaster-did": "DID radiodifuzor", - "branding-broadcaster-did-description": "Lăsați gol pentru a utiliza valorile implicite ale serverului", - "branding-site-title": "Titlul site-ului", - "branding-site-title-placeholder": "Introduceți un nou titlu de site", - "branding-site-description": "Descrierea site-ului", - "branding-site-description-placeholder": "Introduceți descrierea site-ului", - "branding-default-streamer": "Streamer implicit", - "branding-default-streamer-none": "Nimic", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Ștergeți Streamerul implicit", - "branding-primary-color": "Culoare primară", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Culoare de accent", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG, or JPEG (max 500KB)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG, sau ICO (maxim 100KB)", - "branding-sidebar-bg": "Imagine de fundal din bara laterală", - "branding-sidebar-bg-description": "SVG, PNG sau JPEG (maxim 500kb) - apare aliniat la partea de jos a barei laterale, pe lățime completă. Încărcați o imagine cu opacitate pentru cele mai bune rezultate, deoarece în prezent nu există o opțiune separată de opacitate.", - "branding-current": "Current: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Încărcare logo", - "branding-delete-logo": "Ștergere logo", - "branding-upload-favicon": "Încărcare Favicon", - "branding-delete-favicon": "Ștergere Favicon", - "branding-upload-background": "Încărcare imagine de fundal", - "branding-delete-background": "Ștergere imagine de fundal", - "branding-web-only": "Încărcarea imaginilor este disponibilă doar pe web.", - "refresh-branding": "Actualizați elementele de branding", - "branding-add-legal-link": "Adăugați link legal", - "branding-edit-legal-link": "Editați linkul legal", - "branding-legal-link-text-placeholder": "Textul linkului (de exemplu, Politica de confidențialitate)", - "branding-legal-link-url-placeholder": "Adresa URL (de ex., https://example.com/privacy)", - "add": "Adăugare", - "edit": "Editare", - "branding-not-authenticated": "Vă rugăm să vă conectați mai întâi", - "branding-empty-value": "Vă rugăm să introduceți o valoare", - "branding-update-success": "{$key} a fost actualizat cu succes", - "branding-upload-success": "{$key} a fost încărcat cu succes", - "branding-delete-success": "{$key} a fost șters cu succes", - "branding-upload-failed": "Încărcare eșuată", - "branding-delete-failed": "Ștergere eșuată", - "branding-not-available": "Încărcarea de fișiere este disponibilă doar pe web.", - "node-legal-documents": "Documente specifice radiodifuzorului", - "badges": "Insigne", - "badges-cosmetic-section": "Insigne cosmetice", - "badges-empty-state": "Nu ți-a fost acordată nicio insignă încă.", - "badges-failed-load": "Nu s-au putut încărca insignele", - "badges-failed-update": "Nu s-a putut actualiza selecția de insigne", - "badges-issued-by": "Acordată de {$issuer}", - "badges-streamer-section": "Insigne de la streameri", - "issue-badges": "Emitere insigne", - "issue-badges-back-to-definitions": "Definiții insigne", - "issue-badges-badge-name": "Numele insignei", - "issue-badges-badge-name-placeholder": "ex. VIP, Susținător", - "issue-badges-badge-type": "Tipul insignei", - "issue-badges-choose-image": "Alegeți imaginea", - "issue-badges-create-definition": "Creare definiție insignă", - "issue-badges-create-definition-description": "Definiți un nou tip de insignă care poate fi acordată spectatorilor", - "issue-badges-create-definition-subtitle": "Definiți un nou tip de insignă", - "issue-badges-definition-created": "Definiție insignă creată", - "issue-badges-description-optional": "Descriere (opțional)", - "issue-badges-description-placeholder": "Descriere opțională pentru această insignă", - "issue-badges-failed-create": "Nu s-a putut crea definiția insignei", - "issue-badges-failed-issue": "Nu s-a putut emite insigna", - "issue-badges-failed-load": "Nu s-au putut încărca definițiile insignelor", - "issue-badges-image-optional": "Imagine (opțional)", - "issue-badges-image-too-large": "Imaginea trebuie să fie mai mică de 256KB", - "issue-badges-image-web-only": "Încărcarea imaginilor este disponibilă doar pe web", - "issue-badges-issue-badge": "Emite insignă", - "issue-badges-issue-badge-description": "Emite insigna „{$name}\" unui spectator prin DID-ul său", - "issue-badges-issued": "Insignă emisă", - "issue-badges-issued-to": "Emisă pentru {$did}", - "issue-badges-manage-description": "Creați definiții de insigne și emiteți-le spectatorilor", - "issue-badges-recipient-did": "DID destinatar", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Atingeți pentru a emite", - "issue-badges-your-definitions": "Definițiile dvs. de insigne" -} diff --git a/js/i18n/public/locales/zh-Hans/common.json b/js/i18n/public/locales/zh-Hans/common.json deleted file mode 100644 index 082dd6d61..000000000 --- a/js/i18n/public/locales/zh-Hans/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "正在加载...", - "error": "错误", - "cancel": "取消", - "confirm": "确认", - "close": "关闭", - "open": "开启", - "ok": "确定", - "yes": "是", - "no": "否", - "continue": "继续", - "back": "返回", - "next": "下一步", - "finish": "完成", - "save": "保存", - "delete": "删除", - "edit": "编辑", - "create": "创建", - "update": "更新", - "refresh": "刷新", - "success": "成功", - "warning": "警告", - "info": "信息", - "search-placeholder": "搜索...", - "message-input": "输入您的消息...", - "please-log-in-to-access-this-page": "请登录以访问此页面", - "go-to-settings": "前往设置", - "go-back": "返回", - "welcome-user": "欢迎,{$username}!", - "notification-count": "{$count ->\n [0] 无通知\n *[other] {$count} 则通知\n }", - "user-offline": "用户离线", - "user-offline-message": "{$source ->\n [streamer] 看起来 <1>@{$handle} 离线了,但他们推荐观看:\n *[default] 看起来 <1>@{$handle} 离线了,但我们推荐观看:\n }", - "user-offline-no-recommendations": "看起来 <1>@{$handle} 离线了。\n请稍后再来看看。", - "streaming-title": "正在直播 {$title}", - "viewer-count": "{$count} 位观众", - "pds-selector-title": "刚接触 Atmosphere 吗?", - "pds-selector-description": "您需要选择一个 PDS (个人数据服务器) 来访问 Atmosphere 上的应用程序,例如 Bluesky、Tangled 和 Spark。", - "pds-selector-custom-label": "另一个 PDS", - "pds-selector-custom-description": "请输入您自己的 PDS 主机网址", - "pds-selector-custom-url-label": "自定义 PDS 网址", - "pds-selector-custom-url-placeholder": "https://pds.example.com", - "pds-selector-learn-more": "了解有关自组主机的更多信息", - "pds-selector-info": "每个主机都有自己的政策和可靠性标准。您的 ATProto 数据存储在您选择的主机上,您可以以后进行迁移。注意:Streamplace 有自己的审核规则——无论您选择哪个主机,都可能会被 Streamplace 禁止使用。", - "pds-selector-read-policies": "在继续之前,请阅读 {$label} 的服务条款和隐私政策。", - "pds-selector-handle-policy-checkbox": "我已阅读并同意处理政策", - "login-show-live-on-bluesky": "在 Bluesky 上显示我的直播状态", - "login-show-live-on-bluesky-description": "直播时为您的 Bluesky 头像加上红色 LIVE 圆环,并允许 Streamplace 代您发布直播公告。取消勾选即可在不授予任何 Bluesky 账号访问权限的情况下登录。" -} diff --git a/js/i18n/public/locales/zh-Hans/settings.json b/js/i18n/public/locales/zh-Hans/settings.json deleted file mode 100644 index 9af46c5ca..000000000 --- a/js/i18n/public/locales/zh-Hans/settings.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "下载新更新", - "check-for-updates": "检查更新", - "bundled-runtype": "捆绑版", - "ota-runtype": "空中下载 (OTA)", - "recovery-runtype": "复原模式", - "modal-latest-version": "您正在使用最新版本。", - "modal-no-update-available": "您已经在使用最新版本的 Streamplace,太棒了!", - "modal-update-available-title": "有可用更新", - "modal-update-available-description": "新版本的 Streamplace 已准备好下载", - "modal-update-failed": "更新检查失败。您可能需要透过 {$store} 更新应用程序。", - "modal-update-failed-title": "更新失败", - "modal-update-failed-description": "更新检查失败。您可能需要透过 {$store} 更新应用程序。", - "button-reload-app-on-update": "套用更新 (将重新加载应用程序)", - "use-custom-node": "使用自定义节点", - "default-url": "默认:{$url}", - "enter-custom-node-url": "输入自定义节点网址", - "save-button": "保存", - "try-new-web": "试用新版网页 (beta)", - "try-new-web-description": "切换到新的网页界面。你可以随时通过此设置切换回来。", - "try-old-app": "使用原版界面", - "try-old-app-description": "返回 Streamplace 原版界面。", - "language-selection": "语言", - "language-selection-description": "选择您偏好的语言", - "input-search-languages": "搜索语言...", - "help-translate": "帮助我们翻译 Streamplace", - "help-translate-description": "我们正在寻找志愿者协助将 Streamplace 翻译成更多语言。如果您有兴趣,请在 Discord 或 GitHub 上与我们联系!", - "currently-translating": "翻译正在进行中", - "currently-translating-description": "应用程序的某些部分可能看起来不完整。感谢您的耐心等待!", - "debug-recording-title": "允许 {$host} 录制您的直播串流以进行除错和服务改善", - "debug-recording-description": "可选项", - "manage-keys": "管理密钥", - "settings-title": "设置", - "error": "错误", - "about": "关于", - "account": "帐户", - "advanced": "高级", - "danmu": "弹幕", - "developer": "开发者", - "languages": "语言", - "privacy-security": "隐私与安全", - "streaming": "串流", - "notifications": "通知", - "cancel": "取消", - "create": "创建", - "delete": "删除", - "refresh": "刷新", - "sign-in": "登录", - "update": "更新", - "log-out": "登出", - "optional": "选填", - "account-greeting": "嗨,@{$handle}。", - "edit-profile-bluesky": "在 Bluesky 编辑个人数据", - "change-name-color": "更改名称颜色", - "key-management": "密钥管理", - "key-manager": "密钥管理器", - "your-stream-pubkeys": "您的串流公开密钥", - "no-keys": "尚未设置密钥", - "pubkey-description": "公开密钥与串流密钥 (用于串流软件) 配对以签署和验证您的串流", - "keys-count": "{$count} 个密钥", - "backup": "备份", - "backup-enabled": "S3 备份", - "backup-enabled-description": "自动将录影备份到兼容 S3 的存储", - "backup-connection-url": "连接网址", - "backup-connection-url-placeholder": "必须是格式为 s3+https://ACCESS_KEY:SECRET_KEY@region.endpoi.nt/bucket 的有效 S3 网址", - "backup-endpoint": "终端", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "存储桶", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "访问密钥", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "秘密密钥", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "backup-region": "地区", - "backup-region-placeholder": "us-east-1", - "backup-test-connection": "测试连接", - "backup-testing-connection": "正在测试连接...", - "backup-connection-successful": "连接成功", - "backup-connection-failed": "连接失败", - "show-password-in-url": "在网址中显示密码", - "show-password-in-url-description": "在连接网址中显示秘密密钥 (若有)", - "requested-seconds-per-segment": "每段秒数", - "requested-seconds-per-segment-description": "设置每段秒数,以请求服务器使用", - "recommendations": "推荐主播", - "manage-recommendations": "管理推荐主播", - "recommendations-to-others": "向他人推荐主播", - "recommendations-description": "向您的观众推荐最多 8 位主播", - "no-recommendations-yet": "尚未配置推荐", - "add-recommendation": "添加推荐", - "streamer-did": "主播 DID", - "recommendations-count": "{$count} 位推荐主播", - "webhooks": "Webhooks", - "webhook-integrations": "Webhook 集成", - "webhook-integrations-description": "连接外部服务以即时接收有关您串流的更新", - "create-webhook": "创建 Webhook", - "edit-webhook": "编辑 Webhook", - "delete-webhook": "删除 Webhook", - "no-webhooks-yet": "尚未设置 Webhook", - "failed-load-webhooks": "加载 Webhook 失败", - "webhook-will-no-longer-receive-events": "此 Webhook 将不再接收事件", - "create-first-webhook-description": "创建您的第一个 Webhook 以开始接收串流事件", - "example-captain-hook": "Hook 船长", - "webhooks-count": "{$count} 个 Webhook", - "activates-on": "触发于:", - "events": "事件", - "events-livestream": "直播串流事件", - "events-chat": "聊天事件", - "untitled-webhook": "未命名的 Webhook", - "inactive": "停用", - "active": "活动", - "multistream": "多重串流", - "multistream-targets": "多重串流目标", - "multistream-description": "自动将您的 Streamplace 直播推送到 Twitch 或 YouTube 等其他直播平台。", - "create-multistream-target": "创建多重串流目标", - "untitled-multistream-target": "未命名目标", - "failed-load-multistream-targets": "加载多重串流目标失败。请重试。", - "failed-toggle-multistream-target": "切换多重串流目标失败。请重试。", - "failed-delete-multistream-target": "删除多重串流目标失败。请重试。", - "no-multistream-targets-yet": "还没有目标!", - "multistream-targets-count": "{$count} 个目标", - "multistream-delete-target-confirmation": "您确定要删除“{$target}”吗?", - "this-action-cannot-be-undone": "此操作无法撤销。", - "rtmp-target-name": "RTMP 目标", - "rtmp-target-url": "RTMP 网址", - "rtmp-target-name-placeholder": "我的多重串流目标", - "multistream-create-target": "创建目标", - "multistream-edit-target": "编辑目标", - "created": "创建于", - "status": "状态", - "debug-recording": "调试录制", - "danmu-enabled": "启用弹幕", - "danmu-enabled-description": "将即时聊天消息以浮动评论的形式显示在您的屏幕上", - "danmu-opacity": "不透明度", - "danmu-speed": "速度", - "danmu-lane-count": "轨道数量", - "danmu-max-messages": "最大消息数", - "app-version-description": "当前没有可用的更新", - "confirm-delete": "您确定要删除吗?", - "action-cannot-be-undone": "此操作无法撤销", - "name-optional": "名称 (选填)", - "deleting": "正在删除...", - "saving": "正在保存...", - "go-to-dashboard": "前往仪表板", - "need-setup-live-dashboard": "需要先设置串流吗?请访问直播仪表板", - "no-languages-found": "找不到语言", - "branding": "品牌", - "branding-admin": "品牌管理", - "branding-admin-description": "自定义您的 Streamplace 实例。请注意,设置可能需要几小时才能生效。", - "branding-login-required": "请登录以管理品牌", - "branding-configuration": "配置", - "branding-text-settings": "文字设置", - "branding-colors": "颜色", - "branding-legal-links": "法律链接", - "branding-images": "图像", - "branding-broadcaster-did": "主播 DID", - "branding-broadcaster-did-description": "留空以使用服务器默认值", - "branding-site-title": "网站标题", - "branding-site-title-placeholder": "输入新网站标题", - "branding-site-description": "网站描述", - "branding-site-description-placeholder": "输入网站描述", - "branding-default-streamer": "默认主播", - "branding-default-streamer-none": "无", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "清除默认主播", - "branding-primary-color": "首要颜色", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "强调色", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "主标志", - "branding-main-logo-description": "SVG、PNG 或 JPEG (最大 500KB)", - "branding-favicon": "网站图标", - "branding-favicon-description": "SVG、PNG 或 ICO (最大 100KB)", - "branding-sidebar-bg": "侧边栏背景图片", - "branding-sidebar-bg-description": "SVG、PNG 或 JPEG (最大 500KB)——显示在侧边栏底部,全宽显示。为了获得最佳效果,请上传一张带有透明度的图片,因为目前没有单独的透明度选项。", - "branding-current": "当前:{$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "上传标志", - "branding-delete-logo": "删除标志", - "branding-upload-favicon": "上传网站图标", - "branding-delete-favicon": "删除网站图标", - "branding-upload-background": "上传背景", - "branding-delete-background": "删除背景", - "branding-web-only": "图像上传仅在网页端可用。", - "refresh-branding": "更新品牌资源", - "branding-add-legal-link": "添加法律链接", - "branding-edit-legal-link": "编辑法律链接", - "branding-legal-link-text-placeholder": "链接文本 (例如:隐私政策)", - "branding-legal-link-url-placeholder": "网址 (例如:https://example.com/privacy)", - "add": "添加", - "edit": "编辑", - "branding-not-authenticated": "请先登录", - "branding-empty-value": "请输入一个数值", - "branding-update-success": "{$key} 更新成功", - "branding-upload-success": "{$key} 上传成功", - "branding-delete-success": "{$key} 删除成功", - "branding-upload-failed": "上传失败", - "branding-delete-failed": "删除失败", - "branding-not-available": "文件上传仅在网页版上可用", - "node-legal-documents": "主播专属文档", - "backup-save": "保存备份设置", - "backup-saving": "正在保存备份设置...", - "backup-secret-key-set-placeholder": "(密码已设置)", - "backup-error-invalid-endpoint": "必须是有效的域名", - "backup-error-invalid-bucket": "必须只包含小写字母、数字、点和连字符", - "backup-error-invalid-segment-duration": "必须在 1 到 60 秒之间", - "backup-error-load-failed": "加载存储设置失败", - "backup-error-update-failed": "更新备份状态失败", - "backup-error-save-failed": "保存存储设置失败", - "backup-error-missing-secret": "没有秘密密钥时无法更新 S3 设置。请重新输入。", - "backup-segment-duration-placeholder": "6", - "badges": "徽章", - "badges-cosmetic-section": "装饰性徽章", - "badges-empty-state": "您还没有获得任何徽章。", - "badges-failed-load": "加载徽章失败", - "badges-failed-update": "更新徽章选择失败", - "badges-issued-by": "由 {$issuer} 颁发", - "badges-streamer-section": "主播徽章", - "issue-badges": "颁发徽章", - "issue-badges-back-to-definitions": "徽章定义", - "issue-badges-badge-name": "徽章名称", - "issue-badges-badge-name-placeholder": "例如 VIP、支持者", - "issue-badges-badge-type": "徽章类型", - "issue-badges-choose-image": "选择图片", - "issue-badges-create-definition": "创建徽章定义", - "issue-badges-create-definition-description": "定义可颁发给观众的新徽章类型", - "issue-badges-create-definition-subtitle": "定义新徽章类型", - "issue-badges-definition-created": "徽章定义已创建", - "issue-badges-description-optional": "描述(可选)", - "issue-badges-description-placeholder": "此徽章的可选描述", - "issue-badges-failed-create": "创建徽章定义失败", - "issue-badges-failed-issue": "颁发徽章失败", - "issue-badges-failed-load": "加载徽章定义失败", - "issue-badges-image-optional": "图片(可选)", - "issue-badges-image-too-large": "图片必须小于 256KB", - "issue-badges-image-web-only": "图片上传仅在网页版可用", - "issue-badges-issue-badge": "颁发徽章", - "issue-badges-issue-badge-description": "通过 DID 将\"{$name}\"徽章颁发给观众", - "issue-badges-issued": "徽章已颁发", - "issue-badges-issued-to": "已颁发给 {$did}", - "issue-badges-manage-description": "创建徽章定义并颁发给观众", - "issue-badges-recipient-did": "收件人 DID", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "点击颁发", - "issue-badges-your-definitions": "您的徽章定义" -} diff --git a/js/i18n/public/locales/zh-Hant/common.json b/js/i18n/public/locales/zh-Hant/common.json deleted file mode 100644 index e06e5aa8b..000000000 --- a/js/i18n/public/locales/zh-Hant/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "載入中...", - "error": "錯誤", - "cancel": "取消", - "confirm": "確認", - "close": "關閉", - "open": "開啟", - "ok": "確定", - "yes": "是", - "no": "否", - "continue": "繼續", - "back": "返回", - "next": "下一步", - "finish": "完成", - "save": "儲存", - "delete": "刪除", - "edit": "編輯", - "create": "建立", - "update": "更新", - "refresh": "重新整理", - "success": "成功", - "warning": "警告", - "info": "資訊", - "search-placeholder": "搜尋...", - "message-input": "輸入您的訊息...", - "please-log-in-to-access-this-page": "請登入以存取此頁面", - "go-to-settings": "前往設定", - "go-back": "返回", - "welcome-user": "歡迎,{$username}!", - "notification-count": "{$count ->\n [0] 無通知\n [1] 一則通知\n *[other] {$count} 則通知\n }", - "user-offline": "使用者離線", - "user-offline-message": "{$source ->\n [streamer] 看起來 <1>@{$handle} 離線 了,但他們推薦觀看:\n *[default] 看起來 <1>@{$handle} 離線 了,但我們推薦觀看:\n }", - "user-offline-no-recommendations": "看起來 <1>@{$handle} 離線 了。\n請稍後再來看看。", - "streaming-title": "正在直播 {$title}", - "viewer-count": "{$count ->\n [0] 0 位觀眾\n [1] 1 位觀眾\n *[other] {$count} 位觀眾\n }", - "pds-selector-title": "初次接觸 Atmosphere?", - "pds-selector-description": "您需要選擇一個 PDS(個人資料伺服器)來存取 Atmosphere 上的應用程式,例如 Bluesky、Tangled 和 Spark。", - "pds-selector-custom-label": "其他 PDS", - "pds-selector-custom-description": "輸入您自己的 PDS 主機網址", - "pds-selector-custom-url-label": "自訂 PDS 網址", - "pds-selector-custom-url-placeholder": "https://pds.example.com", - "pds-selector-learn-more": "了解更多關於自行架設的資訊", - "pds-selector-info": "每個主機都有自己的政策和可靠性標準。您的 ATProto 資料存放在您選擇的主機上,您可以之後進行遷移。注意:Streamplace 有自己的審核規則——無論您選擇哪個主機,都可能被 Streamplace 封禁。", - "pds-selector-read-policies": "在繼續之前,請閱讀 {$label} 的服務條款和隱私政策。", - "pds-selector-handle-policy-checkbox": "我已閱讀並同意識別碼政策", - "login-show-live-on-bluesky": "在 Bluesky 上顯示我的直播狀態", - "login-show-live-on-bluesky-description": "直播時為您的 Bluesky 頭像加上紅色 LIVE 圓環,並允許 Streamplace 代您發布直播公告。取消勾選即可在不授予任何 Bluesky 帳號存取權限的情況下登入。" -} diff --git a/js/i18n/public/locales/zh-Hant/settings.json b/js/i18n/public/locales/zh-Hant/settings.json deleted file mode 100644 index 5c5990c52..000000000 --- a/js/i18n/public/locales/zh-Hant/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "播家 v{$version}", - "download-new-update": "下載新更新", - "check-for-updates": "檢查更新", - "bundled-runtype": "捆綁版", - "ota-runtype": "空中下載 (OTA)", - "recovery-runtype": "復原模式", - "modal-latest-version": "您正在使用最新版本。", - "modal-no-update-available": "您已經在使用最新版本的直播地,太棒了!", - "modal-update-available-title": "有可用更新", - "modal-update-available-description": "新版本的直播地已準備好下載", - "modal-update-failed": "更新檢查失敗。您可能需要透過 {$store} 更新應用程式。", - "modal-update-failed-title": "更新失敗", - "modal-update-failed-description": "更新檢查失敗。您可能需要透過 {$store} 更新應用程式。", - "button-reload-app-on-update": "套用更新 (將重新載入應用程式)", - "use-custom-node": "使用自訂節點", - "default-url": "預設:{$url}", - "enter-custom-node-url": "輸入自訂節點網址", - "save-button": "儲存", - "try-new-web": "試用新版網頁 (beta)", - "try-new-web-description": "切換到新的網頁介面。你可以隨時透過此設定切換回來。", - "try-old-app": "使用原版介面", - "try-old-app-description": "返回 Streamplace 原版介面。", - "language-selection": "語言", - "language-selection-description": "選擇您偏好的語言", - "help-translate": "幫助我們翻譯播家", - "help-translate-description": "我們正在尋找志願者協助將播家翻譯成更多語言。如果您有興趣,請在 Discord 或 GitHub 上與我們聯繫!", - "currently-translating": "翻譯正在進行中", - "currently-translating-description": "應用程式的某些部分可能看起來不完整。感謝您的耐心等待!", - "debug-recording-title": "允許 {$host} 錄製您的直播串流以進行除錯和服務改善", - "debug-recording-description": "可選項目", - "input-search-languages": "搜尋語言...", - "manage-keys": "管理金鑰", - "settings-title": "設定", - "loading": "載入中...", - "error": "錯誤", - "cancel": "取消", - "confirm": "確認", - "welcome-user": "歡迎,{$username}!", - "notification-count": "{$count ->\n [0] 無通知\n [1] 一則通知\n *[other] {$count} 則通知\n }", - "search-placeholder": "搜尋...", - "message-input": "請輸入您的訊息...", - "success": "成功", - "warning": "警告", - "info": "資訊", - "close": "關閉", - "open": "開啟", - "delete": "刪除", - "edit": "編輯", - "create": "建立", - "update": "更新", - "refresh": "重新整理", - "save": "儲存", - "cancel-button": "取消", - "ok": "確定", - "yes": "是", - "no": "否", - "continue": "繼續", - "back": "返回", - "next": "下一步", - "finish": "完成", - "about": "關於", - "account": "帳戶", - "advanced": "進階", - "danmu": "彈幕", - "developer": "開發者", - "languages": "語言", - "privacy-security": "隱私與安全", - "streaming": "串流", - "notifications": "通知", - "sign-in": "登入", - "log-out": "登出", - "account-greeting": "嗨,@{$handle}。", - "edit-profile-bluesky": "編輯個人資料(在 Bluesky)", - "change-name-color": "變更名稱顏色", - "key-management": "金鑰管理", - "key-manager": "金鑰管理器", - "your-stream-pubkeys": "您的串流公開金鑰", - "no-keys": "尚未設定金鑰", - "pubkey-description": "公開金鑰與串流金鑰(用於串流軟體)配對以簽署和驗證您的串流", - "keys-count": "{$count} 個金鑰", - "webhooks": "Webhooks", - "webhook-integrations": "Webhook 整合", - "webhook-integrations-description": "連接外部服務以即時接收有關您串流的更新", - "create-webhook": "建立 Webhook", - "edit-webhook": "編輯 Webhook", - "delete-webhook": "刪除 Webhook", - "no-webhooks-yet": "尚未設定 webhook", - "failed-load-webhooks": "載入 webhook 失敗", - "webhook-will-no-longer-receive-events": "此 webhook 將不再接收事件", - "create-first-webhook-description": "建立您的第一個 webhook 以開始接收串流事件", - "example-captain-hook": "虎克船長", - "webhooks-count": "{$count ->\n *[other] {$count} 個 webhook\n }", - "activates-on": "觸發於:", - "events-livestream": "直播串流事件", - "events-chat": "聊天事件", - "untitled-webhook": "未命名的 Webhook", - "inactive": "停用", - "debug-recording": "除錯錄製", - "danmu-enabled": "啟用彈幕", - "danmu-enabled-description": "將即時聊天訊息以浮動評論的形式顯示在您的螢幕上", - "danmu-opacity": "不透明度", - "danmu-speed": "速度", - "danmu-lane-count": "軌道數量", - "danmu-max-messages": "最大訊息數", - "app-version-description": "目前版本資訊", - "confirm-delete": "您確定要刪除嗎?", - "action-cannot-be-undone": "此動作無法復原", - "name-optional": "名稱(選填)", - "deleting": "刪除中...", - "saving": "儲存中...", - "go-to-dashboard": "前往控制台", - "need-setup-live-dashboard": "您需要先在控制台中設定直播串流", - "no-languages-found": "找不到語言", - "backup-save": "儲存備份設定", - "backup-saving": "正在儲存備份設定...", - "backup-secret-key-set-placeholder": "(密碼已設定)", - "backup-error-invalid-endpoint": "必須是有效的網域名稱", - "backup-error-invalid-bucket": "只能包含小寫字母、數字、點和連字號", - "backup-error-invalid-segment-duration": "必須介於 1 到 60 秒之間", - "backup-error-load-failed": "無法載入儲存設定", - "backup-error-update-failed": "更新備份狀態失敗", - "backup-error-save-failed": "儲存設定失敗", - "backup-error-missing-secret": "無法在沒有金鑰的情況下更新 S3 設定。請重新輸入。", - "backup-segment-duration-placeholder": "6", - "backup": "備份", - "backup-enabled": "S3 備份", - "backup-enabled-description": "自動將錄影備份到相容 S3 的儲存空間", - "backup-connection-url": "連線網址", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "端點", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "儲存桶", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "存取金鑰", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "秘密金鑰", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "在網址中顯示密碼", - "show-password-in-url-description": "在連線網址中顯示秘密金鑰(若已輸入)", - "recommendations-to-others": "向他人推薦主播", - "recommendations-description": "向您的觀眾推薦最多 8 位主播", - "no-recommendations-yet": "尚未設定推薦", - "multistream": "多重串流", - "multistream-targets": "多重串流目標", - "multistream-description": "自動將您的 Streamplace 直播推送到 Twitch 或 YouTube 等其他直播平台。", - "create-multistream-target": "建立多重串流目標", - "untitled-multistream-target": "未命名目標", - "failed-load-multistream-targets": "載入多重串流目標失敗。請重試。", - "failed-toggle-multistream-target": "切換多重串流目標失敗。請重試。", - "no-multistream-targets-yet": "還沒有目標!", - "multistream-targets-count": "{$count} 個目標", - "multistream-delete-target-confirmation": "您確定要刪除「{$target}」嗎?", - "this-action-cannot-be-undone": "此動作無法復原。", - "rtmp-target-name": "RTMP 目標", - "rtmp-target-url": "RTMP 網址", - "rtmp-target-name-placeholder": "我的多重串流目標", - "multistream-create-target": "建立目標", - "multistream-edit-target": "編輯目標", - "created": "建立於", - "status": "狀態", - "branding": "品牌識別", - "branding-admin": "品牌識別管理", - "branding-admin-description": "自訂您的 Streamplace 執行個體。請注意,設定可能需要幾小時才能生效。", - "branding-login-required": "請登入以管理品牌識別", - "branding-configuration": "設定", - "branding-text-settings": "文字設定", - "branding-colors": "顏色", - "branding-legal-links": "法律連結", - "branding-images": "圖像", - "branding-broadcaster-did": "主播 DID", - "branding-broadcaster-did-description": "留空以使用伺服器預設值", - "branding-site-title": "網站標題", - "branding-site-title-placeholder": "輸入新網站標題", - "branding-site-description": "網站描述", - "branding-site-description-placeholder": "輸入網站描述", - "branding-default-streamer": "預設主播", - "branding-default-streamer-none": "無", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "清除預設主播", - "branding-primary-color": "主要顏色", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "強調色", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "主標誌", - "branding-main-logo-description": "SVG、PNG 或 JPEG(最大 500KB)", - "branding-favicon": "網站圖示", - "branding-favicon-description": "SVG、PNG 或 ICO(最大 100KB)", - "branding-sidebar-bg": "側邊欄背景圖片", - "branding-sidebar-bg-description": "SVG、PNG 或 JPEG(最大 500KB)——顯示在側邊欄底部,全寬顯示。為了最佳效果,請上傳帶有透明度的圖片,因為目前沒有單獨的透明度選項。", - "branding-current": "目前:{$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "上傳標誌", - "branding-delete-logo": "刪除標誌", - "branding-upload-favicon": "上傳網站圖示", - "branding-delete-favicon": "刪除網站圖示", - "branding-upload-background": "上傳背景", - "branding-delete-background": "刪除背景", - "branding-web-only": "圖片上傳僅在網頁版可用。", - "refresh-branding": "更新品牌識別資源", - "branding-add-legal-link": "新增法律連結", - "branding-edit-legal-link": "編輯法律連結", - "branding-legal-link-text-placeholder": "連結文字(例如:隱私政策)", - "branding-legal-link-url-placeholder": "網址(例如:https://example.com/privacy)", - "add": "新增", - "active": "啟用", - "optional": "選填", - "branding-not-authenticated": "請先登入", - "branding-empty-value": "請輸入一個值", - "branding-update-success": "{$key} 更新成功", - "branding-upload-success": "{$key} 上傳成功", - "branding-delete-success": "{$key} 刪除成功", - "branding-upload-failed": "上傳失敗", - "branding-delete-failed": "刪除失敗", - "branding-not-available": "檔案上傳僅在網頁版可用", - "node-legal-documents": "主播專屬文件", - "badges": "徽章", - "badges-cosmetic-section": "裝飾性徽章", - "badges-empty-state": "您尚未獲得任何徽章。", - "badges-failed-load": "載入徽章失敗", - "badges-failed-update": "更新徽章選擇失敗", - "badges-issued-by": "由 {$issuer} 頒發", - "badges-streamer-section": "主播徽章", - "issue-badges": "頒發徽章", - "issue-badges-back-to-definitions": "徽章定義", - "issue-badges-badge-name": "徽章名稱", - "issue-badges-badge-name-placeholder": "例如 VIP、支持者", - "issue-badges-badge-type": "徽章類型", - "issue-badges-choose-image": "選擇圖片", - "issue-badges-create-definition": "建立徽章定義", - "issue-badges-create-definition-description": "定義可頒發給觀眾的新徽章類型", - "issue-badges-create-definition-subtitle": "定義新徽章類型", - "issue-badges-definition-created": "徽章定義已建立", - "issue-badges-description-optional": "描述(選填)", - "issue-badges-description-placeholder": "此徽章的選填描述", - "issue-badges-failed-create": "建立徽章定義失敗", - "issue-badges-failed-issue": "頒發徽章失敗", - "issue-badges-failed-load": "載入徽章定義失敗", - "issue-badges-image-optional": "圖片(選填)", - "issue-badges-image-too-large": "圖片必須小於 256KB", - "issue-badges-image-web-only": "圖片上傳僅在網頁版可用", - "issue-badges-issue-badge": "頒發徽章", - "issue-badges-issue-badge-description": "透過 DID 將「{$name}」徽章頒發給觀眾", - "issue-badges-issued": "徽章已頒發", - "issue-badges-issued-to": "已頒發給 {$did}", - "issue-badges-manage-description": "建立徽章定義並頒發給觀眾", - "issue-badges-recipient-did": "收件者 DID", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "點擊頒發", - "issue-badges-your-definitions": "您的徽章定義" -} diff --git a/js/web/package.json b/js/web/package.json index 64495e137..399692310 100644 --- a/js/web/package.json +++ b/js/web/package.json @@ -6,15 +6,17 @@ "description": "Streamplace web app (Vite + TanStack Router). True-DOM, no React Native.", "scripts": { "dev": "vite --port 5173", - "predev": "pnpm gen:emoji", + "predev": "pnpm --filter @streamplace/i18n compile && pnpm gen:emoji", "build": "tsc --noEmit && vite build", "preview": "vite preview --port 5173", "check": "bash -c 'set -euo pipefail;export OUT=$(mktemp -d); npx tsc -p . --outDir $OUT; rm -rf $OUT'", + "precheck": "pnpm --filter @streamplace/i18n compile", "gen:emoji": "node scripts/gen-emoji-data.mjs", - "prebuild": "pnpm gen:emoji", + "prebuild": "pnpm --filter @streamplace/i18n compile && pnpm gen:emoji", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "test": "vitest run", + "pretest": "pnpm --filter @streamplace/i18n compile", "test:watch": "vitest", "e2e": "npx playwright test", "e2e:ui": "npx playwright test --ui" diff --git a/js/web/public/locales/en-US/common.json b/js/web/public/locales/en-US/common.json deleted file mode 100644 index 2deeccfed..000000000 --- a/js/web/public/locales/en-US/common.json +++ /dev/null @@ -1,388 +0,0 @@ -{ - "loading": "Loading...", - "error": "Error", - "cancel": "Cancel", - "confirm": "Confirm", - "close": "Close", - "open": "Open", - "ok": "OK", - "yes": "Yes", - "no": "No", - "continue": "Continue", - "back": "Back", - "next": "Next", - "finish": "Finish", - "save": "Save", - "delete": "Delete", - "edit": "Edit", - "create": "Create", - "update": "Update", - "refresh": "Refresh", - "success": "Success", - "warning": "Warning", - "info": "Information", - "content-warning-badge": "Intended for certain audiences", - "content-warning-title": "Heads up!", - "content-warning-description": "This may contain:", - "search-placeholder": "Search...", - "search-for-streamers": "Search for streamers...", - "message-input": "Enter your message...", - "please-log-in-to-access-this-page": "Please log in to access this page", - "go-to-settings": "Go to Settings", - "go-back": "Go Back", - "sign-in": "Sign In", - "log-in": "Log in", - "sign-up": "Sign up", - "go-home": "Go home", - "try-again": "Try again", - "completing-sign-in": "Completing sign-in…", - "already-logged-in": "You're already logged in.", - "signed-in-as": "Signed in as @{$handle}", - "signed-in-as-code": "Signed in as {$handle}", - "sign-in-description": "Sign in with your Atmosphere account, such as your {$network} account.", - "handle-label": "Handle", - "redirecting": "Redirecting…", - "sign-in-failed": "Sign-in failed", - "welcome-user": "Welcome, {$username}!", - "notification-count": "{$count ->\n [0] No notifications\n [1] One notification\n *[other] {$count} notifications\n }", - "user-offline": "user is offline", - "user-offline-message": "{$source ->\n [streamer] Looks like <1>@{$handle} is offline, but they recommend checking out:\n *[default] Looks like <1>@{$handle} is offline, but we recommend checking out:\n }", - "user-offline-no-recommendations": "Looks like <1>@{$handle} is offline right now.\nCheck back later.", - "streaming-title": "streaming {$title}", - "viewer-count": "{$count ->\n [0] 0 viewers\n [1] 1 viewer\n *[other] {$count} viewers\n }", - "pds-selector-title": "New to the Atmosphere?", - "pds-selector-description": "Choose where your Atmosphere account is hosted. You can use it with {$network}, Streamplace, and other Atmosphere apps.", - "pds-selector-show-other-hosts": "See {$count} other account hosts", - "pds-selector-custom-label": "Another account host", - "pds-selector-custom-description": "Enter your own account host URL", - "pds-selector-custom-url-label": "Account host URL", - "pds-selector-custom-url-placeholder": "https://pds.example.com", - "pds-selector-learn-more": "Learn more about self-hosting", - "pds-selector-info": "Each host has their own policies and reliability standards. Your account data lives on the host you choose, and you can migrate later.", - "pds-selector-different-policies": "Streamplace has separate moderation policies. You can be banned from Streamplace regardless of which account host you choose.", - "pds-selector-read-policies": "Read {$label}'s Terms of Service and Privacy Policy before continuing.", - "pds-selector-handle-policy-checkbox": "I have read and agree to the handle policy", - "creator-not-found-title": "Creator not found", - "creator-not-found-description": "We couldn't find an Atmosphere account for @{$handle}.", - "creator-lookup-failed-title": "We couldn't load this creator", - "creator-lookup-failed-description": "The Atmosphere directory isn't responding right now. Try again in a moment.", - "profile": "Profile", - "more-results": "More results", - "nav-home": "Home", - "nav-videos": "Videos", - "nav-following": "Following", - "nav-account": "Account", - "chat-no-messages": "No messages yet", - "chat-scroll-to-top": "Scroll to top", - "chat-scroll-to-bottom": "Scroll to bottom", - "chat-reply-to-message": "Reply to message", - "chat-pin-message": "Pin message", - "chat-unpin-message": "Unpin message", - "chat-dismiss-pinned": "Dismiss pinned message", - "chat-view-profile-bluesky": "View profile on {$network}", - "chat-send-message": "Send a message", - "chat-replying-to": "Replying to {$handle}", - "chat-insert-emoji": "Insert emoji", - "chat-skin-tone": "Skin tone", - "chat-send-button": "Chat", - "chat-failed-send": "Failed to send message", - "chat-log-in-to": "Log in to chat", - "chat-pop-out": "Pop out chat", - "chat-close": "Close chat", - "chat-open": "Open chat", - "chat-moderation-menu": "Message options", - "chat-pin-until-stream-end": "Until stream end", - "chat-pin-duration-minutes": "{$count} min", - "chat-hide-message": "Hide message", - "chat-block-user": "Block user", - "chat-delete-message": "Delete message", - "chat-delete-confirm": "Are you sure? Click again to confirm.", - "streamer-fallback": "Streamer", - "view-profile": "View profile", - "moderation-error-title": "Moderation action failed", - "moderation-message-pinned": "Comment pinned", - "moderation-user-blocked": "{$handle} has been blocked from this channel", - "moderation-hide-failed": "Failed to hide message", - "moderation-block-failed": "Failed to block user", - "moderation-pin-failed": "Failed to pin message", - "moderation-delete-failed": "Failed to delete message", - "moderators-title": "Moderators", - "moderators-add": "Add", - "moderators-adding": "Adding…", - "moderators-loading": "Loading moderators…", - "moderators-empty": "No moderators yet", - "moderators-empty-hint": "Add moderators to help manage your chat", - "moderators-add-title": "Add Moderator", - "moderators-add-description": "Enter the DID or handle of the user you want to add as a moderator and select their permissions.", - "moderators-handle-label": "Moderator DID or handle", - "moderators-handle-placeholder": "handle.bsky.social or did:plc:…", - "moderators-permissions-label": "Permissions", - "moderators-permission-ban": "Ban users", - "moderators-permission-ban-desc": "Block users from chat", - "moderators-permission-hide": "Hide messages", - "moderators-permission-hide-desc": "Hide individual chat messages", - "moderators-permission-manage": "Manage livestream", - "moderators-permission-manage-desc": "Update stream title", - "moderators-permission-pin": "Pin messages", - "moderators-permission-pin-desc": "Pin and unpin chat messages", - "moderators-added-toast": "Moderator added", - "moderators-add-failed": "Failed to add moderator", - "moderators-remove": "Remove", - "moderators-remove-title": "Remove moderator?", - "moderators-remove-description": "This will revoke all moderation permissions for {$handle}.", - "moderators-removed-toast": "Moderator removed", - "moderators-remove-failed": "Failed to remove moderator", - "moderators-expired": "Expired", - "moderators-expires": "Expires {$date}", - "moderators-error-required": "Please enter a DID or handle", - "moderators-error-permissions": "Please select at least one permission", - "moderators-cancel": "Cancel", - "chat-report-message": "Report message…", - "report-live-stream": "Report Live Stream", - "report-something-else": "Report Something Else", - "report-title": "Report", - "report-description": "Why are you submitting this report?", - "report-reason-spam": "Spam", - "report-reason-spam-desc": "Excessive unwanted promotion, replies, mentions", - "report-reason-violation": "Rule Violation", - "report-reason-violation-desc": "Direct, blatant violation of laws or terms of service", - "report-reason-misleading": "Misleading Content", - "report-reason-misleading-desc": "Misleading identity, affiliation, or content", - "report-reason-sexual": "Sexual Content", - "report-reason-sexual-desc": "Unwanted or mislabeled sexual content", - "report-reason-rude": "Harassment", - "report-reason-rude-desc": "Rude, harassing, explicit, or otherwise unwelcoming behavior", - "report-reason-other": "Other", - "report-reason-other-desc": "Reports not falling under another report category", - "report-comments-label": "Additional comments (optional)", - "report-comments-placeholder": "Provide additional context for this report…", - "report-submit": "Submit", - "report-submitting": "Submitting…", - "report-submitted": "Report submitted", - "report-failed": "Failed to submit report", - "badge-moderator": "Moderator", - "badge-streamer": "Streamer", - "badge-vip": "VIP", - "badge-bot": "Bot", - "badge-event": "Event", - "badge-fallback": "Badge", - "badge-issued-by-streamplace": "Issued by Streamplace", - "badge-issued-by": "Issued by {$issuer}", - "badge-issued": "Issued", - "badge-self-labeled": "Self-labeled", - "badge-details": "Badge details", - "badge-back-to-profile": "Back to profile", - "badge-previous": "Previous badge", - "badge-next": "Next badge", - "badge-count": "Badge {$current} of {$total}", - "stream-details": "Stream details", - "edit-title": "Edit title", - "edit-title-dialog-title": "Edit stream title", - "edit-title-label": "Stream title", - "edit-title-saving": "Saving…", - "edit-title-saved": "Stream title updated", - "edit-title-failed": "Failed to update stream title", - "activity-events": "Events", - "activity-just-chatting": "Just Chatting", - "activity-music": "Music", - "activity-art": "Art", - "activity-software-dev": "Software Dev", - "activity-cooking": "Cooking", - "activity-miniatures": "Miniatures", - "activity-makers-crafting": "Makers & Crafting", - "activity-fitness": "Fitness", - "activity-sports": "Sports", - "watching-count": "{$count} watching", - "follow": "Follow", - "share-copy": "Copy", - "share-copied": "Copied", - "share-copy-link": "Copy Link", - "share-copy-embed-code": "Copy Embed Code", - "share-copy-embed-url": "Copy Embed URL", - "share-copy-failed": "Couldn’t copy that", - "share-video": "Share", - "share-video-message": "Watch {$title} on Streamplace", - "share-to-bluesky": "Share to {$network}", - "share-more-options": "More sharing options", - "share-failed": "Couldn’t open sharing options", - "like-video": "Like", - "unlike-video": "Unlike", - "like-update-failed": "Couldn’t update like", - "like-state-restored": "Your previous like state was restored.", - "more-actions": "More actions", - "video-tools": "Video tools", - "video-embed": "Embed", - "more-details": "More details", - "less-details": "Less details", - "offline": "Offline", - "live-badge": "Live", - "player-buffering": "Buffering", - "reconnecting": "Reconnecting…", - "stream-may-resume": "The stream may resume shortly.", - "stream-offline": "Stream offline", - "user-not-streaming": "{$user} is not currently streaming", - "stream-is-offline-title": "Stream is offline", - "user-not-streaming-check-back": "{$user} is not currently streaming. Check back later.", - "back-to-home": "Back to home", - "download-video": "Download video", - "untitled": "Untitled", - "default-stream-title": "A livestream!", - "pip-enter": "Picture-in-picture", - "pip-exit": "Exit picture-in-picture", - "theatre-enter": "Theatre mode", - "theatre-exit": "Exit theatre mode", - "teleporting-in": "Teleporting in", - "teleporting-to": "Teleporting to @{$handle}", - "views-count": "{$count ->\n [one] {$count} view\n *[other] {$count} views\n }", - "likes-count": "{$count ->\n [one] {$count} like\n *[other] {$count} likes\n }", - "could-not-load-streams": "Could not load streams. You might be offline.", - "live-now-count": "{$count ->\n [one] {$count} person live now\n *[other] {$count} people live now\n }", - "no-one-streaming": "No one is streaming right now", - "check-back-later": "Check back later?", - "hero-title": "The video layer for everything.", - "hero-description": "Streamplace is a streaming platform built on the AT Protocol.", - "learn-more": "Learn more", - "videos-title": "Videos", - "no-videos-yet": "No videos yet.", - "could-not-load-videos": "Couldn't load videos: {$error}", - "no-results-for": "No results for \"{$query}\"", - "find-streamers": "Find streamers by name or handle", - "search": "Search", - "search-failed": "Search failed", - "something-went-wrong": "Something went wrong", - "unexpected-error": "An unexpected error occurred.", - "upload-add-tag": "Add tag, press Enter", - "upload-add-thumbnail": "Add thumbnail image", - "upload-cancel": "Cancel", - "upload-choose-file": "Choose a video file", - "upload-choose-file-btn": "Choose file", - "upload-content-warnings": "Content Warnings", - "upload-delete": "Delete", - "upload-deleting": "Deleting...", - "upload-description": "Description", - "upload-description-placeholder": "Describe your video...", - "upload-details": "Details", - "upload-file": "File", - "upload-license": "License", - "upload-optional-info": "Optional · JPG, PNG up to 975KB", - "upload-preparing": "Preparing upload...", - "upload-processing": "Processing video", - "upload-publish": "Publish", - "upload-published": "Published", - "upload-publishing": "Publishing...", - "upload-publishing-btn": "Publishing...", - "upload-ready-publish": "Ready to publish", - "upload-status": "Status", - "upload-tags": "Tags", - "upload-thumbnail": "Thumbnail", - "upload-thumbnail-preview": "Thumbnail preview", - "upload-title": "Title", - "upload-title-placeholder": "Give your video a title", - "upload-update-video": "Update Video", - "upload-updating": "Updating...", - "upload-view-video": "View video →", - "upload-waiting-process": "Waiting to process...", - "create-key-description-delete-if-exposed": "If you think your stream key has been exposed, delete it immediately and create a new key.", - "create-key-description-staff": "We will never, ever, ask for your key.", - "create-key-do-not-share": "DO NOT SHARE THIS KEY, including showing it on stream. Anyone in possession of your key may be able to stream from your account.", - "create-key-title": "Are you sure about creating a new stream key?", - "create-stream-key": "Create Stream Key", - "stream-key": "Stream Key", - "stream-key-help": "Your stream key identifies you to Streamplace. You can have more than one stream key at a time, and it's a good idea to prune old keys that you aren't using via the key manager.", - "stream-key-info-description": "For security reasons, you won't be able to view it again through your account. If you lose this stream key, you'll need to generate a new one.", - "stream-key-label": "Stream Key", - "stream-key-save-now": "Please save this stream key somewhere safe.", - "allow-everyone-archive": "Allow everyone to archive your content indefinitely", - "allow-everyone-distribute": "Allow everyone to distribute your content", - "allowed-broadcasters": "Allowed Broadcasters", - "allowed-broadcasters-help": "Enter the DIDs of the broadcasters you want to allow, one per line.", - "content-rights": "Content Rights", - "content-rights-help": "Optional copyright and license information for your stream.", - "content-warnings": "Content Warnings", - "content-warnings-help": "You're required to flag your stream with themes that viewers may want a heads-up about.", - "copied-to-clipboard": "Copied to clipboard", - "copy-link": "Copy link", - "copyright-notice": "Copyright Notice", - "copyright-year": "Copyright Year", - "credit-line": "Credit Line", - "custom-license": "Custom…", - "custom-license-url": "Custom License URL/Text", - "delete-after": "Delete After", - "delete-after-help": "Duration in seconds (e.g. 300 for 5 minutes).", - "distribution": "Distribution", - "distribution-help": "Control who can redistribute your stream and for how long archives are kept.", - "editing-video": "Editing video", - "failed-to-create-key": "Failed to create key", - "go-to-video": "Go to video", - "key-manager": "Key Manager", - "license": "License", - "login-to-manage-videos": "Please log in to manage your videos.", - "login-to-upload": "Please log in to upload videos.", - "metadata": "Metadata", - "metadata-learn-more": "Learn more about content metadata", - "metadata-save-failed": "Failed to save metadata", - "metadata-saved": "Metadata saved", - "moderation": "Moderation", - "moderation-help": "Add/remove stream moderators. Moderators can hide chat messages and time out users in your chat.", - "nav-dashboard": "Dashboard", - "nav-settings": "Settings", - "no-videos-yet-upload": "No videos yet.", - "optional": "Optional", - "required": "Required", - "select-license": "Select a license…", - "login-show-live-on-bluesky": "Show when I'm live on {$network}", - "login-show-live-on-bluesky-description": "Gives your {$network} avatar the red LIVE ring while you stream and lets Streamplace post announcements for you. Uncheck to sign in without granting any access to your {$network} account.", - "player-play": "Play", - "player-pause": "Pause", - "player-mute": "Mute", - "player-unmute": "Unmute", - "player-seek": "Seek", - "player-settings": "Settings", - "player-fullscreen": "Fullscreen", - "player-exit-fullscreen": "Exit fullscreen", - "player-theatre": "Theatre mode", - "player-exit-theatre": "Exit theatre mode", - "player-pip": "Picture-in-picture", - "player-exit-pip": "Exit picture-in-picture", - "player-danmu": "Danmu", - "player-enable-danmu": "Enable danmu", - "player-disable-danmu": "Disable danmu", - "player-quality": "Quality", - "player-latency": "Latency", - "player-quality-auto": "Auto", - "player-stats": "Player stats", - "player-stats-resolution": "Resolution", - "player-stats-viewport": "Viewport", - "player-stats-bitrate": "Bitrate", - "player-stats-skipped": "Skipped", - "player-stats-buffer": "Buffer", - "player-stats-codecs": "Codecs", - "player-stats-protocol": "Protocol", - "player-stats-latency-mode": "Latency Mode", - "player-stats-render-surface": "Render Surface", - "player-stats-session": "Session", - "player-protocol-webrtc": "WebRTC", - "player-protocol-hls": "HLS", - "player-latency-low": "Low Latency", - "player-latency-standard": "Standard", - "player-error-network": "Network error", - "player-error-playback": "Playback error", - "player-error-format": "Stream format not supported", - "player-error-stream-not-live": "Stream not live", - "player-error-network-retrying": "Network error. Retrying.", - "player-error-media-recovering": "Media error. Recovering.", - "player-error-hls-unsupported": "Your browser doesn't support HLS playback.", - "player-error-stream-unavailable": "Stream unavailable. Stopped reconnecting.", - "player-error-sdp-failed": "Failed to create SDP offer", - "player-error-ice-failed": "Failed to gather ICE candidates", - "player-error-negotiation-failed": "WebRTC negotiation failed", - "player-error-stream-stalled": "Stream stalled. Reconnecting.", - "player-error-connection-lost": "Connection lost. Reconnecting.", - "upload-error-format": "File doesn't appear to be a supported video format (MP4, WebM, MKV, MOV, AVI, OGG, FLV, MPEG-TS).", - "upload-error-timeout": "Processing timed out. Please try again later.", - "upload-error-processing": "Processing failed", - "upload-error-not-logged-in": "Not logged in", - "upload-title-untitled": "Untitled", - "emoji-skin-tone": "Skin tone", - "emoji-search": "Search emoji…" -} diff --git a/js/web/public/locales/en-US/settings.json b/js/web/public/locales/en-US/settings.json deleted file mode 100644 index 1b664285a..000000000 --- a/js/web/public/locales/en-US/settings.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Download New Update", - "check-for-updates": "Check for Updates", - "bundled-runtype": "Bundled", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Recovery Mode", - "modal-latest-version": "You are using the latest version.", - "modal-no-update-available": "You are on the latest version of Streamplace, hooray!", - "modal-update-available-title": "Update Available", - "modal-update-available-description": "A new version of Streamplace is ready to download", - "modal-update-failed": "Update check failed. You may need to update the app through the {$store}.", - "modal-update-failed-title": "Update Failed", - "modal-update-failed-description": "Update check failed. You may need to update the app through the {$store}.", - "button-reload-app-on-update": "Apply Update (will reload app)", - "use-custom-node": "Use Custom Node", - "default-url": "Default: {$url}", - "enter-custom-node-url": "Enter custom node URL", - "save-button": "Save", - "try-new-web": "Try the new web (beta)", - "try-new-web-description": "Switch to the new web interface. You can switch back anytime from this same setting.", - "try-old-app": "Use the original interface", - "try-old-app-description": "Go back to the original Streamplace interface.", - "language-selection": "Language", - "language-selection-description": "Choose your preferred language", - "input-search-languages": "Search languages...", - "help-translate": "Help us translate Streamplace", - "help-translate-description": "We're looking for volunteers to help translate Streamplace into more languages. If you're interested, please reach out to us on Discord or GitHub!", - "currently-translating": "Translations are on the way", - "currently-translating-description": "Some parts of the app may look incomplete. Thank you for your patience!", - "debug-recording-title": "Allow {$host} to record your livestream for debugging and improving the service", - "debug-recording-description": "Optional", - "livestream-recording-title": "Record my livestreams into VODs on {$host}", - "livestream-recording-description": "When enabled, your livestreams are saved so you can finalize and publish them as videos", - "auto-publish-vods-title": "Publish my livestreams as VODs automatically", - "auto-publish-vods-description": "When a recorded livestream ends, {$host} publishes it as a video right away, without waiting for you to finalize it", - "auto-publish-vods-stream-label": "Publish VOD automatically", - "auto-publish-vods-stream-description": "Publish recorded streams as VODs automatically. Applies to future streams too, until you turn it off.", - "manage-keys": "Manage Keys", - "settings-title": "Settings", - "error": "Error", - "about": "About", - "account": "Account", - "advanced": "Advanced", - "danmu": "Danmu", - "developer": "Developer", - "languages": "Languages", - "privacy-security": "Privacy & Security", - "streaming": "Streaming", - "notifications": "Notifications", - "notifications-title": "Push Notifications", - "notifications-web-description": "Get notified when streamers you follow go live.", - "notifications-mobile-description": "Push notifications are managed by your device settings.", - "notifications-blocked-description": "Blocked — you denied notification permission in your browser.", - "notifications-blocked-help": "To re-enable, update site permissions in your browser settings, then toggle this on again.", - "cancel": "Cancel", - "create": "Create", - "delete": "Delete", - "refresh": "Refresh", - "sign-in": "Sign In", - "update": "Update", - "log-out": "Log out", - "optional": "optional", - "account-greeting": "Hey, @{$handle}.", - "edit-profile-bluesky": "Edit profile (on {$network})", - "change-name-color": "Change name color", - "key-management": "Key Management", - "key-manager": "Key Manager", - "your-stream-pubkeys": "Your Stream Public Keys", - "no-keys": "No keys configured", - "pubkey-description": "Public keys are paired with stream keys (used in streaming software) to sign and verify your stream", - "keys-count": "{$count ->\n [one] {$count} key\n *[other] {$count} keys\n }", - "backup": "Backup", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Automatically backup recordings to S3-compatible storage", - "backup-connection-url": "Connection URL", - "backup-connection-url-placeholder": "Must be a valid S3 URL in the format s3+https://ACCESS_KEY:SECRET_KEY@region.endpoi.nt/bucket", - "backup-endpoint": "Endpoint", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Bucket", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Access Key", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Secret Key", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "backup-region": "Region", - "backup-region-placeholder": "us-east-1", - "backup-test-connection": "Test Connection", - "backup-testing-connection": "Testing connection...", - "backup-connection-successful": "Connection successful", - "backup-connection-failed": "Failed to connect", - "show-password-in-url": "Show password in URL", - "show-password-in-url-description": "Display the secret key in the connection URL (if input)", - "requested-seconds-per-segment": "Seconds per segment", - "requested-seconds-per-segment-description": "Set the seconds per segment you wish to request the server use", - "recommendations": "Recommendations", - "manage-recommendations": "Manage Recommendations", - "recommendations-to-others": "Recommendations", - "recommendations-description": "Share up to 8 streamers you recommend to your viewers", - "no-recommendations-yet": "No recommendations configured yet", - "add-recommendation": "Add Recommendation", - "streamer-did": "Streamer DID", - "recommendations-count": "{$count ->\n [one] {$count} recommendation\n *[other] {$count} recommendations\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Webhook Integrations", - "webhook-integrations-description": "Connect external services to receive real-time updates about your streams", - "create-webhook": "Create Webhook", - "edit-webhook": "Edit Webhook", - "delete-webhook": "Delete Webhook", - "no-webhooks-yet": "No webhooks configured yet", - "failed-load-webhooks": "Failed to load webhooks", - "webhook-will-no-longer-receive-events": "This webhook will no longer receive events", - "create-first-webhook-description": "Create your first webhook to start receiving stream events", - "example-captain-hook": "Captain Hook", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "Activates on:", - "events": "Events", - "events-livestream": "Livestream Events", - "events-chat": "Chat Events", - "events-stream-received": "Stream Received Events", - "untitled-webhook": "Untitled Webhook", - "inactive": "Inactive", - "active": "Active", - "multistream": "Multistreaming", - "multistream-targets": "Multistream Targets", - "multistream-description": "Automatically push your Streamplace livestreams to other streaming services like Twitch or YouTube.", - "create-multistream-target": "Create Multistream Target", - "untitled-multistream-target": "Untitled Target", - "failed-load-multistream-targets": "Failed to load multistream targets. Please try again.", - "failed-toggle-multistream-target": "Failed to toggle multistream target. Please try again.", - "failed-delete-multistream-target": "Failed to delete multistream target. Please try again.", - "no-multistream-targets-yet": "No targets yet!", - "no-multistream-destinations": "No multistream destinations yet", - "multistream-targets-count": "{$count ->\n [one] {$count} target\n *[other] {$count} targets\n }", - "multistream-delete-target-confirmation": "Are you sure you want to delete \"{$target}\"?", - "this-action-cannot-be-undone": "This action cannot be undone.", - "rtmp-target-name": "RTMP Target", - "rtmp-target-url": "RTMP URL", - "rtmp-target-name-placeholder": "My Multistream Target", - "multistream-create-target": "Create Target", - "multistream-edit-target": "Edit Target", - "created": "created", - "status": "status", - "debug-recording": "Debug Recording", - "danmu-enabled": "Enable Danmu", - "danmu-enabled-description": "Display live chat messages as floating comments on your screen", - "danmu-opacity": "Opacity", - "danmu-speed": "Speed", - "danmu-lane-count": "Lane Count", - "danmu-max-messages": "Max Messages", - "app-version-description": "No updates are available at this time", - "confirm-delete": "Are you sure you want to delete this?", - "action-cannot-be-undone": "This action cannot be undone", - "name-optional": "Name (optional)", - "deleting": "Deleting...", - "saving": "Saving...", - "go-to-dashboard": "Go to Dashboard", - "need-setup-live-dashboard": "Need to set up streaming first? Visit the live dashboard", - "no-languages-found": "No languages found", - "branding": "Branding", - "branding-admin": "Branding Administration", - "branding-admin-description": "Customize your Streamplace instance. Note that settings may take a few hours to propagate.", - "branding-login-required": "Please log in to manage branding", - "branding-configuration": "Configuration", - "branding-text-settings": "Text Settings", - "branding-colors": "Colors", - "branding-legal-links": "Legal Links", - "branding-bundle": "Export and import", - "branding-bundle-description": "A bundle is a zip with branding.yaml (everything set here, with the defaults listed for reference) plus the image files. Edit the YAML by hand or import it on another node.", - "branding-bundle-export": "Download bundle", - "branding-bundle-import": "Import bundle…", - "branding-bundle-merge": "Merge: keep settings the bundle doesn't mention (otherwise they are removed)", - "branding-bundle-preview": "Changes from {$name}", - "branding-bundle-no-changes": "Nothing would change.", - "branding-bundle-apply": "Apply", - "branding-bundle-imported": "Branding imported ({$count} keys)", - "branding-bundle-import-failed": "Import failed", - "branding-bundle-export-failed": "Export failed", - "branding-bundle-invalid": "That bundle can't be imported", - "branding-navigation": "Navigation", - "branding-chat-layout": "Chat message layout", - "branding-chat-layout-description": "Compact is one line per message with the time and handle. Avatar shows each message as a post: avatar, display name, handle and age above the text.", - "branding-chat-compact": "Compact", - "branding-chat-avatar": "Avatar", - "branding-chat-name-colors": "Chat name colors", - "branding-chat-name-colors-description": "Show display names in each user's chosen chat color, or in the default text color.", - "branding-chat-name-colors-on": "User colors", - "branding-chat-name-colors-off": "Default color", - "branding-chat-badges": "Chat badges", - "branding-chat-badges-description": "Badges beside names in chat. All shows everything; Custom only shows badges issued from your badge definitions and hides the built-in streamer, moderator and bot marks; None hides every badge. Verified checks are separate.", - "branding-chat-badges-all": "All", - "branding-chat-badges-custom": "Custom only", - "branding-chat-badges-none": "None", - "branding-nav-links": "Navigation links", - "branding-nav-links-description": "Replace the sidebar's browse and creator sections with your own links: a JSON list of objects with label, url and an optional icon (home, search, play, live, bell, message, hash, list, bookmark, user, settings, video, book). Paths starting with / navigate inside the app; other URLs open as links.", - "branding-nav-cta": "Navigation button", - "branding-nav-cta-description": "A highlighted button under the navigation links: JSON with label and url.", - "branding-app-banner": "Mobile app suggestion", - "branding-app-banner-description": "On phones, the web app suggests the Streamplace mobile app: a banner in the page and, on iOS, the App Store's Smart App Banner. Turn it off for a node that is its own product.", - "branding-app-banner-on": "Suggest the app", - "branding-app-banner-off": "Off", - "branding-social-links": "Social links", - "branding-social-links-description": "The row of icon links at the bottom of the sidebar. The first field is its heading; the second is a JSON list of objects with label, url and icon, where icon is bluesky, discord, one of the navigation icon names, or socialIcon1 to socialIcon4 for an uploaded icon. Unset shows the Streamplace links; Hide removes the row.", - "branding-social-heading-placeholder": "Say Hello?", - "branding-social-hide": "Hide", - "branding-upload": "Upload", - "branding-remove": "Remove", - "branding-social-icons-description": "Uploaded icons, referenced from the list above by slot name. SVG preferred, 24 x 24, max 64KB; an SVG drawn with currentColor takes the sidebar's icon color.", - "branding-theme": "Theme", - "branding-theme-description": "Page background and text color, one pair per color scheme; the app derives its raised surfaces, muted text and hairline borders from them. Hex colors (#rrggbb). Accent and status colors are separate settings above. Leave a value unset to use the default, or set only the background and the text color is chosen to read on it.", - "branding-background-dark": "Page background (dark mode)", - "branding-foreground-dark": "Text color (dark mode)", - "branding-background-light": "Page background (light mode)", - "branding-foreground-light": "Text color (light mode)", - "branding-reset": "Reset", - "branding-default": "default", - "branding-status-colors": "Status Colors", - "branding-status-colors-description": "Colors for errors, success, warnings, informational notes and the live badge. Hex colors (#rrggbb); text on top of them is chosen automatically.", - "branding-danger-color": "Danger / error", - "branding-success-color": "Success", - "branding-warning-color": "Warning", - "branding-info-color": "Info", - "branding-live-color": "Live badge", - "branding-images": "Images", - "branding-broadcaster-did": "Broadcaster DID", - "branding-broadcaster-did-description": "Leave empty to use server default", - "branding-site-title": "Site Title", - "branding-site-title-placeholder": "Enter new site title", - "branding-site-description": "Site Description", - "branding-site-description-placeholder": "Enter site description", - "branding-link-cards": "Link cards", - "branding-link-cards-description": "What a shared link shows for each page: the stream page, the front page (live tab), the videos tab, a video page and the go-live tab. Templates take {} (the site name below, or the site title), and on pages about one account {} (their display name, else handle) and {}. Descriptions of stream and video pages are their post text.", - "branding-network-name": "Network name", - "branding-network-name-description": "What the app calls the social network viewers sign in with and share to: \"Sign in with your {$network} account\", \"Share to {$network}\", the live-ring permission. Default Bluesky.", - "branding-network-profile-url": "Profile link", - "branding-network-profile-url-description": "Where a chat user's profile link goes, from the profile card and the message menu. Use {} and {} as placeholders. Default is the Bluesky profile page.", - "branding-network-icon-description": "Icon shown on those profile links. SVG preferred, max 64KB; unset shows the Bluesky butterfly.", - "branding-verified-icon-description": "Badge shown beside verified users. SVG preferred, max 64KB, currentColor takes the primary color; unset shows a check in the primary color.", - "branding-login-placeholder": "Login handle example", - "branding-login-placeholder-description": "The example handle shown in the login form's empty handle field, e.g. you.example.com.", - "branding-default-streamer": "Default Streamer", - "branding-default-streamer-none": "None", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-default-video": "Default video", - "branding-default-video-description": "While set, the front page shows this video instead of the default streamer's stream: the replay to send everyone to after an event. Its at:// URI, or its page path (handle/video/rkey). Clear it to return the front page to the streamer.", - "branding-default-video-placeholder": "at://did:plc:.../place.stream.video/... or handle/video/rkey", - "branding-clear-default-video": "Clear default video", - "branding-clear-default-streamer": "Clear Default Streamer", - "branding-primary-color": "Primary Color", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Accent Color (secondary surfaces, highlights)", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Main Logo", - "branding-main-logo-description": "SVG, PNG, or JPEG (max 500KB)", - "branding-favicon": "Default favicon", - "branding-favicon-light": "Light mode favicon", - "branding-favicon-dark": "Dark mode favicon", - "branding-favicon-description": "SVG, PNG, or ICO (max 100KB). Used when an override is absent or the client does not support theme selection. An icon with a background works well as the default.", - "branding-favicon-override-description": "SVG, PNG, or ICO (max 100KB). Overrides the default for the browser or OS appearance, not the app theme. Transparent backgrounds are supported.", - "branding-sidebar-bg": "Sidebar Background Image", - "branding-sidebar-bg-description": "SVG, PNG, or JPEG (max 500kb) - appears aligned to bottom of sidebar, full width. Upload an image with opacity for best results, as there is not currently a separate opacity option.", - "branding-current": "Current: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Upload Logo", - "branding-delete-logo": "Delete Logo", - "branding-upload-favicon": "Upload Favicon", - "branding-delete-favicon": "Delete Favicon", - "branding-upload-background": "Upload Background", - "branding-link-banner": "Link Preview Image", - "branding-link-banner-description": "The image shown when the site's link is shared (OpenGraph / Twitter card). PNG, JPEG or WebP, 1200 x 630 recommended, max 2MB. The card's title and description come from the Site Title and Site Description above.", - "branding-upload-link-banner": "Upload Image", - "branding-delete-link-banner": "Remove Image", - "branding-delete-background": "Delete Background", - "branding-web-only": "Image uploads are only available on web.", - "refresh-branding": "Refresh branding assets", - "branding-add-legal-link": "Add Legal Link", - "branding-edit-legal-link": "Edit Legal Link", - "branding-legal-link-text-placeholder": "Link text (e.g., Privacy Policy)", - "branding-legal-link-url-placeholder": "URL (e.g., https://example.com/privacy)", - "add": "Add", - "edit": "Edit", - "branding-not-authenticated": "Please log in first", - "branding-empty-value": "Please enter a value", - "branding-update-success": "{$key} updated successfully", - "branding-upload-success": "{$key} uploaded successfully", - "branding-delete-success": "{$key} deleted successfully", - "branding-upload-failed": "Failed to upload", - "branding-delete-failed": "Failed to delete", - "branding-not-available": "File uploads are only available on web", - "node-legal-documents": "Broadcaster-specific Documents", - "backup-save": "Save backup settings", - "backup-saving": "Saving backup settings...", - "backup-secret-key-set-placeholder": "(Password already set)", - "backup-error-invalid-endpoint": "Must be a valid domain name", - "backup-error-invalid-bucket": "Must contain only lowercase letters, numbers, dots, and hyphens", - "backup-error-invalid-segment-duration": "Must be between 1 and 60 seconds", - "backup-error-load-failed": "Failed to load storage settings", - "backup-error-update-failed": "Failed to update backup status", - "backup-error-save-failed": "Failed to save storage settings", - "backup-error-missing-secret": "Cannot update S3 settings without the secret key. Please re-enter it.", - "backup-segment-duration-placeholder": "6", - "badges": "Badges", - "badges-cosmetic-section": "Cosmetic Badges", - "badges-empty-state": "You haven't been issued any badges yet.", - "badges-failed-load": "Failed to load badges", - "badges-failed-update": "Failed to update badge selection", - "badges-issued-by": "Issued by {$issuer}", - "badges-streamer-section": "Streamer Badges", - "issue-badges": "Issue Badges", - "issue-badges-back-to-definitions": "Badge Definitions", - "issue-badges-badge-name": "Badge Name", - "issue-badges-badge-name-placeholder": "e.g. VIP, Supporter", - "issue-badges-badge-type": "Badge Type", - "issue-badges-choose-image": "Choose Image", - "issue-badges-create-definition": "Create Badge Definition", - "issue-badges-create-definition-description": "Define a new badge type that can be issued to viewers", - "issue-badges-create-definition-subtitle": "Define a new badge type", - "issue-badges-definition-created": "Badge definition created", - "issue-badges-description-optional": "Description (optional)", - "issue-badges-description-placeholder": "Optional description for this badge", - "issue-badges-failed-create": "Failed to create badge definition", - "issue-badges-failed-issue": "Failed to issue badge", - "issue-badges-failed-load": "Failed to load badge definitions", - "issue-badges-image-optional": "Image (optional)", - "issue-badges-image-too-large": "Image must be under 256KB", - "issue-badges-image-web-only": "Image upload is only available on web", - "issue-badges-issue-badge": "Issue Badge", - "issue-badges-issue-badge-description": "Issue the \"{$name}\" badge to a viewer by their DID", - "issue-badges-issued": "Badge issued", - "issue-badges-issued-to": "Issued to {$did}", - "issue-badges-manage-description": "Create badge definitions and issue them to viewers", - "issue-badges-recipient-did": "Recipient DID", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Tap to issue", - "issue-badges-your-definitions": "Your Badge Definitions", - "chat-profile": "Chat Profile", - "chat-profile-login-required": "Please log in to edit your chat profile.", - "chat-profile-saved": "Chat profile saved", - "chat-profile-save-failed": "Failed to save chat profile", - "chat-profile-name-color": "Name Color", - "chat-profile-name-color-description": "Choose the color of your name in chat.", - "chat-profile-preview-message": "Hello, world!", - "chat-profile-self-labels": "Self Labels", - "chat-profile-label-bot": "Bot", - "chat-profile-label-bot-description": "Mark your chat messages as coming from a bot.", - "control-panel": "Control Panel", - "create-stream-key-in-stream-settings": "Create a stream key in Stream Settings", - "creator-settings": "Creator Settings", - "delete-all-keys": "Delete All Keys", - "delete-all-keys-btn": "Delete All", - "delete-all-keys-description": "This will permanently remove all {$count} stream keys. Any streaming software configured with these keys will stop working.", - "delete-all-keys-title": "Delete all stream keys?", - "failed-delete-keys": "Failed to delete {$count} key(s)", - "failed-to-delete-key": "Failed to delete key", - "my-videos": "My Videos", - "stream-settings": "Stream Settings", - "stream-settings-link": "Stream Settings", - "time-ago-days": "{$days}d ago", - "time-ago-hours": "{$hours}h ago", - "time-ago-minutes": "{$minutes}m ago", - "time-ago-seconds": "{$seconds}s ago", - "upload-videos": "Upload Videos" -} diff --git a/js/web/public/locales/es-ES/common.json b/js/web/public/locales/es-ES/common.json deleted file mode 100644 index c4448a6fc..000000000 --- a/js/web/public/locales/es-ES/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Cargando...", - "error": "Error", - "cancel": "Cancelar", - "confirm": "Confirmar", - "close": "Cerrar", - "open": "Abrir", - "ok": "OK", - "yes": "Sí", - "no": "No", - "continue": "Continuar", - "back": "Atrás", - "next": "Siguiente", - "finish": "Finalizar", - "save": "Guardar", - "delete": "Eliminar", - "edit": "Editar", - "create": "Crear", - "update": "Actualizar", - "refresh": "Actualizar", - "success": "Éxito", - "warning": "Advertencia", - "info": "Información", - "search-placeholder": "Buscar...", - "message-input": "Escribe tu mensaje...", - "please-log-in-to-access-this-page": "Por favor, inicia sesión para acceder a esta página", - "go-to-settings": "Ir a Configuración", - "go-back": "Volver", - "welcome-user": "¡Bienvenido, {$username}!", - "notification-count": "{$count ->\n [0] Sin notificaciones\n [1] Una notificación\n *[other] {$count} notificaciones\n }", - "user-offline": "usuario desconectado", - "user-offline-message": "{$source ->\n [streamer] Parece que <1>@{$handle} está desconectado, pero ellos recomiendan ver:\n *[default] Parece que <1>@{$handle} está desconectado, pero te recomendamos ver:\n }", - "user-offline-no-recommendations": "Parece que <1>@{$handle} está desconectado ahora mismo.\nVuelve más tarde.", - "streaming-title": "transmitiendo {$title}", - "viewer-count": "{$count ->\n [0] 0 espectadores\n [1] 1 espectador\n *[other] {$count} espectadores\n }", - "pds-selector-title": "¿Nuevo en Atmosphere?", - "pds-selector-description": "Necesitarás seleccionar un PDS (Servidor de Datos Personal) para acceder a apps en Atmosphere, como Bluesky, Tangled y Spark.", - "pds-selector-custom-label": "Otro PDS", - "pds-selector-custom-description": "Introduce la URL de tu propio servidor PDS", - "pds-selector-custom-url-label": "URL de PDS personalizado", - "pds-selector-custom-url-placeholder": "https://pds.ejemplo.com", - "pds-selector-learn-more": "Más información sobre el autoalojamiento", - "pds-selector-info": "Cada servidor tiene sus propias políticas y estándares de fiabilidad. Tus datos ATProto viven en el servidor que elijas y puedes migrar más tarde. Nota: Streamplace tiene sus propias reglas de moderación; puedes ser expulsado de Streamplace independientemente del servidor que elijas.", - "pds-selector-read-policies": "Lee los Términos de Servicio y la Política de Privacidad de {$label} antes de continuar.", - "pds-selector-handle-policy-checkbox": "He leído y acepto la política de identificadores", - "login-show-live-on-bluesky": "Mostrar cuando estoy en directo en Bluesky", - "login-show-live-on-bluesky-description": "Añade el anillo rojo LIVE a tu avatar de Bluesky mientras transmites y permite que Streamplace publique anuncios por ti. Desmárcalo para iniciar sesión sin conceder ningún acceso a tu cuenta de Bluesky." -} diff --git a/js/web/public/locales/es-ES/settings.json b/js/web/public/locales/es-ES/settings.json deleted file mode 100644 index cda42b357..000000000 --- a/js/web/public/locales/es-ES/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Descargar Nueva Actualización", - "check-for-updates": "Buscar Actualizaciones", - "bundled-runtype": "Empaquetado", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Modo de Recuperación", - "modal-latest-version": "Estás usando la última versión.", - "modal-no-update-available": "¡Tienes la versión más reciente de Streamplace, genial!", - "modal-update-available-title": "Actualización Disponible", - "modal-update-available-description": "Una nueva versión de Streamplace está lista para descargar", - "modal-update-failed": "La búsqueda de actualizaciones falló. Es posible que necesites actualizar\nla aplicación a través de {$store}.", - "modal-update-failed-title": "Actualización Falló", - "modal-update-failed-description": "La búsqueda de actualizaciones falló. Es posible que necesites actualizar\nla aplicación a través de {$store}.", - "button-reload-app-on-update": "Aplicar Actualización (recargará la aplicación)", - "use-custom-node": "Usar Nodo Personalizado", - "default-url": "Predeterminado: {$url}", - "enter-custom-node-url": "Introduce la URL del nodo personalizado", - "save-button": "Guardar", - "try-new-web": "Probar la nueva web (beta)", - "try-new-web-description": "Cambia a la nueva interfaz web. Puedes volver en cualquier momento desde este mismo ajuste.", - "try-old-app": "Usar la interfaz original", - "try-old-app-description": "Vuelve a la interfaz original de Streamplace.", - "language-selection": "Idioma", - "language-selection-description": "Elige tu idioma preferido", - "help-translate": "Ayúdanos a traducir Streamplace", - "help-translate-description": "Buscamos voluntarios para ayudar a traducir Streamplace a más idiomas. Si te interesa, contáctanos en Discord o GitHub!", - "currently-translating": "Las traducciones están en camino", - "currently-translating-description": "Algunas partes de la aplicación pueden verse incompletas. ¡Gracias por tu paciencia!", - "debug-recording-title": "Permitir que {$host} grabe tu retransmisión en directo para depuración y mejora del servicio", - "debug-recording-description": "Opcional", - "input-search-languages": "Buscar idiomas...", - "manage-keys": "Gestionar Claves", - "settings-title": "Configuración", - "loading": "Cargando...", - "error": "Error", - "cancel": "Cancelar", - "confirm": "Confirmar", - "welcome-user": "¡Bienvenido, {$username}!", - "notification-count": "{$count ->\n [0] Sin notificaciones\n [1] Una notificación\n *[other] {$count} notificaciones\n }", - "search-placeholder": "Buscar...", - "message-input": "Introduce tu mensaje...", - "success": "Éxito", - "warning": "Aviso", - "info": "Información", - "close": "Cerrar", - "open": "Abrir", - "delete": "Eliminar", - "edit": "Editar", - "create": "Crear", - "update": "Actualizar", - "refresh": "Actualizar", - "save": "Guardar", - "cancel-button": "Cancelar", - "ok": "Aceptar", - "yes": "Sí", - "no": "No", - "continue": "Continuar", - "back": "Volver", - "next": "Siguiente", - "finish": "Finalizar", - "about": "Acerca de", - "account": "Cuenta", - "advanced": "Avanzado", - "danmu": "Danmu", - "developer": "Desarrollador", - "languages": "Idiomas", - "privacy-security": "Privacidad y Seguridad", - "streaming": "Transmisión", - "notifications": "Notificaciones", - "sign-in": "Iniciar Sesión", - "log-out": "Cerrar sesión", - "account-greeting": "Hola, @{$handle}.", - "edit-profile-bluesky": "Editar perfil (en Bluesky)", - "change-name-color": "Cambiar color de nombre", - "key-management": "Gestión de Claves", - "key-manager": "Gestor de Claves", - "your-stream-pubkeys": "Tus Claves Públicas de Transmisión", - "no-keys": "No hay claves configuradas", - "pubkey-description": "Las claves públicas se emparejan con claves de transmisión (usadas en software de transmitiendo) para firmar y verificar tu transmisión", - "keys-count": "{$count ->\n [one] {$count} clave\n [many] {$count} claves\n *[other] {$count} claves\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Integraciones de Webhook", - "webhook-integrations-description": "Conecta servicios externos para recibir actualizaciones en tiempo real sobre tus transmisiones", - "create-webhook": "Crear Webhook", - "edit-webhook": "Editar Webhook", - "delete-webhook": "Eliminar Webhook", - "no-webhooks-yet": "Aún no hay webhooks configurados", - "failed-load-webhooks": "Error al cargar webhooks", - "webhook-will-no-longer-receive-events": "Este webhook ya no recibirá eventos", - "create-first-webhook-description": "Crea tu primer webhook para empezar a recibir eventos de transmisión", - "example-captain-hook": "Capitán Garfio", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "Activa en:", - "events-livestream": "Eventos de Transmisión en Directo", - "events-chat": "Eventos de Chat", - "untitled-webhook": "Webhook Sin Título", - "inactive": "Inactivo", - "debug-recording": "Grabación de Depuración", - "danmu-enabled": "Habilitar Danmu", - "danmu-enabled-description": "Muestra mensajes de chat en vivo como comentarios flotantes en tu pantalla", - "danmu-opacity": "Opacidad", - "danmu-speed": "Velocidad", - "danmu-lane-count": "Número de Carriles", - "danmu-max-messages": "Mensajes Máximos", - "app-version-description": "Información de la versión actual", - "confirm-delete": "¿Estás seguro de que quieres eliminar esto?", - "action-cannot-be-undone": "Esta acción no se puede deshacer", - "name-optional": "Nombre (opcional)", - "deleting": "Eliminando...", - "saving": "Guardando...", - "go-to-dashboard": "Ir al Panel", - "need-setup-live-dashboard": "Primero necesitas configurar una transmisión en directo en el panel", - "no-languages-found": "No se encontraron idiomas", - "backup-save": "Guardar ajustes de copia de seguridad", - "backup-saving": "Guardando ajustes de copia de seguridad...", - "backup-secret-key-set-placeholder": "(Contraseña ya establecida)", - "backup-error-invalid-endpoint": "Debe ser un nombre de dominio válido", - "backup-error-invalid-bucket": "Debe contener solo letras minúsculas, números, puntos y guiones", - "backup-error-invalid-segment-duration": "Debe estar entre 1 y 60 segundos", - "backup-error-load-failed": "Error al cargar los ajustes de almacenamiento", - "backup-error-update-failed": "Error al actualizar el estado de la copia de seguridad", - "backup-error-save-failed": "Error al guardar los ajustes de almacenamiento", - "backup-error-missing-secret": "No se pueden actualizar los ajustes de S3 sin la clave secreta. Por favor, vuelva a introducirla.", - "backup-segment-duration-placeholder": "6", - "backup": "Copia de seguridad", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Respaldar automáticamente las grabaciones en almacenamiento compatible con S3", - "backup-connection-url": "URL de conexión", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "Punto de conexión", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Contenedor", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Clave de acceso", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Clave secreta", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "Mostrar contraseña en la URL", - "show-password-in-url-description": "Mostrar la clave secreta en la URL de conexión (si se introduce)", - "recommendations-to-others": "Recomendaciones a otros", - "recommendations-description": "Comparte hasta 8 streamers que recomiendas a tus espectadores", - "no-recommendations-yet": "No hay recomendaciones configuradas todavía", - "multistream": "Multi-transmisión", - "multistream-targets": "Objetivos de multi-transmisión", - "multistream-description": "Envía automáticamente tus transmisiones en directo de Streamplace a otros servicios de streaming como Twitch o YouTube.", - "create-multistream-target": "Crear objetivo de multi-transmisión", - "untitled-multistream-target": "Objetivo sin título", - "failed-load-multistream-targets": "Error al cargar los objetivos de multi-transmisión. Por favor, inténtalo de nuevo.", - "failed-toggle-multistream-target": "Error al cambiar el estado del objetivo de multi-transmisión. Por favor, inténtalo de nuevo.", - "no-multistream-targets-yet": "¡Aún no hay objetivos!", - "multistream-targets-count": "{$count ->\n [one] {$count} objetivo\n [many] {$count} objetivos\n *[other] {$count} objetivos\n }", - "multistream-delete-target-confirmation": "¿Estás seguro de que quieres eliminar \"{$target}\"?", - "this-action-cannot-be-undone": "Esta acción no se puede deshacer.", - "rtmp-target-name": "Objetivo RTMP", - "rtmp-target-url": "URL de RTMP", - "rtmp-target-name-placeholder": "Mi objetivo de multi-transmisión", - "multistream-create-target": "Crear objetivo", - "multistream-edit-target": "Editar objetivo", - "created": "creado", - "status": "estado", - "branding": "Branding", - "branding-admin": "Administración de branding", - "branding-admin-description": "Personaliza tu instancia de Streamplace. Ten en cuenta que la configuración puede tardar varias horas en propagarse.", - "branding-login-required": "Por favor, inicia sesión para gestionar el branding", - "branding-configuration": "Configuración", - "branding-text-settings": "Configuración de texto", - "branding-colors": "Colores", - "branding-legal-links": "Vínculos legales", - "branding-images": "Imágenes", - "branding-broadcaster-did": "DID del radiodifusor", - "branding-broadcaster-did-description": "Dejar vacío para usar el valor predeterminado del servidor", - "branding-site-title": "Título del sitio", - "branding-site-title-placeholder": "Introduce un nuevo título de sitio", - "branding-site-description": "Descripción del sitio", - "branding-site-description-placeholder": "Introduce la descripción del sitio", - "branding-default-streamer": "Streamer predeterminado", - "branding-default-streamer-none": "Ninguno", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Quitar streamer predeterminado", - "branding-primary-color": "Color principal", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Color de acento", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG o JPEG (máx. 500KB)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG o ICO (máx. 100KB)", - "branding-sidebar-bg": "Imagen de fondo de la barra lateral", - "branding-sidebar-bg-description": "SVG, PNG o JPEG (máx. 500kb) - aparece alineada en la parte inferior de la barra lateral, a todo el ancho. Sube una imagen con opacidad para mejores resultados, ya que actualmente no hay una opción de opacidad separada.", - "branding-current": "Actual: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Subir logo", - "branding-delete-logo": "Eliminar logo", - "branding-upload-favicon": "Subir favicon", - "branding-delete-favicon": "Eliminar favicon", - "branding-upload-background": "Subir imagen de fondo", - "branding-delete-background": "Eliminar imagen de fondo", - "branding-web-only": "La subida de imágenes solo está disponible en la web.", - "refresh-branding": "Actualizar recursos de branding", - "branding-add-legal-link": "Agregar vínculo legal", - "branding-edit-legal-link": "Editar vínculo legal", - "branding-legal-link-text-placeholder": "Texto del vínculo (ej., Política de Privacidad)", - "branding-legal-link-url-placeholder": "URL (ej., https://ejemplo.com/privacidad)", - "add": "Agregar", - "active": "Activo", - "optional": "opcional", - "branding-not-authenticated": "Por favor, inicia sesión primero", - "branding-empty-value": "Por favor, introduce un valor", - "branding-update-success": "{$key} actualizado correctamente", - "branding-upload-success": "{$key} subido correctamente", - "branding-delete-success": "{$key} eliminado correctamente", - "branding-upload-failed": "Error al subir", - "branding-delete-failed": "Error al eliminar", - "branding-not-available": "La subida de archivos solo está disponible en la web", - "node-legal-documents": "Documentos específicos del radiodifusor", - "badges": "Insignias", - "badges-cosmetic-section": "Insignias cosméticas", - "badges-empty-state": "Aún no te han otorgado ninguna insignia.", - "badges-failed-load": "Error al cargar las insignias", - "badges-failed-update": "Error al actualizar la selección de insignias", - "badges-issued-by": "Otorgada por {$issuer}", - "badges-streamer-section": "Insignias del streamer", - "issue-badges": "Emitir insignias", - "issue-badges-back-to-definitions": "Definiciones de insignias", - "issue-badges-badge-name": "Nombre de la insignia", - "issue-badges-badge-name-placeholder": "ej. VIP, Colaborador", - "issue-badges-badge-type": "Tipo de insignia", - "issue-badges-choose-image": "Elegir imagen", - "issue-badges-create-definition": "Crear definición de insignia", - "issue-badges-create-definition-description": "Define un nuevo tipo de insignia que se puede otorgar a los espectadores", - "issue-badges-create-definition-subtitle": "Define un nuevo tipo de insignia", - "issue-badges-definition-created": "Definición de insignia creada", - "issue-badges-description-optional": "Descripción (opcional)", - "issue-badges-description-placeholder": "Descripción opcional para esta insignia", - "issue-badges-failed-create": "Error al crear la definición de insignia", - "issue-badges-failed-issue": "Error al emitir la insignia", - "issue-badges-failed-load": "Error al cargar las definiciones de insignias", - "issue-badges-image-optional": "Imagen (opcional)", - "issue-badges-image-too-large": "La imagen debe ser menor de 256KB", - "issue-badges-image-web-only": "La subida de imágenes solo está disponible en la web", - "issue-badges-issue-badge": "Emitir insignia", - "issue-badges-issue-badge-description": "Emite la insignia \"{$name}\" a un espectador mediante su DID", - "issue-badges-issued": "Insignia emitida", - "issue-badges-issued-to": "Emitida a {$did}", - "issue-badges-manage-description": "Crea definiciones de insignias y emítelas a los espectadores", - "issue-badges-recipient-did": "DID del destinatario", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Toca para emitir", - "issue-badges-your-definitions": "Tus definiciones de insignias" -} diff --git a/js/web/public/locales/fr-FR/common.json b/js/web/public/locales/fr-FR/common.json deleted file mode 100644 index 1a6809ae6..000000000 --- a/js/web/public/locales/fr-FR/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Chargement...", - "error": "Erreur", - "cancel": "Annuler", - "confirm": "Confirmer", - "close": "Fermer", - "open": "Ouvrir", - "ok": "OK", - "yes": "Oui", - "no": "Non", - "continue": "Continuer", - "back": "Retour", - "next": "Suivant", - "finish": "Terminer", - "save": "Enregistrer", - "delete": "Supprimer", - "edit": "Modifier", - "create": "Créer", - "update": "Mettre à jour", - "refresh": "Actualiser", - "success": "Succès", - "warning": "Avertissement", - "info": "Information", - "search-placeholder": "Rechercher...", - "message-input": "Entrez votre message...", - "please-log-in-to-access-this-page": "Veuillez vous connecter pour accéder à cette page", - "go-to-settings": "Aller aux Paramètres", - "go-back": "Retour", - "welcome-user": "Bienvenue, {$username} !", - "notification-count": "{$count ->\n [0] Aucune notification\n [1] Une notification\n *[other] {$count} notifications\n }", - "user-offline": "utilisateur hors ligne", - "user-offline-message": "{$source ->\n [streamer] On dirait que <1>@{$handle} est hors ligne, mais ils recommandent de regarder :\n *[default] On dirait que <1>@{$handle} est hors ligne, mais nous recommandons de regarder :\n }", - "user-offline-no-recommendations": "On dirait que <1>@{$handle} est hors ligne maintenant.\nRevenez plus tard.", - "streaming-title": "diffusion de {$title}", - "viewer-count": "{$count ->\n [0] 0 spectateurs\n [1] 1 spectateur\n *[other] {$count} spectateurs\n }", - "pds-selector-title": "Nouveau sur Atmosphere ?", - "pds-selector-description": "Vous devrez sélectionner un PDS (Serveur de Données Personnel) pour accéder aux applications sur Atmosphere, comme Bluesky, Tangled et Spark.", - "pds-selector-custom-label": "Un autre PDS", - "pds-selector-custom-description": "Saisissez l'URL de votre propre hôte PDS", - "pds-selector-custom-url-label": "URL PDS personnalisée", - "pds-selector-custom-url-placeholder": "https://pds.exemple.com", - "pds-selector-learn-more": "En savoir plus sur l'auto-hébergement", - "pds-selector-info": "Chaque hôte a ses propres politiques et normes de fiabilité. Vos données ATProto se trouvent sur l'hôte que vous choisissez et vous pouvez migrer ultérieurement. Remarque : Streamplace a ses propres règles de modération — vous pouvez être banni de Streamplace quel que soit l'hôte choisi.", - "pds-selector-read-policies": "Lisez les Conditions d'utilisation et la Politique de confidentialité de {$label} avant de continuer.", - "pds-selector-handle-policy-checkbox": "J'ai lu et j'accepte la politique des identifiants", - "login-show-live-on-bluesky": "Afficher quand je suis en direct sur Bluesky", - "login-show-live-on-bluesky-description": "Ajoute l'anneau rouge LIVE à votre avatar Bluesky pendant vos streams et permet à Streamplace de publier des annonces pour vous. Décochez la case pour vous connecter sans accorder aucun accès à votre compte Bluesky." -} diff --git a/js/web/public/locales/fr-FR/settings.json b/js/web/public/locales/fr-FR/settings.json deleted file mode 100644 index 4cdf81ac7..000000000 --- a/js/web/public/locales/fr-FR/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Télécharger la nouvelle mise à jour", - "check-for-updates": "Vérifier les mises à jour", - "bundled-runtype": "Inclus", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Mode de récupération", - "modal-latest-version": "Vous utilisez la dernière version.", - "modal-no-update-available": "Vous avez la dernière version de Streamplace, génial !", - "modal-update-available-title": "Mise à jour disponible", - "modal-update-available-description": "Une nouvelle version de Streamplace est prête à télécharger", - "modal-update-failed": "La vérification des mises à jour a échoué. Vous devrez peut-être mettre à jour l'application via {$store}.", - "modal-update-failed-title": "Échec de la mise à jour", - "modal-update-failed-description": "La vérification des mises à jour a échoué. Vous devrez peut-être mettre à jour l'application via {$store}.", - "button-reload-app-on-update": "Appliquer la mise à jour (l'application va se recharger)", - "use-custom-node": "Utiliser un nœud personnalisé", - "default-url": "Par défaut : {$url}", - "enter-custom-node-url": "Saisir l'URL du nœud personnalisé", - "save-button": "Enregistrer", - "try-new-web": "Essayer la nouvelle web (bêta)", - "try-new-web-description": "Passez à la nouvelle interface web. Vous pouvez revenir à tout moment depuis ce même réglage.", - "try-old-app": "Utiliser l'interface d'origine", - "try-old-app-description": "Revenir à l'interface d'origine de Streamplace.", - "language-selection": "Langue", - "language-selection-description": "Choisissez votre langue préférée", - "help-translate": "Aidez-nous à traduire Streamplace", - "help-translate-description": "Nous recherchons des bénévoles pour aider à traduire Streamplace dans plus de langues. Si vous êtes intéressé, contactez-nous sur Discord ou GitHub !", - "currently-translating": "Les traductions sont en cours", - "currently-translating-description": "Certaines parties de l'application peuvent sembler incomplètes. Merci pour votre patience !", - "debug-recording-title": "Autoriser {$host} à enregistrer votre diffusion en direct pour le débogage et l'amélioration du service", - "debug-recording-description": "Optionnel", - "input-search-languages": "Rechercher des langues...", - "manage-keys": "Gérer les Clés", - "settings-title": "Paramètres", - "loading": "Chargement...", - "error": "Erreur", - "cancel": "Annuler", - "confirm": "Confirmer", - "welcome-user": "Bienvenue, {$username} !", - "notification-count": "{$count ->\n [0] Aucune notification\n [1] Une notification\n *[other] {$count} notifications\n }", - "search-placeholder": "Rechercher...", - "message-input": "Saisissez votre message...", - "success": "Succès", - "warning": "Attention", - "info": "Information", - "close": "Fermer", - "open": "Ouvrir", - "delete": "Supprimer", - "edit": "Modifier", - "create": "Créer", - "update": "Mettre à jour", - "refresh": "Actualiser", - "save": "Enregistrer", - "cancel-button": "Annuler", - "ok": "OK", - "yes": "Oui", - "no": "Non", - "continue": "Continuer", - "back": "Retour", - "next": "Suivant", - "finish": "Terminer", - "about": "À propos", - "account": "Compte", - "advanced": "Avancé", - "danmu": "Danmu", - "developer": "Développeur", - "languages": "Langues", - "privacy-security": "Confidentialité et Sécurité", - "streaming": "Diffusion", - "notifications": "Notifications", - "sign-in": "Se connecter", - "log-out": "Se déconnecter", - "account-greeting": "Salut, @{$handle}.", - "edit-profile-bluesky": "Modifier le profil (sur Bluesky)", - "change-name-color": "Changer la couleur du nom", - "key-management": "Gestion des Clés", - "key-manager": "Gestionnaire de Clés", - "your-stream-pubkeys": "Vos Clés Publiques de Diffusion", - "no-keys": "Aucune clé configurée", - "pubkey-description": "Les clés publiques sont associées aux clés de diffusion (utilisées dans le logiciel de streaming) pour signer et vérifier votre diffusion", - "keys-count": "{$count ->\n [one] {$count} clé\n [many] {$count} clés\n *[other] {$count} clés\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Intégrations de Webhook", - "webhook-integrations-description": "Connectez des services externes pour recevoir des mises à jour en temps réel sur vos diffusions", - "create-webhook": "Créer un Webhook", - "edit-webhook": "Modifier le Webhook", - "delete-webhook": "Supprimer le Webhook", - "no-webhooks-yet": "Aucun webhook configuré pour le moment", - "failed-load-webhooks": "Échec du chargement des webhooks", - "webhook-will-no-longer-receive-events": "Ce webhook ne recevra plus d'événements", - "create-first-webhook-description": "Créez votre premier webhook pour commencer à recevoir des événements de diffusion", - "example-captain-hook": "Capitaine Crochet", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "S'active sur :", - "events-livestream": "Événements de Diffusion en Direct", - "events-chat": "Événements de Chat", - "untitled-webhook": "Webhook Sans Titre", - "inactive": "Inactif", - "debug-recording": "Enregistrement de Débogage", - "danmu-enabled": "Activer Danmu", - "danmu-enabled-description": "Afficher les messages de chat en direct sous forme de commentaires flottants sur votre écran", - "danmu-opacity": "Opacité", - "danmu-speed": "Vitesse", - "danmu-lane-count": "Nombre de Voies", - "danmu-max-messages": "Messages Maximum", - "app-version-description": "Informations sur la version actuelle", - "confirm-delete": "Êtes-vous sûr de vouloir supprimer ceci ?", - "action-cannot-be-undone": "Cette action ne peut pas être annulée", - "name-optional": "Nom (optionnel)", - "deleting": "Suppression...", - "saving": "Enregistrement...", - "go-to-dashboard": "Aller au Tableau de Bord", - "need-setup-live-dashboard": "Vous devez d'abord configurer une diffusion en direct dans le tableau de bord", - "no-languages-found": "Aucune langue trouvée", - "backup-save": "Enregistrer les paramètres de sauvegarde", - "backup-saving": "Enregistrement des paramètres de sauvegarde...", - "backup-secret-key-set-placeholder": "(Mot de passe déjà défini)", - "backup-error-invalid-endpoint": "Doit être un nom de domaine valide", - "backup-error-invalid-bucket": "Doit contenir uniquement des lettres minuscules, des chiffres, des points et des traits d'union", - "backup-error-invalid-segment-duration": "Doit être compris entre 1 et 60 secondes", - "backup-error-load-failed": "Échec du chargement des paramètres de stockage", - "backup-error-update-failed": "Échec de la mise à jour de l'état de la sauvegarde", - "backup-error-save-failed": "Échec de l'enregistrement des paramètres de stockage", - "backup-error-missing-secret": "Impossible de mettre à jour les paramètres S3 sans la clé secrète. Veuillez la saisir à nouveau.", - "backup-segment-duration-placeholder": "6", - "backup": "Sauvegarde", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Sauvegarder automatiquement les enregistrements dans un stockage compatible S3", - "backup-connection-url": "URL de connexion", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "Point de terminaison", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Compartiment", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Clé d'accès", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Clé secrète", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "Afficher le mot de passe dans l'URL", - "show-password-in-url-description": "Afficher la clé secrète dans l'URL de connexion (si saisie)", - "recommendations-to-others": "Recommandations aux autres", - "recommendations-description": "Partagez jusqu'à 8 streameurs que vous recommandez à vos spectateurs", - "no-recommendations-yet": "Aucune recommandation configurée pour le moment", - "multistream": "Multidiffusion", - "multistream-targets": "Cibles de multidiffusion", - "multistream-description": "Envoyez automatiquement vos diffusions en direct Streamplace vers d'autres services comme Twitch ou YouTube.", - "create-multistream-target": "Créer une cible de multidiffusion", - "untitled-multistream-target": "Cible sans titre", - "failed-load-multistream-targets": "Échec du chargement des cibles de multidiffusion. Veuillez réessayer.", - "failed-toggle-multistream-target": "Échec du basculement de la cible de multidiffusion. Veuillez réessayer.", - "no-multistream-targets-yet": "Aucune cible pour le moment !", - "multistream-targets-count": "{$count ->\n [one] {$count} cible\n [many] {$count} cibles\n *[other] {$count} cibles\n }", - "multistream-delete-target-confirmation": "Êtes-vous sûr de vouloir supprimer \"{$target}\" ?", - "this-action-cannot-be-undone": "Cette action ne peut pas être annulée.", - "rtmp-target-name": "Cible RTMP", - "rtmp-target-url": "URL RTMP", - "rtmp-target-name-placeholder": "Ma cible de multidiffusion", - "multistream-create-target": "Créer la cible", - "multistream-edit-target": "Modifier la cible", - "created": "créé", - "status": "statut", - "branding": "Image de marque", - "branding-admin": "Administration de l'image de marque", - "branding-admin-description": "Personnalisez votre instance Streamplace. Notez que les paramètres peuvent prendre quelques heures à se propager.", - "branding-login-required": "Veuillez vous connecter pour gérer l'image de marque", - "branding-configuration": "Configuration", - "branding-text-settings": "Paramètres de texte", - "branding-colors": "Couleurs", - "branding-legal-links": "Liens légaux", - "branding-images": "Images", - "branding-broadcaster-did": "DID du diffuseur", - "branding-broadcaster-did-description": "Laisser vide pour utiliser la valeur par défaut du serveur", - "branding-site-title": "Titre du site", - "branding-site-title-placeholder": "Saisir un nouveau titre de site", - "branding-site-description": "Description du site", - "branding-site-description-placeholder": "Saisir la description du site", - "branding-default-streamer": "Streameur par défaut", - "branding-default-streamer-none": "Aucun", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Effacer le streameur par défaut", - "branding-primary-color": "Couleur principale", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Couleur d'accent", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG ou JPEG (max 500 Ko)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG ou ICO (max 100 Ko)", - "branding-sidebar-bg": "Image d'arrière-plan de la barre latérale", - "branding-sidebar-bg-description": "SVG, PNG ou JPEG (max 500 ko) - apparaît aligné en bas de la barre latérale, pleine largeur. Téléchargez une image avec opacité pour de meilleurs résultats, car il n'existe pas actuellement d'option d'opacité séparée.", - "branding-current": "Actuel : {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Télécharger le logo", - "branding-delete-logo": "Supprimer le logo", - "branding-upload-favicon": "Télécharger le favicon", - "branding-delete-favicon": "Supprimer le favicon", - "branding-upload-background": "Télécharger l'arrière-plan", - "branding-delete-background": "Supprimer l'arrière-plan", - "branding-web-only": "Les téléchargements d'images ne sont disponibles que sur le web.", - "refresh-branding": "Actualiser les ressources de l'image de marque", - "branding-add-legal-link": "Ajouter un lien légal", - "branding-edit-legal-link": "Modifier le lien légal", - "branding-legal-link-text-placeholder": "Texte du lien (ex., Politique de confidentialité)", - "branding-legal-link-url-placeholder": "URL (ex., https://exemple.com/confidentialite)", - "add": "Ajouter", - "active": "Actif", - "optional": "optionnel", - "branding-not-authenticated": "Veuillez d'abord vous connecter", - "branding-empty-value": "Veuillez saisir une valeur", - "branding-update-success": "{$key} mis à jour avec succès", - "branding-upload-success": "{$key} téléchargé avec succès", - "branding-delete-success": "{$key} supprimé avec succès", - "branding-upload-failed": "Échec du téléchargement", - "branding-delete-failed": "Échec de la suppression", - "branding-not-available": "Les téléchargements de fichiers ne sont disponibles que sur le web", - "node-legal-documents": "Documents spécifiques au diffuseur", - "badges": "Badges", - "badges-cosmetic-section": "Badges cosmétiques", - "badges-empty-state": "Vous n'avez pas encore reçu de badges.", - "badges-failed-load": "Échec du chargement des badges", - "badges-failed-update": "Échec de la mise à jour de la sélection de badges", - "badges-issued-by": "Délivré par {$issuer}", - "badges-streamer-section": "Badges du streameur", - "issue-badges": "Délivrer des badges", - "issue-badges-back-to-definitions": "Définitions de badges", - "issue-badges-badge-name": "Nom du badge", - "issue-badges-badge-name-placeholder": "ex. VIP, Supporter", - "issue-badges-badge-type": "Type de badge", - "issue-badges-choose-image": "Choisir une image", - "issue-badges-create-definition": "Créer une définition de badge", - "issue-badges-create-definition-description": "Définissez un nouveau type de badge qui peut être délivré aux spectateurs", - "issue-badges-create-definition-subtitle": "Définir un nouveau type de badge", - "issue-badges-definition-created": "Définition de badge créée", - "issue-badges-description-optional": "Description (optionnelle)", - "issue-badges-description-placeholder": "Description optionnelle pour ce badge", - "issue-badges-failed-create": "Échec de la création de la définition de badge", - "issue-badges-failed-issue": "Échec de la délivrance du badge", - "issue-badges-failed-load": "Échec du chargement des définitions de badges", - "issue-badges-image-optional": "Image (optionnelle)", - "issue-badges-image-too-large": "L'image doit faire moins de 256 Ko", - "issue-badges-image-web-only": "Le téléchargement d'images n'est disponible que sur le web", - "issue-badges-issue-badge": "Délivrer un badge", - "issue-badges-issue-badge-description": "Délivrez le badge \"{$name}\" à un spectateur par son DID", - "issue-badges-issued": "Badge délivré", - "issue-badges-issued-to": "Délivré à {$did}", - "issue-badges-manage-description": "Créez des définitions de badges et délivrez-les aux spectateurs", - "issue-badges-recipient-did": "DID du destinataire", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Appuyer pour délivrer", - "issue-badges-your-definitions": "Vos définitions de badges" -} diff --git a/js/web/public/locales/pt-BR/common.json b/js/web/public/locales/pt-BR/common.json deleted file mode 100644 index 348dd8f80..000000000 --- a/js/web/public/locales/pt-BR/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Carregando...", - "error": "Erro", - "cancel": "Cancelar", - "confirm": "Confirmar", - "close": "Fechar", - "open": "Abrir", - "ok": "OK", - "yes": "Sim", - "no": "Não", - "continue": "Continuar", - "back": "Voltar", - "next": "Próximo", - "finish": "Concluir", - "save": "Salvar", - "delete": "Excluir", - "edit": "Editar", - "create": "Criar", - "update": "Atualizar", - "refresh": "Atualizar", - "success": "Sucesso", - "warning": "Aviso", - "info": "Informação", - "search-placeholder": "Pesquisar...", - "message-input": "Digite sua mensagem...", - "please-log-in-to-access-this-page": "Por favor, faça login para acessar esta página", - "go-to-settings": "Ir para Configurações", - "go-back": "Voltar", - "welcome-user": "Bem-vindo, {$username}!", - "notification-count": "{$count ->\n [0] Nenhuma notificação\n [1] Uma notificação\n *[other] {$count} notificações\n }", - "user-offline": "usuário offline", - "user-offline-message": "{$source ->\n [streamer] Parece que <1>@{$handle} está offline, mas eles recomendam assistir:\n *[default] Parece que <1>@{$handle} está offline, mas recomendamos assistir:\n }", - "user-offline-no-recommendations": "Parece que <1>@{$handle} está offline agora.\nVolte mais tarde.", - "streaming-title": "transmitindo {$title}", - "viewer-count": "{$count ->\n [0] 0 espectadores\n [1] 1 espectador\n *[other] {$count} espectadores\n }", - "pds-selector-title": "Novo no Atmosphere?", - "pds-selector-description": "Você precisará selecionar um PDS (Servidor de Dados Pessoal) para acessar apps no Atmosphere, como Bluesky, Tangled e Spark.", - "pds-selector-custom-label": "Outro PDS", - "pds-selector-custom-description": "Digite a URL do seu próprio host PDS", - "pds-selector-custom-url-label": "URL do PDS personalizado", - "pds-selector-custom-url-placeholder": "https://pds.exemplo.com", - "pds-selector-learn-more": "Saiba mais sobre auto-hospedagem", - "pds-selector-info": "Cada host tem suas próprias políticas e padrões de confiabilidade. Seus dados ATProto ficam no host que você escolher e você pode migrar depois. Nota: O Streamplace tem suas próprias regras de moderação — você pode ser banido do Streamplace independentemente do host escolhido.", - "pds-selector-read-policies": "Leia os Termos de Serviço e a Política de Privacidade de {$label} antes de continuar.", - "pds-selector-handle-policy-checkbox": "Li e concordo com a política de identificadores", - "login-show-live-on-bluesky": "Mostrar quando estou ao vivo no Bluesky", - "login-show-live-on-bluesky-description": "Adiciona o anel vermelho LIVE ao seu avatar do Bluesky enquanto você transmite e permite que o Streamplace publique anúncios por você. Desmarque para entrar sem conceder nenhum acesso à sua conta do Bluesky." -} diff --git a/js/web/public/locales/pt-BR/settings.json b/js/web/public/locales/pt-BR/settings.json deleted file mode 100644 index f0d956b57..000000000 --- a/js/web/public/locales/pt-BR/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Baixar Nova Atualização", - "check-for-updates": "Verificar Atualizações", - "bundled-runtype": "Empacotado", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Modo de Recuperação", - "modal-latest-version": "Você está usando a versão mais recente.", - "modal-no-update-available": "Você está na versão mais recente do Streamplace, eba!", - "modal-update-available-title": "Atualização Disponível", - "modal-update-available-description": "Uma nova versão do Streamplace está pronta para download", - "modal-update-failed": "A verificação de atualizações falhou. Você pode precisar atualizar o aplicativo através do {$store}.", - "modal-update-failed-title": "Atualização Falhou", - "modal-update-failed-description": "A verificação de atualizações falhou. Você pode precisar atualizar o aplicativo através do {$store}.", - "button-reload-app-on-update": "Aplicar Atualização (o aplicativo será recarregado)", - "use-custom-node": "Usar Nó Personalizado", - "default-url": "Padrão: {$url}", - "enter-custom-node-url": "Digite a URL do nó personalizado", - "save-button": "Salvar", - "try-new-web": "Experimentar a nova web (beta)", - "try-new-web-description": "Mude para a nova interface web. Você pode voltar a qualquer momento nesta mesma configuração.", - "try-old-app": "Usar a interface original", - "try-old-app-description": "Volte para a interface original do Streamplace.", - "language-selection": "Idioma", - "language-selection-description": "Escolha seu idioma preferido", - "help-translate": "Ajude-nos a traduzir o Streamplace", - "help-translate-description": "Estamos procurando voluntários para ajudar a traduzir o Streamplace para mais idiomas. Se você estiver interessado, entre em contato conosco no Discord ou GitHub!", - "currently-translating": "As traduções estão a caminho", - "currently-translating-description": "Algumas partes do aplicativo podem parecer incompletas. Obrigado pela sua paciência!", - "debug-recording-title": "Permitir que {$host} grave sua transmissão ao vivo para depuração e melhoria do serviço", - "debug-recording-description": "Opcional", - "input-search-languages": "Pesquisar idiomas...", - "manage-keys": "Gerenciar Chaves", - "settings-title": "Configurações", - "loading": "Carregando...", - "error": "Erro", - "cancel": "Cancelar", - "confirm": "Confirmar", - "welcome-user": "Bem-vindo, {$username}!", - "notification-count": "{$count ->\n [0] Nenhuma notificação\n [1] Uma notificação\n *[other] {$count} notificações\n }", - "search-placeholder": "Pesquisar...", - "message-input": "Digite sua mensagem...", - "success": "Sucesso", - "warning": "Aviso", - "info": "Informação", - "close": "Fechar", - "open": "Abrir", - "delete": "Excluir", - "edit": "Editar", - "create": "Criar", - "update": "Atualizar", - "refresh": "Atualizar", - "save": "Salvar", - "cancel-button": "Cancelar", - "ok": "OK", - "yes": "Sim", - "no": "Não", - "continue": "Continuar", - "back": "Voltar", - "next": "Próximo", - "finish": "Finalizar", - "about": "Sobre", - "account": "Conta", - "advanced": "Avançado", - "danmu": "Danmu", - "developer": "Desenvolvedor", - "languages": "Idiomas", - "privacy-security": "Privacidade e Segurança", - "streaming": "Transmissão", - "notifications": "Notificações", - "sign-in": "Entrar", - "log-out": "Sair", - "account-greeting": "Olá, @{$handle}.", - "edit-profile-bluesky": "Editar perfil (no Bluesky)", - "change-name-color": "Mudar cor do nome", - "key-management": "Gerenciamento de Chaves", - "key-manager": "Gerenciador de Chaves", - "your-stream-pubkeys": "Suas Chaves Públicas de Transmissão", - "no-keys": "Nenhuma chave configurada", - "pubkey-description": "Chaves públicas são emparelhadas com chaves de transmissão (usadas em software de transmitindo) para assinar e verificar sua transmissão", - "keys-count": "{$count ->\n [one] {$count} chave\n [many] {$count} chaves\n *[other] {$count} chaves\n }", - "webhooks": "Webhooks", - "webhook-integrations": "Integrações de Webhook", - "webhook-integrations-description": "Conecte serviços externos para receber atualizações em tempo real sobre suas transmissões", - "create-webhook": "Criar Webhook", - "edit-webhook": "Editar Webhook", - "delete-webhook": "Excluir Webhook", - "no-webhooks-yet": "Nenhum webhook configurado ainda", - "failed-load-webhooks": "Falha ao carregar webhooks", - "webhook-will-no-longer-receive-events": "Este webhook não receberá mais eventos", - "create-first-webhook-description": "Crie seu primeiro webhook para começar a receber eventos de transmissão", - "example-captain-hook": "Capitão Gancho", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} webhooks\n }", - "activates-on": "Ativa em:", - "events-livestream": "Eventos de Transmissão ao Vivo", - "events-chat": "Eventos de Chat", - "untitled-webhook": "Webhook Sem Título", - "inactive": "Inativo", - "debug-recording": "Gravação de Depuração", - "danmu-enabled": "Ativar Danmu", - "danmu-enabled-description": "Exibir mensagens de chat ao vivo como comentários flutuantes na sua tela", - "danmu-opacity": "Opacidade", - "danmu-speed": "Velocidade", - "danmu-lane-count": "Número de Faixas", - "danmu-max-messages": "Mensagens Máximas", - "app-version-description": "Informações da versão atual", - "confirm-delete": "Tem certeza de que deseja excluir isso?", - "action-cannot-be-undone": "Esta ação não pode ser desfeita", - "name-optional": "Nome (opcional)", - "deleting": "Excluindo...", - "saving": "Salvando...", - "go-to-dashboard": "Ir para o Painel", - "need-setup-live-dashboard": "Você precisa configurar uma transmissão ao vivo no painel primeiro", - "no-languages-found": "Nenhum idioma encontrado", - "backup-save": "Salvar configurações de backup", - "backup-saving": "Salvando configurações de backup...", - "backup-secret-key-set-placeholder": "(Senha já definida)", - "backup-error-invalid-endpoint": "Deve ser um nome de domínio válido", - "backup-error-invalid-bucket": "Deve conter apenas letras minúsculas, números, pontos e hifens", - "backup-error-invalid-segment-duration": "Deve estar entre 1 e 60 segundos", - "backup-error-load-failed": "Falha ao carregar as configurações de armazenamento", - "backup-error-update-failed": "Falha ao atualizar o status do backup", - "backup-error-save-failed": "Falha ao salvar as configurações de armazenamento", - "backup-error-missing-secret": "Não é possível atualizar as configurações do S3 sem a chave secreta. Por favor, insira-a novamente.", - "backup-segment-duration-placeholder": "6", - "backup": "Backup", - "backup-enabled": "S3 Backup", - "backup-enabled-description": "Fazer backup automaticamente das gravações em armazenamento compatível com S3", - "backup-connection-url": "URL de conexão", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "Endpoint", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "Bucket", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "Chave de acesso", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "Chave secreta", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "Mostrar senha na URL", - "show-password-in-url-description": "Exibir a chave secreta na URL de conexão (se inserida)", - "recommendations-to-others": "Recomendações para outros", - "recommendations-description": "Compartilhe até 8 streamers que você recomenda aos seus espectadores", - "no-recommendations-yet": "Nenhuma recomendação configurada ainda", - "multistream": "Multitransmissão", - "multistream-targets": "Destinos de multitransmissão", - "multistream-description": "Envie automaticamente suas transmissões ao vivo do Streamplace para outros serviços como Twitch ou YouTube.", - "create-multistream-target": "Criar destino de multitransmissão", - "untitled-multistream-target": "Destino sem título", - "failed-load-multistream-targets": "Falha ao carregar os destinos de multitransmissão. Por favor, tente novamente.", - "failed-toggle-multistream-target": "Falha ao alternar o destino de multitransmissão. Por favor, tente novamente.", - "no-multistream-targets-yet": "Nenhum destino ainda!", - "multistream-targets-count": "{$count ->\n [one] {$count} destino\n [many] {$count} destinos\n *[other] {$count} destinos\n }", - "multistream-delete-target-confirmation": "Tem certeza de que deseja excluir \"{$target}\"?", - "this-action-cannot-be-undone": "Esta ação não pode ser desfeita.", - "rtmp-target-name": "Destino RTMP", - "rtmp-target-url": "URL RTMP", - "rtmp-target-name-placeholder": "Meu destino de multitransmissão", - "multistream-create-target": "Criar destino", - "multistream-edit-target": "Editar destino", - "created": "criado", - "status": "status", - "branding": "Identidade visual", - "branding-admin": "Administração de identidade visual", - "branding-admin-description": "Personalize sua instância do Streamplace. As configurações podem levar algumas horas para se propagar.", - "branding-login-required": "Faça login para gerenciar a identidade visual", - "branding-configuration": "Configuração", - "branding-text-settings": "Configurações de texto", - "branding-colors": "Cores", - "branding-legal-links": "Links legais", - "branding-images": "Imagens", - "branding-broadcaster-did": "DID do transmissor", - "branding-broadcaster-did-description": "Deixe vazio para usar o padrão do servidor", - "branding-site-title": "Título do site", - "branding-site-title-placeholder": "Digite o novo título do site", - "branding-site-description": "Descrição do site", - "branding-site-description-placeholder": "Digite a descrição do site", - "branding-default-streamer": "Streamer padrão", - "branding-default-streamer-none": "Nenhum", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Limpar streamer padrão", - "branding-primary-color": "Cor principal", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Cor de destaque", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG ou JPEG (máx. 500KB)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG ou ICO (máx. 100KB)", - "branding-sidebar-bg": "Imagem de fundo da barra lateral", - "branding-sidebar-bg-description": "SVG, PNG ou JPEG (máx. 500kb) - aparece alinhada na parte inferior da barra lateral, largura total. Faça upload de uma imagem com opacidade para melhores resultados, pois atualmente não há uma opção de opacidade separada.", - "branding-current": "Atual: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Enviar logo", - "branding-delete-logo": "Excluir logo", - "branding-upload-favicon": "Enviar favicon", - "branding-delete-favicon": "Excluir favicon", - "branding-upload-background": "Enviar plano de fundo", - "branding-delete-background": "Excluir plano de fundo", - "branding-web-only": "O upload de imagens só está disponível na web.", - "refresh-branding": "Atualizar recursos de identidade visual", - "branding-add-legal-link": "Adicionar link legal", - "branding-edit-legal-link": "Editar link legal", - "branding-legal-link-text-placeholder": "Texto do link (ex., Política de Privacidade)", - "branding-legal-link-url-placeholder": "URL (ex., https://exemplo.com/privacidade)", - "add": "Adicionar", - "active": "Ativo", - "optional": "opcional", - "branding-not-authenticated": "Faça login primeiro", - "branding-empty-value": "Por favor, insira um valor", - "branding-update-success": "{$key} atualizado com sucesso", - "branding-upload-success": "{$key} enviado com sucesso", - "branding-delete-success": "{$key} excluído com sucesso", - "branding-upload-failed": "Falha ao enviar", - "branding-delete-failed": "Falha ao excluir", - "branding-not-available": "O upload de arquivos só está disponível na web", - "node-legal-documents": "Documentos específicos do transmissor", - "badges": "Emblemas", - "badges-cosmetic-section": "Emblemas cosméticos", - "badges-empty-state": "Você ainda não recebeu nenhum emblema.", - "badges-failed-load": "Falha ao carregar emblemas", - "badges-failed-update": "Falha ao atualizar a seleção de emblemas", - "badges-issued-by": "Emitido por {$issuer}", - "badges-streamer-section": "Emblemas do streamer", - "issue-badges": "Emitir emblemas", - "issue-badges-back-to-definitions": "Definições de emblemas", - "issue-badges-badge-name": "Nome do emblema", - "issue-badges-badge-name-placeholder": "ex. VIP, Apoiador", - "issue-badges-badge-type": "Tipo de emblema", - "issue-badges-choose-image": "Escolher imagem", - "issue-badges-create-definition": "Criar definição de emblema", - "issue-badges-create-definition-description": "Defina um novo tipo de emblema que pode ser emitido para espectadores", - "issue-badges-create-definition-subtitle": "Defina um novo tipo de emblema", - "issue-badges-definition-created": "Definição de emblema criada", - "issue-badges-description-optional": "Descrição (opcional)", - "issue-badges-description-placeholder": "Descrição opcional para este emblema", - "issue-badges-failed-create": "Falha ao criar a definição de emblema", - "issue-badges-failed-issue": "Falha ao emitir o emblema", - "issue-badges-failed-load": "Falha ao carregar as definições de emblemas", - "issue-badges-image-optional": "Imagem (opcional)", - "issue-badges-image-too-large": "A imagem deve ter menos de 256KB", - "issue-badges-image-web-only": "O upload de imagens só está disponível na web", - "issue-badges-issue-badge": "Emitir emblema", - "issue-badges-issue-badge-description": "Emita o emblema \"{$name}\" para um espectador pelo seu DID", - "issue-badges-issued": "Emblema emitido", - "issue-badges-issued-to": "Emitido para {$did}", - "issue-badges-manage-description": "Crie definições de emblemas e emita-os para espectadores", - "issue-badges-recipient-did": "DID do destinatário", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Toque para emitir", - "issue-badges-your-definitions": "Suas definições de emblemas" -} diff --git a/js/web/public/locales/ro-RO/common.json b/js/web/public/locales/ro-RO/common.json deleted file mode 100644 index 8b7137fdb..000000000 --- a/js/web/public/locales/ro-RO/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "Se încarcă...", - "error": "Eroare", - "cancel": "Anulare", - "confirm": "Confirmare", - "close": "Închidere", - "open": "Deschidere", - "ok": "OK", - "yes": "Da", - "no": "Nu", - "continue": "Continuare", - "back": "Înapoi", - "next": "Următorul", - "finish": "Finalizare", - "save": "Salvare", - "delete": "Ștergere", - "edit": "Editare", - "create": "Creare", - "update": "Actualizare", - "refresh": "Reîmprospătare", - "success": "Succes", - "warning": "Avertisment", - "info": "Informație", - "search-placeholder": "Căutare...", - "message-input": "Introduceți-vă mesajul...", - "please-log-in-to-access-this-page": "Vă rugăm să vă conectați pentru a accesa această pagină", - "go-to-settings": "Mergeți la Setări", - "go-back": "Mergeți înapoi", - "welcome-user": "Bun venit, {$username}!", - "notification-count": "{$count ->\n [0] Nici o notificare\n [1] O notificare\n *[other] {$count} (de) notificări\n }", - "user-offline": "utilizatorul este offline", - "user-offline-message": "{$source ->\n [streamer] Se pare că <1>@{$handle} este offline, dar recomandă să vizionați:\n *[default] Se pare că <1>@{$handle} este offline, dar vă recomandăm să vizionați:\n }", - "user-offline-no-recommendations": "Se pare că <1>@{$handle} este offline acum.\nReveniți mai târziu.", - "streaming-title": "transmisie în direct {$title}", - "viewer-count": "{$count ->\n [0] 0 vizionări\n [1] 1 vizionare\n *[other] {$count} (de) vizionări\n }", - "pds-selector-title": "Nou pe Atmosphere?", - "pds-selector-description": "Va trebui să selectați un PDS (Personal Data Server) pentru a accesa aplicațiile de pe Atmosphere, cum ar fi Bluesky, Tangled și Spark.", - "pds-selector-custom-label": "Alt PDS", - "pds-selector-custom-description": "Introduceți adresa URL a propriei gazde PDS", - "pds-selector-custom-url-label": "URL PDS personalizat", - "pds-selector-custom-url-placeholder": "https://pds.exemplu.ro", - "pds-selector-learn-more": "Aflați mai multe despre găzduirea proprie", - "pds-selector-info": "Fiecare gazdă are propriile politici și standarde de fiabilitate. Datele dvs. ATProto se află pe gazda pe care o alegeți și le puteți migra ulterior. Notă: Streamplace are propriile reguli de moderare - accesul dvs. poate fi interzis pe Streamplace indiferent de gazda pe care o alegeți.", - "pds-selector-read-policies": "Citiți Termenii și condițiile și Politica de confidențialitate ale {$label} înainte de a continua.", - "pds-selector-handle-policy-checkbox": "Am citit și sunt de acord cu politica de gestionare", - "login-show-live-on-bluesky": "Arată când sunt live pe Bluesky", - "login-show-live-on-bluesky-description": "Adaugă inelul roșu LIVE avatarului dvs. de Bluesky în timp ce transmiteți și permite Streamplace să publice anunțuri în numele dvs. Debifați pentru a vă conecta fără a acorda niciun acces la contul dvs. de Bluesky." -} diff --git a/js/web/public/locales/ro-RO/settings.json b/js/web/public/locales/ro-RO/settings.json deleted file mode 100644 index 38ee3e585..000000000 --- a/js/web/public/locales/ro-RO/settings.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "Descărcați noua actualizare", - "check-for-updates": "Căutați actualizări", - "bundled-runtype": "Bundled", - "ota-runtype": "Over-the-Air (OTA)", - "recovery-runtype": "Mod de recuperare", - "modal-latest-version": "Aveți cea mai recentă versiune.", - "modal-no-update-available": "Aveți cea mai recentă versiune de Streamplace, ura!", - "modal-update-available-title": "Actualizare disponibilă", - "modal-update-available-description": "O nouă versiune de Streamplace este gata de descărcare", - "modal-update-failed": "Căutarea actualizării a eșuat. Este posibil să fie nevoie să actualizați aplicația prin {$store}.", - "modal-update-failed-title": "Actualizare eșuată", - "modal-update-failed-description": "Căutarea actualizării a eșuat. Este posibil să fie nevoie să actualizați aplicația prin {$store}.", - "button-reload-app-on-update": "Aplicați actualizarea (va reîncărca aplicația)", - "use-custom-node": "Utilizați nodul personalizat", - "default-url": "Default: {$url}", - "enter-custom-node-url": "Introduceți adresa URL a nodului personalizat", - "save-button": "Salvare", - "try-new-web": "Încercați noul web (beta)", - "try-new-web-description": "Comutați la noua interfață web. Puteți reveni oricând din aceeași setare.", - "try-old-app": "Folosiți interfața originală", - "try-old-app-description": "Reveniți la interfața originală Streamplace.", - "language-selection": "Limbă", - "language-selection-description": "Alegeți-vă limba preferată", - "input-search-languages": "Căutați limbi...", - "help-translate": "Ajutați-ne să traducem Streamplace", - "help-translate-description": "Căutăm voluntari care să ne ajute la traducerea Streamplace în mai multe limbi. Dacă sunteți interesați, vă rugăm să ne contactați pe Discord sau GitHub!", - "currently-translating": "Traducerile sunt pe drum", - "currently-translating-description": "Este posibil ca unele părți ale aplicației să pară incomplete. Vă mulțumim pentru răbdare!", - "debug-recording-title": "Permiteți-i lui {$host} să înregistreze transmisiunea live pentru depanare și îmbunătățirea serviciului", - "debug-recording-description": "Opțional", - "manage-keys": "Gestionare chei", - "settings-title": "Setări", - "about": "Despre", - "account": "Cont", - "advanced": "Complex", - "danmu": "Danmu", - "developer": "Dezvoltator", - "languages": "Limbi", - "privacy-security": "Confidențialitate și securitate", - "streaming": "Streaming", - "notifications": "Notificări", - "cancel": "Anulare", - "create": "Creare", - "delete": "Ștergere", - "refresh": "Reîmprospătare", - "sign-in": "Conectare", - "update": "Actualizare", - "log-out": "Deconectare", - "optional": "opțional", - "account-greeting": "Hei, @{$handle}.", - "edit-profile-bluesky": "Editare profil (pe Bluesky)", - "change-name-color": "Schimbați culoarea numelui", - "key-management": "Gestionare chei", - "key-manager": "Manager cheie", - "your-stream-pubkeys": "Cheile publice ale transmisiunii dvs.", - "no-keys": "Nicio cheie configurată", - "pubkey-description": "Cheile publice sunt asociate cu cheile de transmisiune (utilizate în software-ul de streaming) pentru a semna și verifica transmisiunea.", - "keys-count": "{$count ->\n [one] {$count} cheie\n *[other] {$count} chei\n }", - "recommendations": "Recomandări", - "manage-recommendations": "Gestionați recomandările", - "recommendations-to-others": "Recomandări pentru Alții", - "recommendations-description": "Distribuie până la 8 streameri pe care îi recomandați spectatorilor dvs.", - "no-recommendations-yet": "Nu au fost configurate recomandări încă", - "add-recommendation": "Adăugare recomandare", - "streamer-did": "DID Streamer", - "recommendations-count": "{$count ->\n [one] {$count} recomandare\n *[other] {$count} (de) recomandări\n }", - "webhooks": "Webhook-uri", - "webhook-integrations": "Integrari Webhook", - "webhook-integrations-description": "Conectați servicii externe pentru a primi actualizări în timp real despre transmisiunile dvs.", - "create-webhook": "Creare Webhook", - "edit-webhook": "Editare Webhook", - "delete-webhook": "Ștergere Webhook", - "no-webhooks-yet": "Nu sunt încă configurate webhook-uri", - "failed-load-webhooks": "Nu s-au putut încărca webhook-urile", - "webhook-will-no-longer-receive-events": "Acest webhook nu va mai primi evenimente", - "create-first-webhook-description": "Creați-vă primul webhook pentru a începe să primiți evenimente de transmisiune", - "example-captain-hook": "Captain Hook", - "webhooks-count": "{$count ->\n [one] {$count} webhook\n *[other] {$count} (de) webhook-uri\n }", - "activates-on": "Se activează la:", - "events": "Evenimente", - "events-livestream": "Evenimente în transmisiuni", - "events-chat": "Evenimente de conversașie", - "untitled-webhook": "Webhook fără titlu", - "inactive": "Inactiv", - "active": "Activ", - "multistream": "Multi-transmisiune", - "multistream-targets": "Ținte multi-transmisiune", - "multistream-description": "Distribuie automat transmisiunile tale live Streamplace către alte servicii de streaming precum Twitch sau YouTube.", - "create-multistream-target": "Creare țintă multi-transmisiune", - "untitled-multistream-target": "Țintă fără titlu", - "failed-load-multistream-targets": "Nu s-au putut încărca țintele multi-transmisiune. Vă rugăm să încercați din nou.", - "failed-toggle-multistream-target": "Nu s-a putut comuta ținta multi-transmisiune. Vă rugăm să încercați din nou.", - "failed-delete-multistream-target": "Ștergerea țintei multi-transmisiune nu a reușit. Încercați din nou.", - "no-multistream-targets-yet": "Nu există încă ținte!", - "multistream-targets-count": "{$count ->\n [one] {$count} țintă\n *[other] {$count} (de) ținte\n }", - "multistream-delete-target-confirmation": "Sunteți sigur că vreți să ștergeți „{$target}”?", - "this-action-cannot-be-undone": "Această acțiune nu poate fi anulată.", - "rtmp-target-name": "Țintă RTMP", - "rtmp-target-url": "URL RTMP", - "rtmp-target-name-placeholder": "Ținta mea transmisiune", - "multistream-create-target": "Creare țintă", - "multistream-edit-target": "Editare țintă", - "created": "creată", - "status": "stare", - "debug-recording": "Depanare înregistrare", - "danmu-enabled": "Activare Danmu", - "danmu-enabled-description": "Afișați mesajele din chatul live ca comentarii plutitoare pe ecran", - "danmu-opacity": "Opacitate", - "danmu-speed": "Viteză", - "danmu-lane-count": "Număr de benzi", - "danmu-max-messages": "Mesaje maxime", - "app-version-description": "Nu sunt disponibile actualizări în acest moment", - "confirm-delete": "Sigur vreți să ștergeți asta?", - "action-cannot-be-undone": "Această acțiune nu poate fi anulată", - "name-optional": "Nume (opțional)", - "deleting": "Se șterge...", - "saving": "Se salvează...", - "go-to-dashboard": "Mergeți la tabloul de bord", - "need-setup-live-dashboard": "Trebuie să configurați mai întâi transmisiunile? Vizitați tabloul de bord al transmisiunilor", - "no-languages-found": "Nu s-au găsit limbi", - "branding": "Branding", - "branding-admin": "Administrarea brandingului", - "branding-admin-description": "Personalizați-vă instanța Streamplace. Rețineți că propagarea setărilor poate dura câteva ore.", - "branding-login-required": "Vă rugăm să vă conectați pentru a gestiona brandingul", - "branding-configuration": "Configurare", - "branding-text-settings": "Setări text", - "branding-colors": "Culori", - "branding-legal-links": "Link-uri legale", - "branding-images": "Imagini", - "branding-broadcaster-did": "DID radiodifuzor", - "branding-broadcaster-did-description": "Lăsați gol pentru a utiliza valorile implicite ale serverului", - "branding-site-title": "Titlul site-ului", - "branding-site-title-placeholder": "Introduceți un nou titlu de site", - "branding-site-description": "Descrierea site-ului", - "branding-site-description-placeholder": "Introduceți descrierea site-ului", - "branding-default-streamer": "Streamer implicit", - "branding-default-streamer-none": "Nimic", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "Ștergeți Streamerul implicit", - "branding-primary-color": "Culoare primară", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "Culoare de accent", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "Logo principal", - "branding-main-logo-description": "SVG, PNG, or JPEG (max 500KB)", - "branding-favicon": "Favicon", - "branding-favicon-description": "SVG, PNG, sau ICO (maxim 100KB)", - "branding-sidebar-bg": "Imagine de fundal din bara laterală", - "branding-sidebar-bg-description": "SVG, PNG sau JPEG (maxim 500kb) - apare aliniat la partea de jos a barei laterale, pe lățime completă. Încărcați o imagine cu opacitate pentru cele mai bune rezultate, deoarece în prezent nu există o opțiune separată de opacitate.", - "branding-current": "Current: {$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "Încărcare logo", - "branding-delete-logo": "Ștergere logo", - "branding-upload-favicon": "Încărcare Favicon", - "branding-delete-favicon": "Ștergere Favicon", - "branding-upload-background": "Încărcare imagine de fundal", - "branding-delete-background": "Ștergere imagine de fundal", - "branding-web-only": "Încărcarea imaginilor este disponibilă doar pe web.", - "refresh-branding": "Actualizați elementele de branding", - "branding-add-legal-link": "Adăugați link legal", - "branding-edit-legal-link": "Editați linkul legal", - "branding-legal-link-text-placeholder": "Textul linkului (de exemplu, Politica de confidențialitate)", - "branding-legal-link-url-placeholder": "Adresa URL (de ex., https://example.com/privacy)", - "add": "Adăugare", - "edit": "Editare", - "branding-not-authenticated": "Vă rugăm să vă conectați mai întâi", - "branding-empty-value": "Vă rugăm să introduceți o valoare", - "branding-update-success": "{$key} a fost actualizat cu succes", - "branding-upload-success": "{$key} a fost încărcat cu succes", - "branding-delete-success": "{$key} a fost șters cu succes", - "branding-upload-failed": "Încărcare eșuată", - "branding-delete-failed": "Ștergere eșuată", - "branding-not-available": "Încărcarea de fișiere este disponibilă doar pe web.", - "node-legal-documents": "Documente specifice radiodifuzorului", - "badges": "Insigne", - "badges-cosmetic-section": "Insigne cosmetice", - "badges-empty-state": "Nu ți-a fost acordată nicio insignă încă.", - "badges-failed-load": "Nu s-au putut încărca insignele", - "badges-failed-update": "Nu s-a putut actualiza selecția de insigne", - "badges-issued-by": "Acordată de {$issuer}", - "badges-streamer-section": "Insigne de la streameri", - "issue-badges": "Emitere insigne", - "issue-badges-back-to-definitions": "Definiții insigne", - "issue-badges-badge-name": "Numele insignei", - "issue-badges-badge-name-placeholder": "ex. VIP, Susținător", - "issue-badges-badge-type": "Tipul insignei", - "issue-badges-choose-image": "Alegeți imaginea", - "issue-badges-create-definition": "Creare definiție insignă", - "issue-badges-create-definition-description": "Definiți un nou tip de insignă care poate fi acordată spectatorilor", - "issue-badges-create-definition-subtitle": "Definiți un nou tip de insignă", - "issue-badges-definition-created": "Definiție insignă creată", - "issue-badges-description-optional": "Descriere (opțional)", - "issue-badges-description-placeholder": "Descriere opțională pentru această insignă", - "issue-badges-failed-create": "Nu s-a putut crea definiția insignei", - "issue-badges-failed-issue": "Nu s-a putut emite insigna", - "issue-badges-failed-load": "Nu s-au putut încărca definițiile insignelor", - "issue-badges-image-optional": "Imagine (opțional)", - "issue-badges-image-too-large": "Imaginea trebuie să fie mai mică de 256KB", - "issue-badges-image-web-only": "Încărcarea imaginilor este disponibilă doar pe web", - "issue-badges-issue-badge": "Emite insignă", - "issue-badges-issue-badge-description": "Emite insigna „{$name}\" unui spectator prin DID-ul său", - "issue-badges-issued": "Insignă emisă", - "issue-badges-issued-to": "Emisă pentru {$did}", - "issue-badges-manage-description": "Creați definiții de insigne și emiteți-le spectatorilor", - "issue-badges-recipient-did": "DID destinatar", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "Atingeți pentru a emite", - "issue-badges-your-definitions": "Definițiile dvs. de insigne" -} diff --git a/js/web/public/locales/zh-Hans/common.json b/js/web/public/locales/zh-Hans/common.json deleted file mode 100644 index 082dd6d61..000000000 --- a/js/web/public/locales/zh-Hans/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "正在加载...", - "error": "错误", - "cancel": "取消", - "confirm": "确认", - "close": "关闭", - "open": "开启", - "ok": "确定", - "yes": "是", - "no": "否", - "continue": "继续", - "back": "返回", - "next": "下一步", - "finish": "完成", - "save": "保存", - "delete": "删除", - "edit": "编辑", - "create": "创建", - "update": "更新", - "refresh": "刷新", - "success": "成功", - "warning": "警告", - "info": "信息", - "search-placeholder": "搜索...", - "message-input": "输入您的消息...", - "please-log-in-to-access-this-page": "请登录以访问此页面", - "go-to-settings": "前往设置", - "go-back": "返回", - "welcome-user": "欢迎,{$username}!", - "notification-count": "{$count ->\n [0] 无通知\n *[other] {$count} 则通知\n }", - "user-offline": "用户离线", - "user-offline-message": "{$source ->\n [streamer] 看起来 <1>@{$handle} 离线了,但他们推荐观看:\n *[default] 看起来 <1>@{$handle} 离线了,但我们推荐观看:\n }", - "user-offline-no-recommendations": "看起来 <1>@{$handle} 离线了。\n请稍后再来看看。", - "streaming-title": "正在直播 {$title}", - "viewer-count": "{$count} 位观众", - "pds-selector-title": "刚接触 Atmosphere 吗?", - "pds-selector-description": "您需要选择一个 PDS (个人数据服务器) 来访问 Atmosphere 上的应用程序,例如 Bluesky、Tangled 和 Spark。", - "pds-selector-custom-label": "另一个 PDS", - "pds-selector-custom-description": "请输入您自己的 PDS 主机网址", - "pds-selector-custom-url-label": "自定义 PDS 网址", - "pds-selector-custom-url-placeholder": "https://pds.example.com", - "pds-selector-learn-more": "了解有关自组主机的更多信息", - "pds-selector-info": "每个主机都有自己的政策和可靠性标准。您的 ATProto 数据存储在您选择的主机上,您可以以后进行迁移。注意:Streamplace 有自己的审核规则——无论您选择哪个主机,都可能会被 Streamplace 禁止使用。", - "pds-selector-read-policies": "在继续之前,请阅读 {$label} 的服务条款和隐私政策。", - "pds-selector-handle-policy-checkbox": "我已阅读并同意处理政策", - "login-show-live-on-bluesky": "在 Bluesky 上显示我的直播状态", - "login-show-live-on-bluesky-description": "直播时为您的 Bluesky 头像加上红色 LIVE 圆环,并允许 Streamplace 代您发布直播公告。取消勾选即可在不授予任何 Bluesky 账号访问权限的情况下登录。" -} diff --git a/js/web/public/locales/zh-Hans/settings.json b/js/web/public/locales/zh-Hans/settings.json deleted file mode 100644 index 9af46c5ca..000000000 --- a/js/web/public/locales/zh-Hans/settings.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "app-version": "Streamplace v{$version}", - "download-new-update": "下载新更新", - "check-for-updates": "检查更新", - "bundled-runtype": "捆绑版", - "ota-runtype": "空中下载 (OTA)", - "recovery-runtype": "复原模式", - "modal-latest-version": "您正在使用最新版本。", - "modal-no-update-available": "您已经在使用最新版本的 Streamplace,太棒了!", - "modal-update-available-title": "有可用更新", - "modal-update-available-description": "新版本的 Streamplace 已准备好下载", - "modal-update-failed": "更新检查失败。您可能需要透过 {$store} 更新应用程序。", - "modal-update-failed-title": "更新失败", - "modal-update-failed-description": "更新检查失败。您可能需要透过 {$store} 更新应用程序。", - "button-reload-app-on-update": "套用更新 (将重新加载应用程序)", - "use-custom-node": "使用自定义节点", - "default-url": "默认:{$url}", - "enter-custom-node-url": "输入自定义节点网址", - "save-button": "保存", - "try-new-web": "试用新版网页 (beta)", - "try-new-web-description": "切换到新的网页界面。你可以随时通过此设置切换回来。", - "try-old-app": "使用原版界面", - "try-old-app-description": "返回 Streamplace 原版界面。", - "language-selection": "语言", - "language-selection-description": "选择您偏好的语言", - "input-search-languages": "搜索语言...", - "help-translate": "帮助我们翻译 Streamplace", - "help-translate-description": "我们正在寻找志愿者协助将 Streamplace 翻译成更多语言。如果您有兴趣,请在 Discord 或 GitHub 上与我们联系!", - "currently-translating": "翻译正在进行中", - "currently-translating-description": "应用程序的某些部分可能看起来不完整。感谢您的耐心等待!", - "debug-recording-title": "允许 {$host} 录制您的直播串流以进行除错和服务改善", - "debug-recording-description": "可选项", - "manage-keys": "管理密钥", - "settings-title": "设置", - "error": "错误", - "about": "关于", - "account": "帐户", - "advanced": "高级", - "danmu": "弹幕", - "developer": "开发者", - "languages": "语言", - "privacy-security": "隐私与安全", - "streaming": "串流", - "notifications": "通知", - "cancel": "取消", - "create": "创建", - "delete": "删除", - "refresh": "刷新", - "sign-in": "登录", - "update": "更新", - "log-out": "登出", - "optional": "选填", - "account-greeting": "嗨,@{$handle}。", - "edit-profile-bluesky": "在 Bluesky 编辑个人数据", - "change-name-color": "更改名称颜色", - "key-management": "密钥管理", - "key-manager": "密钥管理器", - "your-stream-pubkeys": "您的串流公开密钥", - "no-keys": "尚未设置密钥", - "pubkey-description": "公开密钥与串流密钥 (用于串流软件) 配对以签署和验证您的串流", - "keys-count": "{$count} 个密钥", - "backup": "备份", - "backup-enabled": "S3 备份", - "backup-enabled-description": "自动将录影备份到兼容 S3 的存储", - "backup-connection-url": "连接网址", - "backup-connection-url-placeholder": "必须是格式为 s3+https://ACCESS_KEY:SECRET_KEY@region.endpoi.nt/bucket 的有效 S3 网址", - "backup-endpoint": "终端", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "存储桶", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "访问密钥", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "秘密密钥", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "backup-region": "地区", - "backup-region-placeholder": "us-east-1", - "backup-test-connection": "测试连接", - "backup-testing-connection": "正在测试连接...", - "backup-connection-successful": "连接成功", - "backup-connection-failed": "连接失败", - "show-password-in-url": "在网址中显示密码", - "show-password-in-url-description": "在连接网址中显示秘密密钥 (若有)", - "requested-seconds-per-segment": "每段秒数", - "requested-seconds-per-segment-description": "设置每段秒数,以请求服务器使用", - "recommendations": "推荐主播", - "manage-recommendations": "管理推荐主播", - "recommendations-to-others": "向他人推荐主播", - "recommendations-description": "向您的观众推荐最多 8 位主播", - "no-recommendations-yet": "尚未配置推荐", - "add-recommendation": "添加推荐", - "streamer-did": "主播 DID", - "recommendations-count": "{$count} 位推荐主播", - "webhooks": "Webhooks", - "webhook-integrations": "Webhook 集成", - "webhook-integrations-description": "连接外部服务以即时接收有关您串流的更新", - "create-webhook": "创建 Webhook", - "edit-webhook": "编辑 Webhook", - "delete-webhook": "删除 Webhook", - "no-webhooks-yet": "尚未设置 Webhook", - "failed-load-webhooks": "加载 Webhook 失败", - "webhook-will-no-longer-receive-events": "此 Webhook 将不再接收事件", - "create-first-webhook-description": "创建您的第一个 Webhook 以开始接收串流事件", - "example-captain-hook": "Hook 船长", - "webhooks-count": "{$count} 个 Webhook", - "activates-on": "触发于:", - "events": "事件", - "events-livestream": "直播串流事件", - "events-chat": "聊天事件", - "untitled-webhook": "未命名的 Webhook", - "inactive": "停用", - "active": "活动", - "multistream": "多重串流", - "multistream-targets": "多重串流目标", - "multistream-description": "自动将您的 Streamplace 直播推送到 Twitch 或 YouTube 等其他直播平台。", - "create-multistream-target": "创建多重串流目标", - "untitled-multistream-target": "未命名目标", - "failed-load-multistream-targets": "加载多重串流目标失败。请重试。", - "failed-toggle-multistream-target": "切换多重串流目标失败。请重试。", - "failed-delete-multistream-target": "删除多重串流目标失败。请重试。", - "no-multistream-targets-yet": "还没有目标!", - "multistream-targets-count": "{$count} 个目标", - "multistream-delete-target-confirmation": "您确定要删除“{$target}”吗?", - "this-action-cannot-be-undone": "此操作无法撤销。", - "rtmp-target-name": "RTMP 目标", - "rtmp-target-url": "RTMP 网址", - "rtmp-target-name-placeholder": "我的多重串流目标", - "multistream-create-target": "创建目标", - "multistream-edit-target": "编辑目标", - "created": "创建于", - "status": "状态", - "debug-recording": "调试录制", - "danmu-enabled": "启用弹幕", - "danmu-enabled-description": "将即时聊天消息以浮动评论的形式显示在您的屏幕上", - "danmu-opacity": "不透明度", - "danmu-speed": "速度", - "danmu-lane-count": "轨道数量", - "danmu-max-messages": "最大消息数", - "app-version-description": "当前没有可用的更新", - "confirm-delete": "您确定要删除吗?", - "action-cannot-be-undone": "此操作无法撤销", - "name-optional": "名称 (选填)", - "deleting": "正在删除...", - "saving": "正在保存...", - "go-to-dashboard": "前往仪表板", - "need-setup-live-dashboard": "需要先设置串流吗?请访问直播仪表板", - "no-languages-found": "找不到语言", - "branding": "品牌", - "branding-admin": "品牌管理", - "branding-admin-description": "自定义您的 Streamplace 实例。请注意,设置可能需要几小时才能生效。", - "branding-login-required": "请登录以管理品牌", - "branding-configuration": "配置", - "branding-text-settings": "文字设置", - "branding-colors": "颜色", - "branding-legal-links": "法律链接", - "branding-images": "图像", - "branding-broadcaster-did": "主播 DID", - "branding-broadcaster-did-description": "留空以使用服务器默认值", - "branding-site-title": "网站标题", - "branding-site-title-placeholder": "输入新网站标题", - "branding-site-description": "网站描述", - "branding-site-description-placeholder": "输入网站描述", - "branding-default-streamer": "默认主播", - "branding-default-streamer-none": "无", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "清除默认主播", - "branding-primary-color": "首要颜色", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "强调色", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "主标志", - "branding-main-logo-description": "SVG、PNG 或 JPEG (最大 500KB)", - "branding-favicon": "网站图标", - "branding-favicon-description": "SVG、PNG 或 ICO (最大 100KB)", - "branding-sidebar-bg": "侧边栏背景图片", - "branding-sidebar-bg-description": "SVG、PNG 或 JPEG (最大 500KB)——显示在侧边栏底部,全宽显示。为了获得最佳效果,请上传一张带有透明度的图片,因为目前没有单独的透明度选项。", - "branding-current": "当前:{$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "上传标志", - "branding-delete-logo": "删除标志", - "branding-upload-favicon": "上传网站图标", - "branding-delete-favicon": "删除网站图标", - "branding-upload-background": "上传背景", - "branding-delete-background": "删除背景", - "branding-web-only": "图像上传仅在网页端可用。", - "refresh-branding": "更新品牌资源", - "branding-add-legal-link": "添加法律链接", - "branding-edit-legal-link": "编辑法律链接", - "branding-legal-link-text-placeholder": "链接文本 (例如:隐私政策)", - "branding-legal-link-url-placeholder": "网址 (例如:https://example.com/privacy)", - "add": "添加", - "edit": "编辑", - "branding-not-authenticated": "请先登录", - "branding-empty-value": "请输入一个数值", - "branding-update-success": "{$key} 更新成功", - "branding-upload-success": "{$key} 上传成功", - "branding-delete-success": "{$key} 删除成功", - "branding-upload-failed": "上传失败", - "branding-delete-failed": "删除失败", - "branding-not-available": "文件上传仅在网页版上可用", - "node-legal-documents": "主播专属文档", - "backup-save": "保存备份设置", - "backup-saving": "正在保存备份设置...", - "backup-secret-key-set-placeholder": "(密码已设置)", - "backup-error-invalid-endpoint": "必须是有效的域名", - "backup-error-invalid-bucket": "必须只包含小写字母、数字、点和连字符", - "backup-error-invalid-segment-duration": "必须在 1 到 60 秒之间", - "backup-error-load-failed": "加载存储设置失败", - "backup-error-update-failed": "更新备份状态失败", - "backup-error-save-failed": "保存存储设置失败", - "backup-error-missing-secret": "没有秘密密钥时无法更新 S3 设置。请重新输入。", - "backup-segment-duration-placeholder": "6", - "badges": "徽章", - "badges-cosmetic-section": "装饰性徽章", - "badges-empty-state": "您还没有获得任何徽章。", - "badges-failed-load": "加载徽章失败", - "badges-failed-update": "更新徽章选择失败", - "badges-issued-by": "由 {$issuer} 颁发", - "badges-streamer-section": "主播徽章", - "issue-badges": "颁发徽章", - "issue-badges-back-to-definitions": "徽章定义", - "issue-badges-badge-name": "徽章名称", - "issue-badges-badge-name-placeholder": "例如 VIP、支持者", - "issue-badges-badge-type": "徽章类型", - "issue-badges-choose-image": "选择图片", - "issue-badges-create-definition": "创建徽章定义", - "issue-badges-create-definition-description": "定义可颁发给观众的新徽章类型", - "issue-badges-create-definition-subtitle": "定义新徽章类型", - "issue-badges-definition-created": "徽章定义已创建", - "issue-badges-description-optional": "描述(可选)", - "issue-badges-description-placeholder": "此徽章的可选描述", - "issue-badges-failed-create": "创建徽章定义失败", - "issue-badges-failed-issue": "颁发徽章失败", - "issue-badges-failed-load": "加载徽章定义失败", - "issue-badges-image-optional": "图片(可选)", - "issue-badges-image-too-large": "图片必须小于 256KB", - "issue-badges-image-web-only": "图片上传仅在网页版可用", - "issue-badges-issue-badge": "颁发徽章", - "issue-badges-issue-badge-description": "通过 DID 将\"{$name}\"徽章颁发给观众", - "issue-badges-issued": "徽章已颁发", - "issue-badges-issued-to": "已颁发给 {$did}", - "issue-badges-manage-description": "创建徽章定义并颁发给观众", - "issue-badges-recipient-did": "收件人 DID", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "点击颁发", - "issue-badges-your-definitions": "您的徽章定义" -} diff --git a/js/web/public/locales/zh-Hant/common.json b/js/web/public/locales/zh-Hant/common.json deleted file mode 100644 index e06e5aa8b..000000000 --- a/js/web/public/locales/zh-Hant/common.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "loading": "載入中...", - "error": "錯誤", - "cancel": "取消", - "confirm": "確認", - "close": "關閉", - "open": "開啟", - "ok": "確定", - "yes": "是", - "no": "否", - "continue": "繼續", - "back": "返回", - "next": "下一步", - "finish": "完成", - "save": "儲存", - "delete": "刪除", - "edit": "編輯", - "create": "建立", - "update": "更新", - "refresh": "重新整理", - "success": "成功", - "warning": "警告", - "info": "資訊", - "search-placeholder": "搜尋...", - "message-input": "輸入您的訊息...", - "please-log-in-to-access-this-page": "請登入以存取此頁面", - "go-to-settings": "前往設定", - "go-back": "返回", - "welcome-user": "歡迎,{$username}!", - "notification-count": "{$count ->\n [0] 無通知\n [1] 一則通知\n *[other] {$count} 則通知\n }", - "user-offline": "使用者離線", - "user-offline-message": "{$source ->\n [streamer] 看起來 <1>@{$handle} 離線 了,但他們推薦觀看:\n *[default] 看起來 <1>@{$handle} 離線 了,但我們推薦觀看:\n }", - "user-offline-no-recommendations": "看起來 <1>@{$handle} 離線 了。\n請稍後再來看看。", - "streaming-title": "正在直播 {$title}", - "viewer-count": "{$count ->\n [0] 0 位觀眾\n [1] 1 位觀眾\n *[other] {$count} 位觀眾\n }", - "pds-selector-title": "初次接觸 Atmosphere?", - "pds-selector-description": "您需要選擇一個 PDS(個人資料伺服器)來存取 Atmosphere 上的應用程式,例如 Bluesky、Tangled 和 Spark。", - "pds-selector-custom-label": "其他 PDS", - "pds-selector-custom-description": "輸入您自己的 PDS 主機網址", - "pds-selector-custom-url-label": "自訂 PDS 網址", - "pds-selector-custom-url-placeholder": "https://pds.example.com", - "pds-selector-learn-more": "了解更多關於自行架設的資訊", - "pds-selector-info": "每個主機都有自己的政策和可靠性標準。您的 ATProto 資料存放在您選擇的主機上,您可以之後進行遷移。注意:Streamplace 有自己的審核規則——無論您選擇哪個主機,都可能被 Streamplace 封禁。", - "pds-selector-read-policies": "在繼續之前,請閱讀 {$label} 的服務條款和隱私政策。", - "pds-selector-handle-policy-checkbox": "我已閱讀並同意識別碼政策", - "login-show-live-on-bluesky": "在 Bluesky 上顯示我的直播狀態", - "login-show-live-on-bluesky-description": "直播時為您的 Bluesky 頭像加上紅色 LIVE 圓環,並允許 Streamplace 代您發布直播公告。取消勾選即可在不授予任何 Bluesky 帳號存取權限的情況下登入。" -} diff --git a/js/web/public/locales/zh-Hant/settings.json b/js/web/public/locales/zh-Hant/settings.json deleted file mode 100644 index 5c5990c52..000000000 --- a/js/web/public/locales/zh-Hant/settings.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "app-version": "播家 v{$version}", - "download-new-update": "下載新更新", - "check-for-updates": "檢查更新", - "bundled-runtype": "捆綁版", - "ota-runtype": "空中下載 (OTA)", - "recovery-runtype": "復原模式", - "modal-latest-version": "您正在使用最新版本。", - "modal-no-update-available": "您已經在使用最新版本的直播地,太棒了!", - "modal-update-available-title": "有可用更新", - "modal-update-available-description": "新版本的直播地已準備好下載", - "modal-update-failed": "更新檢查失敗。您可能需要透過 {$store} 更新應用程式。", - "modal-update-failed-title": "更新失敗", - "modal-update-failed-description": "更新檢查失敗。您可能需要透過 {$store} 更新應用程式。", - "button-reload-app-on-update": "套用更新 (將重新載入應用程式)", - "use-custom-node": "使用自訂節點", - "default-url": "預設:{$url}", - "enter-custom-node-url": "輸入自訂節點網址", - "save-button": "儲存", - "try-new-web": "試用新版網頁 (beta)", - "try-new-web-description": "切換到新的網頁介面。你可以隨時透過此設定切換回來。", - "try-old-app": "使用原版介面", - "try-old-app-description": "返回 Streamplace 原版介面。", - "language-selection": "語言", - "language-selection-description": "選擇您偏好的語言", - "help-translate": "幫助我們翻譯播家", - "help-translate-description": "我們正在尋找志願者協助將播家翻譯成更多語言。如果您有興趣,請在 Discord 或 GitHub 上與我們聯繫!", - "currently-translating": "翻譯正在進行中", - "currently-translating-description": "應用程式的某些部分可能看起來不完整。感謝您的耐心等待!", - "debug-recording-title": "允許 {$host} 錄製您的直播串流以進行除錯和服務改善", - "debug-recording-description": "可選項目", - "input-search-languages": "搜尋語言...", - "manage-keys": "管理金鑰", - "settings-title": "設定", - "loading": "載入中...", - "error": "錯誤", - "cancel": "取消", - "confirm": "確認", - "welcome-user": "歡迎,{$username}!", - "notification-count": "{$count ->\n [0] 無通知\n [1] 一則通知\n *[other] {$count} 則通知\n }", - "search-placeholder": "搜尋...", - "message-input": "請輸入您的訊息...", - "success": "成功", - "warning": "警告", - "info": "資訊", - "close": "關閉", - "open": "開啟", - "delete": "刪除", - "edit": "編輯", - "create": "建立", - "update": "更新", - "refresh": "重新整理", - "save": "儲存", - "cancel-button": "取消", - "ok": "確定", - "yes": "是", - "no": "否", - "continue": "繼續", - "back": "返回", - "next": "下一步", - "finish": "完成", - "about": "關於", - "account": "帳戶", - "advanced": "進階", - "danmu": "彈幕", - "developer": "開發者", - "languages": "語言", - "privacy-security": "隱私與安全", - "streaming": "串流", - "notifications": "通知", - "sign-in": "登入", - "log-out": "登出", - "account-greeting": "嗨,@{$handle}。", - "edit-profile-bluesky": "編輯個人資料(在 Bluesky)", - "change-name-color": "變更名稱顏色", - "key-management": "金鑰管理", - "key-manager": "金鑰管理器", - "your-stream-pubkeys": "您的串流公開金鑰", - "no-keys": "尚未設定金鑰", - "pubkey-description": "公開金鑰與串流金鑰(用於串流軟體)配對以簽署和驗證您的串流", - "keys-count": "{$count} 個金鑰", - "webhooks": "Webhooks", - "webhook-integrations": "Webhook 整合", - "webhook-integrations-description": "連接外部服務以即時接收有關您串流的更新", - "create-webhook": "建立 Webhook", - "edit-webhook": "編輯 Webhook", - "delete-webhook": "刪除 Webhook", - "no-webhooks-yet": "尚未設定 webhook", - "failed-load-webhooks": "載入 webhook 失敗", - "webhook-will-no-longer-receive-events": "此 webhook 將不再接收事件", - "create-first-webhook-description": "建立您的第一個 webhook 以開始接收串流事件", - "example-captain-hook": "虎克船長", - "webhooks-count": "{$count ->\n *[other] {$count} 個 webhook\n }", - "activates-on": "觸發於:", - "events-livestream": "直播串流事件", - "events-chat": "聊天事件", - "untitled-webhook": "未命名的 Webhook", - "inactive": "停用", - "debug-recording": "除錯錄製", - "danmu-enabled": "啟用彈幕", - "danmu-enabled-description": "將即時聊天訊息以浮動評論的形式顯示在您的螢幕上", - "danmu-opacity": "不透明度", - "danmu-speed": "速度", - "danmu-lane-count": "軌道數量", - "danmu-max-messages": "最大訊息數", - "app-version-description": "目前版本資訊", - "confirm-delete": "您確定要刪除嗎?", - "action-cannot-be-undone": "此動作無法復原", - "name-optional": "名稱(選填)", - "deleting": "刪除中...", - "saving": "儲存中...", - "go-to-dashboard": "前往控制台", - "need-setup-live-dashboard": "您需要先在控制台中設定直播串流", - "no-languages-found": "找不到語言", - "backup-save": "儲存備份設定", - "backup-saving": "正在儲存備份設定...", - "backup-secret-key-set-placeholder": "(密碼已設定)", - "backup-error-invalid-endpoint": "必須是有效的網域名稱", - "backup-error-invalid-bucket": "只能包含小寫字母、數字、點和連字號", - "backup-error-invalid-segment-duration": "必須介於 1 到 60 秒之間", - "backup-error-load-failed": "無法載入儲存設定", - "backup-error-update-failed": "更新備份狀態失敗", - "backup-error-save-failed": "儲存設定失敗", - "backup-error-missing-secret": "無法在沒有金鑰的情況下更新 S3 設定。請重新輸入。", - "backup-segment-duration-placeholder": "6", - "backup": "備份", - "backup-enabled": "S3 備份", - "backup-enabled-description": "自動將錄影備份到相容 S3 的儲存空間", - "backup-connection-url": "連線網址", - "backup-connection-url-placeholder": "s3+https://ACCESS_KEY:SECRET_KEY@s3.example.com/bucket", - "backup-endpoint": "端點", - "backup-endpoint-placeholder": "s3.example.com", - "backup-bucket": "儲存桶", - "backup-bucket-placeholder": "my-backup-bucket", - "backup-access-key": "存取金鑰", - "backup-access-key-placeholder": "AKIAIOSFODNN7EXAMPLE", - "backup-secret-key": "秘密金鑰", - "backup-secret-key-placeholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "show-password-in-url": "在網址中顯示密碼", - "show-password-in-url-description": "在連線網址中顯示秘密金鑰(若已輸入)", - "recommendations-to-others": "向他人推薦主播", - "recommendations-description": "向您的觀眾推薦最多 8 位主播", - "no-recommendations-yet": "尚未設定推薦", - "multistream": "多重串流", - "multistream-targets": "多重串流目標", - "multistream-description": "自動將您的 Streamplace 直播推送到 Twitch 或 YouTube 等其他直播平台。", - "create-multistream-target": "建立多重串流目標", - "untitled-multistream-target": "未命名目標", - "failed-load-multistream-targets": "載入多重串流目標失敗。請重試。", - "failed-toggle-multistream-target": "切換多重串流目標失敗。請重試。", - "no-multistream-targets-yet": "還沒有目標!", - "multistream-targets-count": "{$count} 個目標", - "multistream-delete-target-confirmation": "您確定要刪除「{$target}」嗎?", - "this-action-cannot-be-undone": "此動作無法復原。", - "rtmp-target-name": "RTMP 目標", - "rtmp-target-url": "RTMP 網址", - "rtmp-target-name-placeholder": "我的多重串流目標", - "multistream-create-target": "建立目標", - "multistream-edit-target": "編輯目標", - "created": "建立於", - "status": "狀態", - "branding": "品牌識別", - "branding-admin": "品牌識別管理", - "branding-admin-description": "自訂您的 Streamplace 執行個體。請注意,設定可能需要幾小時才能生效。", - "branding-login-required": "請登入以管理品牌識別", - "branding-configuration": "設定", - "branding-text-settings": "文字設定", - "branding-colors": "顏色", - "branding-legal-links": "法律連結", - "branding-images": "圖像", - "branding-broadcaster-did": "主播 DID", - "branding-broadcaster-did-description": "留空以使用伺服器預設值", - "branding-site-title": "網站標題", - "branding-site-title-placeholder": "輸入新網站標題", - "branding-site-description": "網站描述", - "branding-site-description-placeholder": "輸入網站描述", - "branding-default-streamer": "預設主播", - "branding-default-streamer-none": "無", - "branding-default-streamer-placeholder": "did:plc:...", - "branding-clear-default-streamer": "清除預設主播", - "branding-primary-color": "主要顏色", - "branding-primary-color-placeholder": "#6366f1", - "branding-accent-color": "強調色", - "branding-accent-color-placeholder": "#8b5cf6", - "branding-main-logo": "主標誌", - "branding-main-logo-description": "SVG、PNG 或 JPEG(最大 500KB)", - "branding-favicon": "網站圖示", - "branding-favicon-description": "SVG、PNG 或 ICO(最大 100KB)", - "branding-sidebar-bg": "側邊欄背景圖片", - "branding-sidebar-bg-description": "SVG、PNG 或 JPEG(最大 500KB)——顯示在側邊欄底部,全寬顯示。為了最佳效果,請上傳帶有透明度的圖片,因為目前沒有單獨的透明度選項。", - "branding-current": "目前:{$value}", - "branding-dimensions": "{$height} x {$width}", - "branding-upload-logo": "上傳標誌", - "branding-delete-logo": "刪除標誌", - "branding-upload-favicon": "上傳網站圖示", - "branding-delete-favicon": "刪除網站圖示", - "branding-upload-background": "上傳背景", - "branding-delete-background": "刪除背景", - "branding-web-only": "圖片上傳僅在網頁版可用。", - "refresh-branding": "更新品牌識別資源", - "branding-add-legal-link": "新增法律連結", - "branding-edit-legal-link": "編輯法律連結", - "branding-legal-link-text-placeholder": "連結文字(例如:隱私政策)", - "branding-legal-link-url-placeholder": "網址(例如:https://example.com/privacy)", - "add": "新增", - "active": "啟用", - "optional": "選填", - "branding-not-authenticated": "請先登入", - "branding-empty-value": "請輸入一個值", - "branding-update-success": "{$key} 更新成功", - "branding-upload-success": "{$key} 上傳成功", - "branding-delete-success": "{$key} 刪除成功", - "branding-upload-failed": "上傳失敗", - "branding-delete-failed": "刪除失敗", - "branding-not-available": "檔案上傳僅在網頁版可用", - "node-legal-documents": "主播專屬文件", - "badges": "徽章", - "badges-cosmetic-section": "裝飾性徽章", - "badges-empty-state": "您尚未獲得任何徽章。", - "badges-failed-load": "載入徽章失敗", - "badges-failed-update": "更新徽章選擇失敗", - "badges-issued-by": "由 {$issuer} 頒發", - "badges-streamer-section": "主播徽章", - "issue-badges": "頒發徽章", - "issue-badges-back-to-definitions": "徽章定義", - "issue-badges-badge-name": "徽章名稱", - "issue-badges-badge-name-placeholder": "例如 VIP、支持者", - "issue-badges-badge-type": "徽章類型", - "issue-badges-choose-image": "選擇圖片", - "issue-badges-create-definition": "建立徽章定義", - "issue-badges-create-definition-description": "定義可頒發給觀眾的新徽章類型", - "issue-badges-create-definition-subtitle": "定義新徽章類型", - "issue-badges-definition-created": "徽章定義已建立", - "issue-badges-description-optional": "描述(選填)", - "issue-badges-description-placeholder": "此徽章的選填描述", - "issue-badges-failed-create": "建立徽章定義失敗", - "issue-badges-failed-issue": "頒發徽章失敗", - "issue-badges-failed-load": "載入徽章定義失敗", - "issue-badges-image-optional": "圖片(選填)", - "issue-badges-image-too-large": "圖片必須小於 256KB", - "issue-badges-image-web-only": "圖片上傳僅在網頁版可用", - "issue-badges-issue-badge": "頒發徽章", - "issue-badges-issue-badge-description": "透過 DID 將「{$name}」徽章頒發給觀眾", - "issue-badges-issued": "徽章已頒發", - "issue-badges-issued-to": "已頒發給 {$did}", - "issue-badges-manage-description": "建立徽章定義並頒發給觀眾", - "issue-badges-recipient-did": "收件者 DID", - "issue-badges-recipient-did-placeholder": "did:plc:...", - "issue-badges-tap-to-issue": "點擊頒發", - "issue-badges-your-definitions": "您的徽章定義" -} diff --git a/js/web/src/components/stream/stream-notification-provider.tsx b/js/web/src/components/stream/stream-notification-provider.tsx new file mode 100644 index 000000000..d9f14cf3d --- /dev/null +++ b/js/web/src/components/stream/stream-notification-provider.tsx @@ -0,0 +1,51 @@ +import { useEffect, useState } from "react"; +import { + streamNotificationManager, + type StreamNotification, +} from "../../lib/stream-notification"; + +export function StreamNotificationProvider({ + position = "top", +}: { + position?: "top" | "bottom"; +}) { + const [notifications, setNotifications] = useState( + streamNotificationManager.getAll(), + ); + + useEffect(() => streamNotificationManager.subscribe(setNotifications), []); + + return ( +
+ {notifications.map((notification) => ( + + ))} +
+ ); +} + +function NotificationItem({ + notification, + position, +}: { + notification: StreamNotification; + position: "top" | "bottom"; +}) { + return ( +
+ {notification.render ? ( + notification.render() + ) : ( +

{notification.message}

+ )} +
+ ); +} diff --git a/js/web/src/components/stream/stream-notifications.tsx b/js/web/src/components/stream/stream-notifications.tsx index b0315d367..fea05cdb0 100644 --- a/js/web/src/components/stream/stream-notifications.tsx +++ b/js/web/src/components/stream/stream-notifications.tsx @@ -20,6 +20,7 @@ import useAvatars from "../../hooks/use-avatars"; import { useCanModerate } from "../../hooks/use-can-moderate"; import { useModerationActions } from "../../hooks/use-moderation-actions"; import { useSession } from "../../lib/session"; +import { streamNotification } from "../../lib/stream-notification"; function rgbColor( color?: { red: number; green: number; blue: number } | null, @@ -61,8 +62,22 @@ export function StreamTeleportNotification({ store: LivestreamStore; }) { const teleport = useStore(store, (s) => s.activeTeleport); - if (!teleport) return null; - return ; + + useEffect(() => { + if (!teleport) { + streamNotification.hide("teleport"); + return; + } + + streamNotification.show({ + id: "teleport", + duration: 0, + render: () => , + }); + return () => streamNotification.hide("teleport"); + }, [store, teleport]); + + return null; } function PinnedNotification({ @@ -262,6 +277,10 @@ function TeleportNotification({ const diff = Math.max(0, Math.ceil((startsAt - now) / 1000)); + useEffect(() => { + if (diff <= 0) streamNotification.hide("teleport"); + }, [diff]); + if (diff <= 0) return null; const mins = Math.floor(diff / 60); diff --git a/js/web/src/components/stream/video-section.tsx b/js/web/src/components/stream/video-section.tsx index 0555e50b7..dde463216 100644 --- a/js/web/src/components/stream/video-section.tsx +++ b/js/web/src/components/stream/video-section.tsx @@ -11,6 +11,7 @@ import { useStore as useAppStore } from "../../lib/store"; import { getStreamplaceUrl } from "../../lib/streamplace-url"; import { DanmuOverlay } from "./danmu-overlay"; import { PlayerOffline } from "./player-offline"; +import { StreamNotificationProvider } from "./stream-notification-provider"; import { UserOffline } from "./user-offline"; const DANMU_KEY = "danmu-enabled"; @@ -243,6 +244,8 @@ export function VideoSectionInner({ {p.message} ))} + + {mode === "live" && store && } ); diff --git a/js/web/src/lib/i18n.ts b/js/web/src/lib/i18n.ts index 0677bf7fa..01ada437d 100644 --- a/js/web/src/lib/i18n.ts +++ b/js/web/src/lib/i18n.ts @@ -6,6 +6,7 @@ import { esESSettings, frFRCommon, frFRSettings, + getSupportedLocales, ptBRCommon, ptBRSettings, roROCommon, @@ -36,6 +37,7 @@ i18next .use(i18nextFluent) .init({ ...baseConfig, + preload: getSupportedLocales(), resources, } as Parameters[0]); diff --git a/js/web/src/lib/stream-notification.ts b/js/web/src/lib/stream-notification.ts new file mode 100644 index 000000000..7ec334263 --- /dev/null +++ b/js/web/src/lib/stream-notification.ts @@ -0,0 +1,83 @@ +import type { ReactNode } from "react"; + +export type StreamNotificationConfig = { + id: string; + message?: string; + render?: () => ReactNode; + duration?: number; +}; + +export type StreamNotification = StreamNotificationConfig & { + startTime: number; +}; + +class StreamNotificationManager { + private notifications: StreamNotification[] = []; + private listeners = new Set<(notifications: StreamNotification[]) => void>(); + private dismissTimers = new Map>(); + + show(config: StreamNotificationConfig) { + const timer = this.dismissTimers.get(config.id); + if (timer) { + clearTimeout(timer); + this.dismissTimers.delete(config.id); + } + + this.notifications = this.notifications.filter( + (notification) => notification.id !== config.id, + ); + const notification = { + ...config, + duration: config.duration ?? 5, + startTime: Date.now(), + }; + this.notifications = [...this.notifications, notification]; + this.notifyListeners(); + + if (notification.duration > 0) { + this.dismissTimers.set( + config.id, + setTimeout(() => this.hide(config.id), notification.duration * 1000), + ); + } + } + + hide(id: string) { + const timer = this.dismissTimers.get(id); + if (timer) { + clearTimeout(timer); + this.dismissTimers.delete(id); + } + + const remaining = this.notifications.filter( + (notification) => notification.id !== id, + ); + if (remaining.length === this.notifications.length) return; + this.notifications = remaining; + this.notifyListeners(); + } + + getAll() { + return this.notifications; + } + + subscribe(listener: (notifications: StreamNotification[]) => void) { + this.listeners.add(listener); + listener(this.notifications); + return () => { + this.listeners.delete(listener); + }; + } + + private notifyListeners() { + this.listeners.forEach((listener) => listener(this.notifications)); + } +} + +export const streamNotificationManager = new StreamNotificationManager(); + +export const streamNotification = { + show: (config: StreamNotificationConfig) => + streamNotificationManager.show(config), + hide: (id: string) => streamNotificationManager.hide(id), +};