From 3bd480b75e90eddcd8815473eed31a9b5532646a Mon Sep 17 00:00:00 2001 From: reya Date: Tue, 30 Jan 2024 08:55:49 +0700 Subject: [PATCH] feat: optimize locale loader --- apps/desktop/package.json | 1 + apps/desktop/src/i18n.ts | 41 ++- apps/desktop/src/routes/auth/login-key.tsx | 27 +- apps/desktop/src/routes/auth/login.tsx | 14 +- pnpm-lock.yaml | 9 + src-tauri/locales/cn.json | 283 +++++++++++++++++++++ src-tauri/locales/en.json | 2 +- src-tauri/locales/ja.json | 282 +++++++++++++++++++- src-tauri/locales/ru.json | 283 +++++++++++++++++++++ src-tauri/locales/vi.json | 283 +++++++++++++++++++++ src-tauri/tauri.conf.json | 3 +- 11 files changed, 1177 insertions(+), 51 deletions(-) create mode 100644 src-tauri/locales/cn.json create mode 100644 src-tauri/locales/ru.json create mode 100644 src-tauri/locales/vi.json diff --git a/apps/desktop/package.json b/apps/desktop/package.json index f5db5003..7e27cc66 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -37,6 +37,7 @@ "@tanstack/react-query": "^5.17.19", "framer-motion": "^10.18.0", "i18next": "^23.8.0", + "i18next-resources-to-backend": "^1.2.0", "jotai": "^2.6.3", "minidenticons": "^4.2.0", "nanoid": "^5.0.4", diff --git a/apps/desktop/src/i18n.ts b/apps/desktop/src/i18n.ts index 61c6f437..080f7339 100644 --- a/apps/desktop/src/i18n.ts +++ b/apps/desktop/src/i18n.ts @@ -2,32 +2,25 @@ import { resolveResource } from "@tauri-apps/api/path"; import { readTextFile } from "@tauri-apps/plugin-fs"; import { locale } from "@tauri-apps/plugin-os"; import i18n from "i18next"; +import resourcesToBackend from "i18next-resources-to-backend"; import { initReactI18next } from "react-i18next"; -const enFilePath = await resolveResource("locales/en.json"); -const jaFilePath = await resolveResource("locales/ja.json"); +const currentLocale = (await locale()).slice(0, 2); -const enLocale = JSON.parse(await readTextFile(enFilePath)); -const jaLocale = JSON.parse(await readTextFile(jaFilePath)); - -const osLocale = (await locale()).slice(0, 2); - -const resources = { - en: { - translation: enLocale, - }, - ja: { - translation: jaLocale, - }, -}; - -i18n.use(initReactI18next).init({ - lng: osLocale, - fallbackLng: "en", - interpolation: { - escapeValue: false, - }, - resources, -}); +i18n + .use( + resourcesToBackend(async (language: string) => { + const file_path = await resolveResource(`locales/${language}.json`); + return JSON.parse(await readTextFile(file_path)); + }), + ) + .use(initReactI18next) + .init({ + lng: currentLocale, + fallbackLng: "en", + interpolation: { + escapeValue: false, + }, + }); export default i18n; diff --git a/apps/desktop/src/routes/auth/login-key.tsx b/apps/desktop/src/routes/auth/login-key.tsx index 7e90e3e8..7de52444 100644 --- a/apps/desktop/src/routes/auth/login-key.tsx +++ b/apps/desktop/src/routes/auth/login-key.tsx @@ -57,20 +57,19 @@ export function LoginWithKey() {

{t("loginWithPrivkey.title")}

- - Lume will put your private key to - - {storage.platform === "macos" - ? "Apple Keychain" - : storage.platform === "windows" - ? "Credential Manager" - : "Secret Service"} - - . It will be secured by your OS. - +

+ + Lume will put your private key to{" "} + + {storage.platform === "macos" + ? "Apple Keychain" + : storage.platform === "windows" + ? "Credential Manager" + : "Secret Service"} + + . It will be secured by your OS. + +

{t("login.loginWithPrivkey")} - - Lume will put your Private Key in{" "} - Secure Storage depended - on your OS Platform. It will be secured by Password or Biometric - ID - +

+ {t("login.footer")} +

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82d9d145..721cea0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,9 @@ importers: i18next: specifier: ^23.8.0 version: 23.8.0 + i18next-resources-to-backend: + specifier: ^1.2.0 + version: 1.2.0 jotai: specifier: ^2.6.3 version: 2.6.3(@types/react@18.2.48)(react@18.2.0) @@ -5221,6 +5224,12 @@ packages: engines: {node: '>=16.17.0'} dev: false + /i18next-resources-to-backend@1.2.0: + resolution: {integrity: sha512-8f1l03s+QxDmCfpSXCh9V+AFcxAwIp0UaroWuyOx+hmmv8484GcELHs+lnu54FrNij8cDBEXvEwhzZoXsKcVpg==} + dependencies: + '@babel/runtime': 7.23.9 + dev: false + /i18next@23.8.0: resolution: {integrity: sha512-1H+39doU9dQZrRprpnZ2aZetbX9I1N3bM/YGHN/ZkMJ//wJqrxDEqgI5mmSsh/rglsFBiNxI6UtFZfUO2A6XbA==} dependencies: diff --git a/src-tauri/locales/cn.json b/src-tauri/locales/cn.json new file mode 100644 index 00000000..e4f811c5 --- /dev/null +++ b/src-tauri/locales/cn.json @@ -0,0 +1,283 @@ +{ + "global": { + "relay": "Relay", + "back": "Back", + "continue": "Continue", + "loading": "Loading", + "error": "Error", + "moveLeft": "Move Left", + "moveRight": "Move Right", + "newColumn": "New Column", + "inspect": "Inspect", + "loadMore": "Load more", + "delete": "Delete", + "refresh": "Refresh", + "cancel": "Cancel", + "save": "Save", + "post": "Post", + "update": "Update", + "noResult": "No results found.", + "emptyFeedTitle": "This feed is empty", + "emptyFeedSubtitle": "You can follow more users to build up your timeline", + "apiKey": "API Key", + "skip": "Skip", + "close": "Close" + }, + "nip89": { + "unsupported": "Lume isn't support this event", + "openWith": "Open with" + }, + "note": { + "showThread": "Show thread", + "showMore": "Show more", + "error": "Failed to fetch event.", + "posted": "posted", + "replied": "replied", + "reposted": "reposted", + "menu": { + "viewThread": "View thread", + "copyLink": "Copy shareable link", + "copyNoteId": "Copy note ID", + "copyAuthorId": "Copy author ID", + "viewAuthor": "View author", + "pinAuthor": "Pin author", + "copyRaw": "Copy raw event", + "mute": "Mute" + }, + "buttons": { + "pin": "Pin", + "pinTooltip": "Pin Note", + "repost": "Repost", + "quote": "Quote", + "viewProfile": "View profile" + }, + "zap": { + "zap": "Zap", + "tooltip": "Send zap", + "modalTitle": "Send zap to", + "messagePlaceholder": "Enter message (optional)", + "buttonFinish": "Zapped", + "buttonLoading": "Processing...", + "invoiceButton": "Scan to zap", + "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..." + }, + "reply": { + "single": "reply", + "plural": "replies", + "empty": "Be the first to Reply!" + } + }, + "user": { + "avatar": "Avatar", + "displayName": "Display Name", + "name": "Name", + "bio": "Bio", + "lna": "Lightning address", + "website": "Website", + "verified": "Verified", + "unverified": "Unverified", + "follow": "Follow", + "unfollow": "Unfollow", + "latestPosts": "Latest posts", + "avatarButton": "Change avatar", + "coverButton": "Change cover", + "editProfile": "Edit profile", + "settings": "Settings", + "logout": "Log out", + "logoutConfirmTitle": "Are you sure!", + "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account." + }, + "editor": { + "title": "New Post", + "placeholder": "What are you up to?", + "successMessage": "Your note has been published successfully.", + "replyPlaceholder": "Post your reply" + }, + "search": { + "placeholder": "Type something to search...", + "empty": "Try searching for people, notes, or keywords" + }, + "welcome": { + "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.", + "signup": "Join Nostr", + "login": "Login", + "footer": "Before joining Nostr, you can take time to learn more about Nostr" + }, + "login": { + "title": "Welcome back, anon!", + "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", + "loginWithAddress": "Login with Nostr Address", + "loginWithBunker": "Login with nsecBunker", + "or": "Or continue with", + "loginWithPrivkey": "Login with Private Key" + }, + "loginWithAddress": { + "title": "Enter your Nostr Address" + }, + "loginWithBunker": { + "title": "Enter your nsecbunker token" + }, + "loginWithPrivkey": { + "title": "Enter your Private Key", + "subtitle": "Lume will put your private key to <1>{{service}}.\nIt will be secured by your OS." + }, + "signup": { + "title": "Let's Get Started", + "subtitle": "Choose one of methods below to create your account", + "selfManageMethod": "Self-Managed", + "selfManageMethodDescription": "You create your keys and keep them safe.", + "providerMethod": "Managed by Provider", + "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you." + }, + "signupWithSelfManage": { + "title": "This is your new Account Key", + "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.", + "confirm1": "I understand the risk of lost private key.", + "confirm2": "I will make sure keep it safe and not sharing with anyone.", + "confirm3": "I understand I cannot recover private key.", + "button": "Save key & Continue" + }, + "signupWithProvider": { + "title": "Let's set up your account on Nostr", + "username": "Username *", + "chooseProvider": "Choose a Provider", + "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account", + "email": "Backup Email (optional)", + "emailFooter": "Use for recover your account if you lose your password" + }, + "onboardingSettings": { + "title": "You're almost ready to use Lume.", + "subtitle": "Let's start personalizing your experience.", + "notification": { + "title": "Push notification", + "subtitle": "Enabling push notifications will allow you to receive notifications from Lume." + }, + "lowPower": { + "title": "Low Power Mode", + "subtitle": "Limited relay connection and hide all media, sustainable for low network environment." + }, + "translation": { + "title": "Translation (nostr.wine)", + "subtitle": "Translate text to your preferred language, powered by Nostr Wine." + }, + "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later." + }, + "relays": { + "global": "Global", + "follows": "Follows", + "sidebar": { + "title": "Connected relays", + "empty": "Empty." + }, + "relayView": { + "empty": "Could not load relay information 😬", + "owner": "Owner", + "contact": "Contact", + "software": "Software", + "nips": "Supported NIPs", + "limit": "Limitation", + "payment": "Open payment website", + "paymentNote": "You need to make a payment to connect this relay" + } + }, + "suggestion": { + "title": "Suggested Follows", + "error": "Error. Cannot get trending users", + "button": "Save & Go back" + }, + "interests": { + "title": "Interests", + "subtitle": "Pick things you'd like to see in your home feed.", + "edit": "Edit Interest", + "followAll": "Follow All", + "unfollowAll": "Unfollow All" + }, + "settings": { + "general": { + "title": "General", + "update": { + "title": "Update", + "subtitle": "Automatically download new update" + }, + "lowPower": { + "title": "Low Power", + "subtitle": "Sustainable for low network environment" + }, + "startup": { + "title": "Startup", + "subtitle": "Launch Lume at Login" + }, + "media": { + "title": "Media", + "subtitle": "Automatically load media" + }, + "hashtag": { + "title": "Hashtag", + "subtitle": "Show all hashtags in content" + }, + "notification": { + "title": "Notification", + "subtitle": "Automatically send notification" + }, + "translation": { + "title": "Translation", + "subtitle": "Translate text to your language" + }, + "appearance": { + "title": "Appearance", + "light": "Light", + "dark": "Dark", + "system": "System" + } + }, + "user": { + "title": "User" + }, + "zap": { + "title": "Zap", + "nwc": "Connection String" + }, + "backup": { + "title": "Backup", + "privkey": { + "title": "Private key", + "button": "Remove private key" + } + }, + "advanced": { + "title": "Advanced", + "cache": { + "title": "Cache", + "subtitle": "Use for boost up nostr connection", + "button": "Clear" + }, + "instant": { + "title": "Instant Zap", + "subtitle": "Zap with default amount, no confirmation" + }, + "defaultAmount": "Default amount" + }, + "about": { + "title": "About", + "version": "Version", + "checkUpdate": "Check for update", + "installUpdate": "Install" + } + }, + "onboarding": { + "home": { + "title": "Your account was successfully created!", + "subtitle": "For starters, let's set up your profile.", + "profileSettings": "Profile Settings" + }, + "profile": { + "title": "About you", + "subtitle": "Tell Lume about yourself to start building your home feed." + }, + "finish": { + "title": "Profile setup complete!", + "subtitle": "You can exit the setup here and start using Lume.", + "report": "Report a issue" + } + } +} diff --git a/src-tauri/locales/en.json b/src-tauri/locales/en.json index 3483fad9..e4f811c5 100644 --- a/src-tauri/locales/en.json +++ b/src-tauri/locales/en.json @@ -105,7 +105,7 @@ }, "login": { "title": "Welcome back, anon!", - "footer": "Lume will put your Private Key in <1>Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", + "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", "loginWithAddress": "Login with Nostr Address", "loginWithBunker": "Login with nsecBunker", "or": "Or continue with", diff --git a/src-tauri/locales/ja.json b/src-tauri/locales/ja.json index 1ab7f45d..e4f811c5 100644 --- a/src-tauri/locales/ja.json +++ b/src-tauri/locales/ja.json @@ -1,3 +1,283 @@ { - "title": "γ“γ‚“γ«γ‘γ―δΈ–η•Œ" + "global": { + "relay": "Relay", + "back": "Back", + "continue": "Continue", + "loading": "Loading", + "error": "Error", + "moveLeft": "Move Left", + "moveRight": "Move Right", + "newColumn": "New Column", + "inspect": "Inspect", + "loadMore": "Load more", + "delete": "Delete", + "refresh": "Refresh", + "cancel": "Cancel", + "save": "Save", + "post": "Post", + "update": "Update", + "noResult": "No results found.", + "emptyFeedTitle": "This feed is empty", + "emptyFeedSubtitle": "You can follow more users to build up your timeline", + "apiKey": "API Key", + "skip": "Skip", + "close": "Close" + }, + "nip89": { + "unsupported": "Lume isn't support this event", + "openWith": "Open with" + }, + "note": { + "showThread": "Show thread", + "showMore": "Show more", + "error": "Failed to fetch event.", + "posted": "posted", + "replied": "replied", + "reposted": "reposted", + "menu": { + "viewThread": "View thread", + "copyLink": "Copy shareable link", + "copyNoteId": "Copy note ID", + "copyAuthorId": "Copy author ID", + "viewAuthor": "View author", + "pinAuthor": "Pin author", + "copyRaw": "Copy raw event", + "mute": "Mute" + }, + "buttons": { + "pin": "Pin", + "pinTooltip": "Pin Note", + "repost": "Repost", + "quote": "Quote", + "viewProfile": "View profile" + }, + "zap": { + "zap": "Zap", + "tooltip": "Send zap", + "modalTitle": "Send zap to", + "messagePlaceholder": "Enter message (optional)", + "buttonFinish": "Zapped", + "buttonLoading": "Processing...", + "invoiceButton": "Scan to zap", + "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..." + }, + "reply": { + "single": "reply", + "plural": "replies", + "empty": "Be the first to Reply!" + } + }, + "user": { + "avatar": "Avatar", + "displayName": "Display Name", + "name": "Name", + "bio": "Bio", + "lna": "Lightning address", + "website": "Website", + "verified": "Verified", + "unverified": "Unverified", + "follow": "Follow", + "unfollow": "Unfollow", + "latestPosts": "Latest posts", + "avatarButton": "Change avatar", + "coverButton": "Change cover", + "editProfile": "Edit profile", + "settings": "Settings", + "logout": "Log out", + "logoutConfirmTitle": "Are you sure!", + "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account." + }, + "editor": { + "title": "New Post", + "placeholder": "What are you up to?", + "successMessage": "Your note has been published successfully.", + "replyPlaceholder": "Post your reply" + }, + "search": { + "placeholder": "Type something to search...", + "empty": "Try searching for people, notes, or keywords" + }, + "welcome": { + "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.", + "signup": "Join Nostr", + "login": "Login", + "footer": "Before joining Nostr, you can take time to learn more about Nostr" + }, + "login": { + "title": "Welcome back, anon!", + "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", + "loginWithAddress": "Login with Nostr Address", + "loginWithBunker": "Login with nsecBunker", + "or": "Or continue with", + "loginWithPrivkey": "Login with Private Key" + }, + "loginWithAddress": { + "title": "Enter your Nostr Address" + }, + "loginWithBunker": { + "title": "Enter your nsecbunker token" + }, + "loginWithPrivkey": { + "title": "Enter your Private Key", + "subtitle": "Lume will put your private key to <1>{{service}}.\nIt will be secured by your OS." + }, + "signup": { + "title": "Let's Get Started", + "subtitle": "Choose one of methods below to create your account", + "selfManageMethod": "Self-Managed", + "selfManageMethodDescription": "You create your keys and keep them safe.", + "providerMethod": "Managed by Provider", + "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you." + }, + "signupWithSelfManage": { + "title": "This is your new Account Key", + "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.", + "confirm1": "I understand the risk of lost private key.", + "confirm2": "I will make sure keep it safe and not sharing with anyone.", + "confirm3": "I understand I cannot recover private key.", + "button": "Save key & Continue" + }, + "signupWithProvider": { + "title": "Let's set up your account on Nostr", + "username": "Username *", + "chooseProvider": "Choose a Provider", + "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account", + "email": "Backup Email (optional)", + "emailFooter": "Use for recover your account if you lose your password" + }, + "onboardingSettings": { + "title": "You're almost ready to use Lume.", + "subtitle": "Let's start personalizing your experience.", + "notification": { + "title": "Push notification", + "subtitle": "Enabling push notifications will allow you to receive notifications from Lume." + }, + "lowPower": { + "title": "Low Power Mode", + "subtitle": "Limited relay connection and hide all media, sustainable for low network environment." + }, + "translation": { + "title": "Translation (nostr.wine)", + "subtitle": "Translate text to your preferred language, powered by Nostr Wine." + }, + "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later." + }, + "relays": { + "global": "Global", + "follows": "Follows", + "sidebar": { + "title": "Connected relays", + "empty": "Empty." + }, + "relayView": { + "empty": "Could not load relay information 😬", + "owner": "Owner", + "contact": "Contact", + "software": "Software", + "nips": "Supported NIPs", + "limit": "Limitation", + "payment": "Open payment website", + "paymentNote": "You need to make a payment to connect this relay" + } + }, + "suggestion": { + "title": "Suggested Follows", + "error": "Error. Cannot get trending users", + "button": "Save & Go back" + }, + "interests": { + "title": "Interests", + "subtitle": "Pick things you'd like to see in your home feed.", + "edit": "Edit Interest", + "followAll": "Follow All", + "unfollowAll": "Unfollow All" + }, + "settings": { + "general": { + "title": "General", + "update": { + "title": "Update", + "subtitle": "Automatically download new update" + }, + "lowPower": { + "title": "Low Power", + "subtitle": "Sustainable for low network environment" + }, + "startup": { + "title": "Startup", + "subtitle": "Launch Lume at Login" + }, + "media": { + "title": "Media", + "subtitle": "Automatically load media" + }, + "hashtag": { + "title": "Hashtag", + "subtitle": "Show all hashtags in content" + }, + "notification": { + "title": "Notification", + "subtitle": "Automatically send notification" + }, + "translation": { + "title": "Translation", + "subtitle": "Translate text to your language" + }, + "appearance": { + "title": "Appearance", + "light": "Light", + "dark": "Dark", + "system": "System" + } + }, + "user": { + "title": "User" + }, + "zap": { + "title": "Zap", + "nwc": "Connection String" + }, + "backup": { + "title": "Backup", + "privkey": { + "title": "Private key", + "button": "Remove private key" + } + }, + "advanced": { + "title": "Advanced", + "cache": { + "title": "Cache", + "subtitle": "Use for boost up nostr connection", + "button": "Clear" + }, + "instant": { + "title": "Instant Zap", + "subtitle": "Zap with default amount, no confirmation" + }, + "defaultAmount": "Default amount" + }, + "about": { + "title": "About", + "version": "Version", + "checkUpdate": "Check for update", + "installUpdate": "Install" + } + }, + "onboarding": { + "home": { + "title": "Your account was successfully created!", + "subtitle": "For starters, let's set up your profile.", + "profileSettings": "Profile Settings" + }, + "profile": { + "title": "About you", + "subtitle": "Tell Lume about yourself to start building your home feed." + }, + "finish": { + "title": "Profile setup complete!", + "subtitle": "You can exit the setup here and start using Lume.", + "report": "Report a issue" + } + } } diff --git a/src-tauri/locales/ru.json b/src-tauri/locales/ru.json new file mode 100644 index 00000000..e4f811c5 --- /dev/null +++ b/src-tauri/locales/ru.json @@ -0,0 +1,283 @@ +{ + "global": { + "relay": "Relay", + "back": "Back", + "continue": "Continue", + "loading": "Loading", + "error": "Error", + "moveLeft": "Move Left", + "moveRight": "Move Right", + "newColumn": "New Column", + "inspect": "Inspect", + "loadMore": "Load more", + "delete": "Delete", + "refresh": "Refresh", + "cancel": "Cancel", + "save": "Save", + "post": "Post", + "update": "Update", + "noResult": "No results found.", + "emptyFeedTitle": "This feed is empty", + "emptyFeedSubtitle": "You can follow more users to build up your timeline", + "apiKey": "API Key", + "skip": "Skip", + "close": "Close" + }, + "nip89": { + "unsupported": "Lume isn't support this event", + "openWith": "Open with" + }, + "note": { + "showThread": "Show thread", + "showMore": "Show more", + "error": "Failed to fetch event.", + "posted": "posted", + "replied": "replied", + "reposted": "reposted", + "menu": { + "viewThread": "View thread", + "copyLink": "Copy shareable link", + "copyNoteId": "Copy note ID", + "copyAuthorId": "Copy author ID", + "viewAuthor": "View author", + "pinAuthor": "Pin author", + "copyRaw": "Copy raw event", + "mute": "Mute" + }, + "buttons": { + "pin": "Pin", + "pinTooltip": "Pin Note", + "repost": "Repost", + "quote": "Quote", + "viewProfile": "View profile" + }, + "zap": { + "zap": "Zap", + "tooltip": "Send zap", + "modalTitle": "Send zap to", + "messagePlaceholder": "Enter message (optional)", + "buttonFinish": "Zapped", + "buttonLoading": "Processing...", + "invoiceButton": "Scan to zap", + "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..." + }, + "reply": { + "single": "reply", + "plural": "replies", + "empty": "Be the first to Reply!" + } + }, + "user": { + "avatar": "Avatar", + "displayName": "Display Name", + "name": "Name", + "bio": "Bio", + "lna": "Lightning address", + "website": "Website", + "verified": "Verified", + "unverified": "Unverified", + "follow": "Follow", + "unfollow": "Unfollow", + "latestPosts": "Latest posts", + "avatarButton": "Change avatar", + "coverButton": "Change cover", + "editProfile": "Edit profile", + "settings": "Settings", + "logout": "Log out", + "logoutConfirmTitle": "Are you sure!", + "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account." + }, + "editor": { + "title": "New Post", + "placeholder": "What are you up to?", + "successMessage": "Your note has been published successfully.", + "replyPlaceholder": "Post your reply" + }, + "search": { + "placeholder": "Type something to search...", + "empty": "Try searching for people, notes, or keywords" + }, + "welcome": { + "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.", + "signup": "Join Nostr", + "login": "Login", + "footer": "Before joining Nostr, you can take time to learn more about Nostr" + }, + "login": { + "title": "Welcome back, anon!", + "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", + "loginWithAddress": "Login with Nostr Address", + "loginWithBunker": "Login with nsecBunker", + "or": "Or continue with", + "loginWithPrivkey": "Login with Private Key" + }, + "loginWithAddress": { + "title": "Enter your Nostr Address" + }, + "loginWithBunker": { + "title": "Enter your nsecbunker token" + }, + "loginWithPrivkey": { + "title": "Enter your Private Key", + "subtitle": "Lume will put your private key to <1>{{service}}.\nIt will be secured by your OS." + }, + "signup": { + "title": "Let's Get Started", + "subtitle": "Choose one of methods below to create your account", + "selfManageMethod": "Self-Managed", + "selfManageMethodDescription": "You create your keys and keep them safe.", + "providerMethod": "Managed by Provider", + "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you." + }, + "signupWithSelfManage": { + "title": "This is your new Account Key", + "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.", + "confirm1": "I understand the risk of lost private key.", + "confirm2": "I will make sure keep it safe and not sharing with anyone.", + "confirm3": "I understand I cannot recover private key.", + "button": "Save key & Continue" + }, + "signupWithProvider": { + "title": "Let's set up your account on Nostr", + "username": "Username *", + "chooseProvider": "Choose a Provider", + "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account", + "email": "Backup Email (optional)", + "emailFooter": "Use for recover your account if you lose your password" + }, + "onboardingSettings": { + "title": "You're almost ready to use Lume.", + "subtitle": "Let's start personalizing your experience.", + "notification": { + "title": "Push notification", + "subtitle": "Enabling push notifications will allow you to receive notifications from Lume." + }, + "lowPower": { + "title": "Low Power Mode", + "subtitle": "Limited relay connection and hide all media, sustainable for low network environment." + }, + "translation": { + "title": "Translation (nostr.wine)", + "subtitle": "Translate text to your preferred language, powered by Nostr Wine." + }, + "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later." + }, + "relays": { + "global": "Global", + "follows": "Follows", + "sidebar": { + "title": "Connected relays", + "empty": "Empty." + }, + "relayView": { + "empty": "Could not load relay information 😬", + "owner": "Owner", + "contact": "Contact", + "software": "Software", + "nips": "Supported NIPs", + "limit": "Limitation", + "payment": "Open payment website", + "paymentNote": "You need to make a payment to connect this relay" + } + }, + "suggestion": { + "title": "Suggested Follows", + "error": "Error. Cannot get trending users", + "button": "Save & Go back" + }, + "interests": { + "title": "Interests", + "subtitle": "Pick things you'd like to see in your home feed.", + "edit": "Edit Interest", + "followAll": "Follow All", + "unfollowAll": "Unfollow All" + }, + "settings": { + "general": { + "title": "General", + "update": { + "title": "Update", + "subtitle": "Automatically download new update" + }, + "lowPower": { + "title": "Low Power", + "subtitle": "Sustainable for low network environment" + }, + "startup": { + "title": "Startup", + "subtitle": "Launch Lume at Login" + }, + "media": { + "title": "Media", + "subtitle": "Automatically load media" + }, + "hashtag": { + "title": "Hashtag", + "subtitle": "Show all hashtags in content" + }, + "notification": { + "title": "Notification", + "subtitle": "Automatically send notification" + }, + "translation": { + "title": "Translation", + "subtitle": "Translate text to your language" + }, + "appearance": { + "title": "Appearance", + "light": "Light", + "dark": "Dark", + "system": "System" + } + }, + "user": { + "title": "User" + }, + "zap": { + "title": "Zap", + "nwc": "Connection String" + }, + "backup": { + "title": "Backup", + "privkey": { + "title": "Private key", + "button": "Remove private key" + } + }, + "advanced": { + "title": "Advanced", + "cache": { + "title": "Cache", + "subtitle": "Use for boost up nostr connection", + "button": "Clear" + }, + "instant": { + "title": "Instant Zap", + "subtitle": "Zap with default amount, no confirmation" + }, + "defaultAmount": "Default amount" + }, + "about": { + "title": "About", + "version": "Version", + "checkUpdate": "Check for update", + "installUpdate": "Install" + } + }, + "onboarding": { + "home": { + "title": "Your account was successfully created!", + "subtitle": "For starters, let's set up your profile.", + "profileSettings": "Profile Settings" + }, + "profile": { + "title": "About you", + "subtitle": "Tell Lume about yourself to start building your home feed." + }, + "finish": { + "title": "Profile setup complete!", + "subtitle": "You can exit the setup here and start using Lume.", + "report": "Report a issue" + } + } +} diff --git a/src-tauri/locales/vi.json b/src-tauri/locales/vi.json new file mode 100644 index 00000000..e4f811c5 --- /dev/null +++ b/src-tauri/locales/vi.json @@ -0,0 +1,283 @@ +{ + "global": { + "relay": "Relay", + "back": "Back", + "continue": "Continue", + "loading": "Loading", + "error": "Error", + "moveLeft": "Move Left", + "moveRight": "Move Right", + "newColumn": "New Column", + "inspect": "Inspect", + "loadMore": "Load more", + "delete": "Delete", + "refresh": "Refresh", + "cancel": "Cancel", + "save": "Save", + "post": "Post", + "update": "Update", + "noResult": "No results found.", + "emptyFeedTitle": "This feed is empty", + "emptyFeedSubtitle": "You can follow more users to build up your timeline", + "apiKey": "API Key", + "skip": "Skip", + "close": "Close" + }, + "nip89": { + "unsupported": "Lume isn't support this event", + "openWith": "Open with" + }, + "note": { + "showThread": "Show thread", + "showMore": "Show more", + "error": "Failed to fetch event.", + "posted": "posted", + "replied": "replied", + "reposted": "reposted", + "menu": { + "viewThread": "View thread", + "copyLink": "Copy shareable link", + "copyNoteId": "Copy note ID", + "copyAuthorId": "Copy author ID", + "viewAuthor": "View author", + "pinAuthor": "Pin author", + "copyRaw": "Copy raw event", + "mute": "Mute" + }, + "buttons": { + "pin": "Pin", + "pinTooltip": "Pin Note", + "repost": "Repost", + "quote": "Quote", + "viewProfile": "View profile" + }, + "zap": { + "zap": "Zap", + "tooltip": "Send zap", + "modalTitle": "Send zap to", + "messagePlaceholder": "Enter message (optional)", + "buttonFinish": "Zapped", + "buttonLoading": "Processing...", + "invoiceButton": "Scan to zap", + "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..." + }, + "reply": { + "single": "reply", + "plural": "replies", + "empty": "Be the first to Reply!" + } + }, + "user": { + "avatar": "Avatar", + "displayName": "Display Name", + "name": "Name", + "bio": "Bio", + "lna": "Lightning address", + "website": "Website", + "verified": "Verified", + "unverified": "Unverified", + "follow": "Follow", + "unfollow": "Unfollow", + "latestPosts": "Latest posts", + "avatarButton": "Change avatar", + "coverButton": "Change cover", + "editProfile": "Edit profile", + "settings": "Settings", + "logout": "Log out", + "logoutConfirmTitle": "Are you sure!", + "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account." + }, + "editor": { + "title": "New Post", + "placeholder": "What are you up to?", + "successMessage": "Your note has been published successfully.", + "replyPlaceholder": "Post your reply" + }, + "search": { + "placeholder": "Type something to search...", + "empty": "Try searching for people, notes, or keywords" + }, + "welcome": { + "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.", + "signup": "Join Nostr", + "login": "Login", + "footer": "Before joining Nostr, you can take time to learn more about Nostr" + }, + "login": { + "title": "Welcome back, anon!", + "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", + "loginWithAddress": "Login with Nostr Address", + "loginWithBunker": "Login with nsecBunker", + "or": "Or continue with", + "loginWithPrivkey": "Login with Private Key" + }, + "loginWithAddress": { + "title": "Enter your Nostr Address" + }, + "loginWithBunker": { + "title": "Enter your nsecbunker token" + }, + "loginWithPrivkey": { + "title": "Enter your Private Key", + "subtitle": "Lume will put your private key to <1>{{service}}.\nIt will be secured by your OS." + }, + "signup": { + "title": "Let's Get Started", + "subtitle": "Choose one of methods below to create your account", + "selfManageMethod": "Self-Managed", + "selfManageMethodDescription": "You create your keys and keep them safe.", + "providerMethod": "Managed by Provider", + "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you." + }, + "signupWithSelfManage": { + "title": "This is your new Account Key", + "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.", + "confirm1": "I understand the risk of lost private key.", + "confirm2": "I will make sure keep it safe and not sharing with anyone.", + "confirm3": "I understand I cannot recover private key.", + "button": "Save key & Continue" + }, + "signupWithProvider": { + "title": "Let's set up your account on Nostr", + "username": "Username *", + "chooseProvider": "Choose a Provider", + "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account", + "email": "Backup Email (optional)", + "emailFooter": "Use for recover your account if you lose your password" + }, + "onboardingSettings": { + "title": "You're almost ready to use Lume.", + "subtitle": "Let's start personalizing your experience.", + "notification": { + "title": "Push notification", + "subtitle": "Enabling push notifications will allow you to receive notifications from Lume." + }, + "lowPower": { + "title": "Low Power Mode", + "subtitle": "Limited relay connection and hide all media, sustainable for low network environment." + }, + "translation": { + "title": "Translation (nostr.wine)", + "subtitle": "Translate text to your preferred language, powered by Nostr Wine." + }, + "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later." + }, + "relays": { + "global": "Global", + "follows": "Follows", + "sidebar": { + "title": "Connected relays", + "empty": "Empty." + }, + "relayView": { + "empty": "Could not load relay information 😬", + "owner": "Owner", + "contact": "Contact", + "software": "Software", + "nips": "Supported NIPs", + "limit": "Limitation", + "payment": "Open payment website", + "paymentNote": "You need to make a payment to connect this relay" + } + }, + "suggestion": { + "title": "Suggested Follows", + "error": "Error. Cannot get trending users", + "button": "Save & Go back" + }, + "interests": { + "title": "Interests", + "subtitle": "Pick things you'd like to see in your home feed.", + "edit": "Edit Interest", + "followAll": "Follow All", + "unfollowAll": "Unfollow All" + }, + "settings": { + "general": { + "title": "General", + "update": { + "title": "Update", + "subtitle": "Automatically download new update" + }, + "lowPower": { + "title": "Low Power", + "subtitle": "Sustainable for low network environment" + }, + "startup": { + "title": "Startup", + "subtitle": "Launch Lume at Login" + }, + "media": { + "title": "Media", + "subtitle": "Automatically load media" + }, + "hashtag": { + "title": "Hashtag", + "subtitle": "Show all hashtags in content" + }, + "notification": { + "title": "Notification", + "subtitle": "Automatically send notification" + }, + "translation": { + "title": "Translation", + "subtitle": "Translate text to your language" + }, + "appearance": { + "title": "Appearance", + "light": "Light", + "dark": "Dark", + "system": "System" + } + }, + "user": { + "title": "User" + }, + "zap": { + "title": "Zap", + "nwc": "Connection String" + }, + "backup": { + "title": "Backup", + "privkey": { + "title": "Private key", + "button": "Remove private key" + } + }, + "advanced": { + "title": "Advanced", + "cache": { + "title": "Cache", + "subtitle": "Use for boost up nostr connection", + "button": "Clear" + }, + "instant": { + "title": "Instant Zap", + "subtitle": "Zap with default amount, no confirmation" + }, + "defaultAmount": "Default amount" + }, + "about": { + "title": "About", + "version": "Version", + "checkUpdate": "Check for update", + "installUpdate": "Install" + } + }, + "onboarding": { + "home": { + "title": "Your account was successfully created!", + "subtitle": "For starters, let's set up your profile.", + "profileSettings": "Profile Settings" + }, + "profile": { + "title": "About you", + "subtitle": "Tell Lume about yourself to start building your home feed." + }, + "finish": { + "title": "Profile setup complete!", + "subtitle": "You can exit the setup here and start using Lume.", + "report": "Report a issue" + } + } +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 7aa50cfa..3b5c8f66 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -26,7 +26,8 @@ "$VIDEO/*", "$RESOURCE", "$RESOURCE/*", - "$RESOURCE/**" + "$RESOURCE/**", + "$RESOURCE/locales/*" ] }, "http": {