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.
+
+
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}}1>.\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 Storage1> 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}}1>.\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}}1>.\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}}1>.\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": {