diff --git a/package.json b/package.json index 1b3261f..9774a35 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "build": "react-app-rewired build", "test": "react-app-rewired test", "eject": "react-scripts eject", - "generate-messages": "extract-messages -l=en,es,zh,ja,fr -o src/translations -d en --flat true **/messages.js", + "generate-messages": "formatjs extract **/messages.ts **/*.ts* --ignore='**/*.d.ts' --out-file src/lang.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' --format transifex --flatten true", "format": "prettier --write .", "eslint": "eslint .", "prepare": "husky install" @@ -79,6 +79,7 @@ ] }, "devDependencies": { + "@formatjs/cli": "^6.0.1", "babel-plugin-react-intl-auto": "^3.3.0", "customize-cra": "^1.0.0", "extract-react-intl-messages": "^4.1.1", diff --git a/src/Element/messages.js b/src/Element/messages.js deleted file mode 100644 index 8580425..0000000 --- a/src/Element/messages.js +++ /dev/null @@ -1,94 +0,0 @@ -import { defineMessages } from "react-intl"; - -export default defineMessages({ - Cancel: "Cancel", - Reply: "Reply", - Send: "Send", - NotePlaceholder: "What's on your mind?", - Back: "Back", - Block: "Block", - Unblock: "Unblock", - MuteCount: "{n} muted", - Mute: "Mute", - MutedAuthor: "This author has been muted", - Others: ` & {n} {n, plural, =1 {other} other {others}}`, - Show: "Show", - Delete: "Delete", - Deleted: "Deleted", - Unmute: "Unmute", - MuteAll: "Mute all", - BlockCount: "{n} blocked", - JustNow: "Just now", - Follow: "Follow", - FollowAll: "Follow all", - Unfollow: "Unfollow", - FollowerCount: "{n} followers", - FollowingCount: "Follows {n}", - FollowsYou: "follows you", - Invoice: "Lightning Invoice", - PayInvoice: "Pay Invoice", - Expired: "Expired", - Pay: "Pay", - Paid: "Paid", - Loading: "Loading...", - Logout: "Logout", - ShowMore: "Show more", - TranslateTo: "Translate to {lang}", - TranslatedFrom: "Translated from {lang}", - TranslationFailed: "Translation failed", - UnknownEventKind: "Unknown event kind: {kind}", - ConfirmDeletion: `Are you sure you want to delete {id}`, - ConfirmRepost: `Are you sure you want to repost: {id}`, - Reactions: "Reactions", - ReactionsCount: "Reactions ({n})", - Share: "Share", - CopyID: "Copy ID", - CopyJSON: "Copy Event JSON", - Dislike: "{n} Dislike", - DislikeAction: "Dislike", - Sats: `{n} {n, plural, =1 {sat} other {sats}}`, - Zapped: "zapped", - OthersZapped: `{n, plural, =0 {} =1 {zapped} other {zapped}}`, - Likes: "Likes ({n})", - Zaps: "Zaps ({n})", - Dislikes: "Dislikes ({n})", - Reposts: "Reposts ({n})", - NoteToSelf: "Note to Self", - Read: "Read", - Write: "Write", - Seconds: "{n} secs", - Milliseconds: "{n} ms", - ShowLatest: "Show latest {n} notes", - LNURLFail: "Failed to load LNURL service", - InvoiceFail: "Failed to load invoice", - Custom: "Custom", - Confirm: "Confirm", - ZapAmount: "Zap amount in sats", - Comment: "Comment", - ZapTarget: "Zap {target} {n} sats", - ZapSats: "Zap {n} sats", - OpenWallet: "Open Wallet", - SendZap: "Send zap", - SendSats: "Send sats", - ToTarget: "{action} to {target}", - ShowReplies: "Show replies", - TooShort: "name too short", - TooLong: "name too long", - Regex: "name has disallowed characters", - Registered: "name is registered", - Disallowed: "name is blocked", - DisalledLater: "name will be available later", - BuyNow: "Buy Now", - NotAvailable: "Not available:", - Buying: "Buying {item}", - OrderPaid: "Order Paid!", - NewNip: "Your new NIP-05 handle is:", - ActivateNow: "Activate Now", - AddToProfile: "Add to Profile", - AccountPage: "account page", - AccountSupport: "Account Support", - GoTo: "Go to", - FindMore: "Find out more info about {service} at {link}", - SavePassword: "Please make sure to save the following password in order to manage your handle in the future", - Handle: "Handle", -}); diff --git a/src/Element/messages.ts b/src/Element/messages.ts new file mode 100644 index 0000000..852552b --- /dev/null +++ b/src/Element/messages.ts @@ -0,0 +1,96 @@ +import { defineMessages } from "react-intl"; + +export default defineMessages({ + Cancel: { defaultMessage: "Cancel" }, + Reply: { defaultMessage: "Reply" }, + Send: { defaultMessage: "Send" }, + NotePlaceholder: { defaultMessage: "What's on your mind?" }, + Back: { defaultMessage: "Back" }, + Block: { defaultMessage: "Block" }, + Unblock: { defaultMessage: "Unblock" }, + MuteCount: { defaultMessage: "{n} muted" }, + Mute: { defaultMessage: "Mute" }, + MutedAuthor: { defaultMessage: "This author has been muted" }, + Others: { defaultMessage: ` & {n} {n, plural, =1 {other} other {others}}` }, + Show: { defaultMessage: "Show" }, + Delete: { defaultMessage: "Delete" }, + Deleted: { defaultMessage: "Deleted" }, + Unmute: { defaultMessage: "Unmute" }, + MuteAll: { defaultMessage: "Mute all" }, + BlockCount: { defaultMessage: "{n} blocked" }, + JustNow: { defaultMessage: "Just now" }, + Follow: { defaultMessage: "Follow" }, + FollowAll: { defaultMessage: "Follow all" }, + Unfollow: { defaultMessage: "Unfollow" }, + FollowerCount: { defaultMessage: "{n} followers" }, + FollowingCount: { defaultMessage: "Follows {n}" }, + FollowsYou: { defaultMessage: "follows you" }, + Invoice: { defaultMessage: "Lightning Invoice" }, + PayInvoice: { defaultMessage: "Pay Invoice" }, + Expired: { defaultMessage: "Expired" }, + Pay: { defaultMessage: "Pay" }, + Paid: { defaultMessage: "Paid" }, + Loading: { defaultMessage: "Loading..." }, + Logout: { defaultMessage: "Logout" }, + ShowMore: { defaultMessage: "Show more" }, + TranslateTo: { defaultMessage: "Translate to {lang}" }, + TranslatedFrom: { defaultMessage: "Translated from {lang}" }, + TranslationFailed: { defaultMessage: "Translation failed" }, + UnknownEventKind: { defaultMessage: "Unknown event kind: {kind}" }, + ConfirmDeletion: { defaultMessage: `Are you sure you want to delete {id}` }, + ConfirmRepost: { defaultMessage: `Are you sure you want to repost: {id}` }, + Reactions: { defaultMessage: "Reactions" }, + ReactionsCount: { defaultMessage: "Reactions ({n})" }, + Share: { defaultMessage: "Share" }, + CopyID: { defaultMessage: "Copy ID" }, + CopyJSON: { defaultMessage: "Copy Event JSON" }, + Dislike: { defaultMessage: "{n} Dislike" }, + DislikeAction: { defaultMessage: "Dislike" }, + Sats: { defaultMessage: `{n} {n, plural, =1 {sat} other {sats}}` }, + Zapped: { defaultMessage: "zapped" }, + OthersZapped: { defaultMessage: `{n, plural, =0 {} =1 {zapped} other {zapped}}` }, + Likes: { defaultMessage: "Likes ({n})" }, + Zaps: { defaultMessage: "Zaps ({n})" }, + Dislikes: { defaultMessage: "Dislikes ({n})" }, + Reposts: { defaultMessage: "Reposts ({n})" }, + NoteToSelf: { defaultMessage: "Note to Self" }, + Read: { defaultMessage: "Read" }, + Write: { defaultMessage: "Write" }, + Seconds: { defaultMessage: "{n} secs" }, + Milliseconds: { defaultMessage: "{n} ms" }, + ShowLatest: { defaultMessage: "Show latest {n} notes" }, + LNURLFail: { defaultMessage: "Failed to load LNURL service" }, + InvoiceFail: { defaultMessage: "Failed to load invoice" }, + Custom: { defaultMessage: "Custom" }, + Confirm: { defaultMessage: "Confirm" }, + ZapAmount: { defaultMessage: "Zap amount in sats" }, + Comment: { defaultMessage: "Comment" }, + ZapTarget: { defaultMessage: "Zap {target} {n} sats" }, + ZapSats: { defaultMessage: "Zap {n} sats" }, + OpenWallet: { defaultMessage: "Open Wallet" }, + SendZap: { defaultMessage: "Send zap" }, + SendSats: { defaultMessage: "Send sats" }, + ToTarget: { defaultMessage: "{action} to {target}" }, + ShowReplies: { defaultMessage: "Show replies" }, + TooShort: { defaultMessage: "name too short" }, + TooLong: { defaultMessage: "name too long" }, + Regex: { defaultMessage: "name has disallowed characters" }, + Registered: { defaultMessage: "name is registered" }, + Disallowed: { defaultMessage: "name is blocked" }, + DisalledLater: { defaultMessage: "name will be available later" }, + BuyNow: { defaultMessage: "Buy Now" }, + NotAvailable: { defaultMessage: "Not available:" }, + Buying: { defaultMessage: "Buying {item}" }, + OrderPaid: { defaultMessage: "Order Paid!" }, + NewNip: { defaultMessage: "Your new NIP-05 handle is:" }, + ActivateNow: { defaultMessage: "Activate Now" }, + AddToProfile: { defaultMessage: "Add to Profile" }, + AccountPage: { defaultMessage: "account page" }, + AccountSupport: { defaultMessage: "Account Support" }, + GoTo: { defaultMessage: "Go to" }, + FindMore: { defaultMessage: "Find out more info about {service} at {link}" }, + SavePassword: { + defaultMessage: "Please make sure to save the following password in order to manage your handle in the future", + }, + Handle: { defaultMessage: "Handle" }, +}); diff --git a/src/Pages/messages.js b/src/Pages/messages.js deleted file mode 100644 index 7b59c33..0000000 --- a/src/Pages/messages.js +++ /dev/null @@ -1,32 +0,0 @@ -import { defineMessages } from "react-intl"; - -export default defineMessages({ - Login: "Login", - Posts: "Posts", - Conversations: "Conversations", - Global: "Global", - NewUsers: "New users page", - NoFollows: "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!", - Notes: "Notes", - Reactions: "Reactions", - Followers: "Followers", - Follows: "Follows", - Zaps: "Zaps", - Muted: "Muted", - Blocked: "Blocked", - Sats: "{n} {n, plural, =1 {sat} other {sats}}", - Following: "Following {n}", - Settings: "Settings", - Search: "Search", - SearchPlaceholder: "Search...", - Messages: "Messages", - MarkAllRead: "Mark All Read", - GetVerified: "Get Verified", - Nip05: `NIP-05 is a DNS based verification spec which helps to validate you as a real user.`, - Nip05Pros: `Getting NIP-05 verified can help:`, - AvoidImpersonators: "Prevent fake accounts from imitating you", - EasierToFind: "Make your profile easier to find and share", - Funding: "Fund developers and platforms providing NIP-05 verification services", - SnortSocialNip: `Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!`, - NostrPlebsNip: `Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices`, -}); diff --git a/src/Pages/messages.ts b/src/Pages/messages.ts new file mode 100644 index 0000000..8510cf8 --- /dev/null +++ b/src/Pages/messages.ts @@ -0,0 +1,36 @@ +import { defineMessages } from "react-intl"; + +export default defineMessages({ + Login: { defaultMessage: "Login" }, + Posts: { defaultMessage: "Posts" }, + Conversations: { defaultMessage: "Conversations" }, + Global: { defaultMessage: "Global" }, + NewUsers: { defaultMessage: "New users page" }, + NoFollows: { defaultMessage: "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!" }, + Notes: { defaultMessage: "Notes" }, + Reactions: { defaultMessage: "Reactions" }, + Followers: { defaultMessage: "Followers" }, + Follows: { defaultMessage: "Follows" }, + Zaps: { defaultMessage: "Zaps" }, + Muted: { defaultMessage: "Muted" }, + Blocked: { defaultMessage: "Blocked" }, + Sats: { defaultMessage: "{n} {n, plural, =1 {sat} other {sats}}" }, + Following: { defaultMessage: "Following {n}" }, + Settings: { defaultMessage: "Settings" }, + Search: { defaultMessage: "Search" }, + SearchPlaceholder: { defaultMessage: "Search..." }, + Messages: { defaultMessage: "Messages" }, + MarkAllRead: { defaultMessage: "Mark All Read" }, + GetVerified: { defaultMessage: "Get Verified" }, + Nip05: { defaultMessage: `NIP-05 is a DNS based verification spec which helps to validate you as a real user.` }, + Nip05Pros: { defaultMessage: `Getting NIP-05 verified can help:` }, + AvoidImpersonators: { defaultMessage: "Prevent fake accounts from imitating you" }, + EasierToFind: { defaultMessage: "Make your profile easier to find and share" }, + Funding: { defaultMessage: "Fund developers and platforms providing NIP-05 verification services" }, + SnortSocialNip: { + defaultMessage: `Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!`, + }, + NostrPlebsNip: { + defaultMessage: `Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices`, + }, +}); diff --git a/src/Pages/new/messages.js b/src/Pages/new/messages.js deleted file mode 100644 index 237f574..0000000 --- a/src/Pages/new/messages.js +++ /dev/null @@ -1,57 +0,0 @@ -import { defineMessages } from "react-intl"; - -export default defineMessages({ - SaveKeys: "Save your keys!", - SaveKeysHelp: - "Your private key is your password. If you lose this key, you will lose access to your account! Copy it and keep it in a safe place. There is no way to reset your private key.", - YourPubkey: "Your public key", - YourPrivkey: "Your private key", - KeysSaved: "I have saved my keys, continue", - WhatIsSnort: "What is Snort and how does it work?", - WhatIsSnortIntro: `Snort is a Nostr UI, nostr is a decentralised protocol for saving and distributing "notes".`, - WhatIsSnortNotes: `Notes hold text content, the most popular usage of these notes is to store "tweet like" messages.`, - - WhatIsSnortExperience: "Snort is designed to have a similar experience to Twitter.", - HowKeysWork: "How do keys work?", - DigitalSignatures: `Nostr uses digital signature technology to provide tamper proof notes which can safely be replicated to many relays to provide redundant storage of your content.`, - TamperProof: `This means that nobody can modify notes which you have created and everybody can easily verify that the notes they are reading are created by you.`, - Bitcoin: `This is the same technology which is used by Bitcoin and has been proven to be extremely secure.`, - Extensions: `It is recommended to use one of the following browser extensions if you are on a desktop computer to secure your key:`, - ExtensionsNostr: `You can also use these extensions to login to most Nostr sites.`, - ImproveSecurity: "Improve login security with browser extensions", - PickUsername: "Pick a username", - UsernameHelp: - "On Nostr, many people have the same username. User names and identity are separate things. You can get a unique identifier in the next step.", - Username: "Username", - UsernamePlaceholder: "e.g. Jack", - PopularAccounts: "Follow some popular accounts", - Skip: "Skip", - Done: "Done!", - ImportTwitter: "Import Twitter Follows (optional)", - TwitterPlaceholder: "Twitter username...", - FindYourFollows: "Find your twitter follows on nostr (Data provided by {provider})", - TwitterUsername: "Twitter username", - FollowsOnNostr: "{username}'s Follows on Nostr", - NoUsersFound: "No nostr users found for {twitterUsername}", - FailedToLoad: "Failed to load follows, please try again later", - Check: "Check", - Next: "Next", - SetupProfile: "Setup your Profile", - Identifier: "Get an identifier (optional)", - IdentifierHelp: - "Getting an identifier helps confirm the real you to people who know you. Many people can have a username @jack, but there is only one jack@cash.app.", - PreventFakes: "Prevent fake accounts from imitating you", - EasierToFind: "Make your profile easier to find and share", - Funding: "Fund developers and platforms providing NIP-05 verification services", - NameSquatting: - "Name-squatting and impersonation is not allowed. Snort and our partners reserve the right to terminate your handle (not your account - nobody can take that away) for violating this rule.", - PreviewOnSnort: "Preview on snort", - GetSnortId: "Get a Snort identifier", - GetSnortIdHelp: - "Only Snort and our integration partner identifier gives you a colorful domain name, but you are welcome to use other services too.", - GetPartnerId: "Get a partner identifier", - GetPartnerIdHelp: "We have also partnered with nostrplebs.com to give you more options", - Ready: "You're ready!", - Share: "Share your thoughts with {link}", - World: "the world", -}); diff --git a/src/Pages/new/messages.ts b/src/Pages/new/messages.ts new file mode 100644 index 0000000..5058508 --- /dev/null +++ b/src/Pages/new/messages.ts @@ -0,0 +1,81 @@ +import { defineMessages } from "react-intl"; + +export default defineMessages({ + SaveKeys: { + defaultMessage: "Save your keys!", + }, + SaveKeysHelp: { + defaultMessage: + "Your private key is your password. If you lose this key, you will lose access to your account! Copy it and keep it in a safe place. There is no way to reset your private key.", + }, + YourPubkey: { defaultMessage: "Your public key" }, + YourPrivkey: { defaultMessage: "Your private key" }, + KeysSaved: { defaultMessage: "I have saved my keys, continue" }, + WhatIsSnort: { defaultMessage: "What is Snort and how does it work?" }, + WhatIsSnortIntro: { + defaultMessage: `Snort is a Nostr UI, nostr is a decentralised protocol for saving and distributing "notes".`, + }, + WhatIsSnortNotes: { + defaultMessage: `Notes hold text content, the most popular usage of these notes is to store "tweet like" messages.`, + }, + + WhatIsSnortExperience: { defaultMessage: "Snort is designed to have a similar experience to Twitter." }, + HowKeysWork: { defaultMessage: "How do keys work?" }, + DigitalSignatures: { + defaultMessage: `Nostr uses digital signature technology to provide tamper proof notes which can safely be replicated to many relays to provide redundant storage of your content.`, + }, + TamperProof: { + defaultMessage: `This means that nobody can modify notes which you have created and everybody can easily verify that the notes they are reading are created by you.`, + }, + Bitcoin: { + defaultMessage: `This is the same technology which is used by Bitcoin and has been proven to be extremely secure.`, + }, + Extensions: { + defaultMessage: `It is recommended to use one of the following browser extensions if you are on a desktop computer to secure your key:`, + }, + ExtensionsNostr: { defaultMessage: `You can also use these extensions to login to most Nostr sites.` }, + ImproveSecurity: { defaultMessage: "Improve login security with browser extensions" }, + PickUsername: { defaultMessage: "Pick a username" }, + UsernameHelp: { + defaultMessage: + "On Nostr, many people have the same username. User names and identity are separate things. You can get a unique identifier in the next step.", + }, + Username: { defaultMessage: "Username" }, + UsernamePlaceholder: { defaultMessage: "e.g. Jack" }, + PopularAccounts: { defaultMessage: "Follow some popular accounts" }, + Skip: { defaultMessage: "Skip" }, + Done: { defaultMessage: "Done!" }, + ImportTwitter: { defaultMessage: "Import Twitter Follows (optional)" }, + TwitterPlaceholder: { defaultMessage: "Twitter username..." }, + FindYourFollows: { defaultMessage: "Find your twitter follows on nostr (Data provided by {provider})" }, + TwitterUsername: { defaultMessage: "Twitter username" }, + FollowsOnNostr: { defaultMessage: "{username}'s Follows on Nostr" }, + NoUsersFound: { defaultMessage: "No nostr users found for {twitterUsername}" }, + FailedToLoad: { defaultMessage: "Failed to load follows, please try again later" }, + Check: { defaultMessage: "Check" }, + Next: { defaultMessage: "Next" }, + SetupProfile: { defaultMessage: "Setup your Profile" }, + Identifier: { defaultMessage: "Get an identifier (optional)" }, + IdentifierHelp: { + defaultMessage: + "Getting an identifier helps confirm the real you to people who know you. Many people can have a username @jack, but there is only one jack@cash.app.", + }, + PreventFakes: { defaultMessage: "Prevent fake accounts from imitating you" }, + EasierToFind: { defaultMessage: "Make your profile easier to find and share" }, + Funding: { defaultMessage: "Fund developers and platforms providing NIP-05 verification services" }, + NameSquatting: { + defaultMessage: + "Name-squatting and impersonation is not allowed. Snort and our partners reserve the right to terminate your handle (not your account - nobody can take that away) for violating this rule.", + }, + PreviewOnSnort: { defaultMessage: "Preview on snort" }, + GetSnortId: { defaultMessage: "Get a Snort identifier" }, + GetSnortIdHelp: { + defaultMessage: + "Only Snort and our integration partner identifier gives you a colorful domain name, but you are welcome to use other services too.", + }, + GetPartnerId: { defaultMessage: "Get a partner identifier" }, + GetPartnerIdHelp: { defaultMessage: "We have also partnered with nostrplebs.com to give you more options" }, + Ready: { defaultMessage: "You're ready!" }, + Share: { defaultMessage: "Share your thoughts with {link}" }, + World: { defaultMessage: "the world" }, +}); diff --git a/src/Pages/settings/messages.js b/src/Pages/settings/messages.js deleted file mode 100644 index 7a194ca..0000000 --- a/src/Pages/settings/messages.js +++ /dev/null @@ -1,55 +0,0 @@ -import { defineMessages } from "react-intl"; - -export default defineMessages({ - Profile: "Profile", - Relays: "Relays", - Owner: "Owner", - Software: "Software", - Contact: "Contact", - Supports: "Supports", - Remove: "Remove", - Preferences: "Preferences", - Donate: "Donate", - LogOut: "Log Out", - Theme: "Theme", - System: "System (Default)", - Light: "Light", - Dark: "Dark", - AutoloadMedia: "Automatically load media", - AutoloadMediaHelp: - "Media in posts will automatically be shown for selected people, otherwise only the link will show", - None: "None", - FollowsOnly: "Follows only", - All: "All", - ImgProxy: "Image proxy service", - ImgProxyHelp: "Use imgproxy to compress images", - ServiceUrl: "Service URL", - ServiceKey: "Service Key", - ServiceSalt: "Service Salt", - EnableReactions: "Enable reactions", - EnableReactionsHelp: "Reactions will be shown on every page, if disabled no reactions will be shown", - ConfirmReposts: "Confirm Reposts", - ConfirmRepostsHelp: "Reposts need to be manually confirmed", - ShowLatest: "Automatically show latest notes", - ShowLatestHelp: "Notes will stream in real time into global and posts tab", - FileUpload: "File upload service", - FileUploadHelp: "Pick which upload service you want to upload attachments to", - Default: "(Default)", - DebugMenus: "Debug Menus", - DebugMenusHelp: `Shows "Copy ID" and "Copy Event JSON" in the context menu on each message`, - EditProfile: "Edit Profile", - About: "About", - LnAddress: "LN Address", - Avatar: "Avatar", - Banner: "Banner", - Edit: "Edit", - PrivateKey: "Your Private Key Is (do not share this with anyone)", - Add: "Add", - AddRelays: "Add Relays", - Name: "Name", - Website: "Website", - Save: "Save", - DisplayName: "Display name", - Buy: "Buy", - Nip05: "NIP-05", -}); diff --git a/src/Pages/settings/messages.ts b/src/Pages/settings/messages.ts new file mode 100644 index 0000000..5b3d5e1 --- /dev/null +++ b/src/Pages/settings/messages.ts @@ -0,0 +1,58 @@ +import { defineMessages } from "react-intl"; + +export default defineMessages({ + Profile: { defaultMessage: "Profile" }, + Relays: { defaultMessage: "Relays" }, + Owner: { defaultMessage: "Owner" }, + Software: { defaultMessage: "Software" }, + Contact: { defaultMessage: "Contact" }, + Supports: { defaultMessage: "Supports" }, + Remove: { defaultMessage: "Remove" }, + Preferences: { defaultMessage: "Preferences" }, + Donate: { defaultMessage: "Donate" }, + LogOut: { defaultMessage: "Log Out" }, + Theme: { defaultMessage: "Theme" }, + System: { defaultMessage: "System (Default)" }, + Light: { defaultMessage: "Light" }, + Dark: { defaultMessage: "Dark" }, + AutoloadMedia: { defaultMessage: "Automatically load media" }, + AutoloadMediaHelp: { + defaultMessage: "Media in posts will automatically be shown for selected people, otherwise only the link will show", + }, + None: { defaultMessage: "None" }, + FollowsOnly: { defaultMessage: "Follows only" }, + All: { defaultMessage: "All" }, + ImgProxy: { defaultMessage: "Image proxy service" }, + ImgProxyHelp: { defaultMessage: "Use imgproxy to compress images" }, + ServiceUrl: { defaultMessage: "Service URL" }, + ServiceKey: { defaultMessage: "Service Key" }, + ServiceSalt: { defaultMessage: "Service Salt" }, + EnableReactions: { defaultMessage: "Enable reactions" }, + EnableReactionsHelp: { + defaultMessage: "Reactions will be shown on every page, if disabled no reactions will be shown", + }, + ConfirmReposts: { defaultMessage: "Confirm Reposts" }, + ConfirmRepostsHelp: { defaultMessage: "Reposts need to be manually confirmed" }, + ShowLatest: { defaultMessage: "Automatically show latest notes" }, + ShowLatestHelp: { defaultMessage: "Notes will stream in real time into global and posts tab" }, + FileUpload: { defaultMessage: "File upload service" }, + FileUploadHelp: { defaultMessage: "Pick which upload service you want to upload attachments to" }, + Default: { defaultMessage: "(Default)" }, + DebugMenus: { defaultMessage: "Debug Menus" }, + DebugMenusHelp: { defaultMessage: `Shows "Copy ID" and "Copy Event JSON" in the context menu on each message` }, + EditProfile: { defaultMessage: "Edit Profile" }, + About: { defaultMessage: "About" }, + LnAddress: { defaultMessage: "LN Address" }, + Avatar: { defaultMessage: "Avatar" }, + Banner: { defaultMessage: "Banner" }, + Edit: { defaultMessage: "Edit" }, + PrivateKey: { defaultMessage: "Your Private Key Is (do not share this with anyone)" }, + Add: { defaultMessage: "Add" }, + AddRelays: { defaultMessage: "Add Relays" }, + Name: { defaultMessage: "Name" }, + Website: { defaultMessage: "Website" }, + Save: { defaultMessage: "Save" }, + DisplayName: { defaultMessage: "Display name" }, + Buy: { defaultMessage: "Buy" }, + Nip05: { defaultMessage: "NIP-05" }, +}); diff --git a/src/lang.json b/src/lang.json new file mode 100644 index 0000000..fcc0442 --- /dev/null +++ b/src/lang.json @@ -0,0 +1,632 @@ +{ + "+D82kt": { + "string": "Are you sure you want to repost: {id}" + }, + "+vIQlC": { + "string": "Please make sure to save the following password in order to manage your handle in the future" + }, + "/4tOwT": { + "string": "Skip" + }, + "/JE/X+": { + "string": "Account Support" + }, + "/RD0e2": { + "string": "Nostr uses digital signature technology to provide tamper proof notes which can safely be replicated to many relays to provide redundant storage of your content." + }, + "/d6vEc": { + "string": "Make your profile easier to find and share" + }, + "/n5KSF": { + "string": "{n} ms" + }, + "0BUTMv": { + "string": "Search..." + }, + "0mch2Y": { + "string": "name has disallowed characters" + }, + "0yO7wF": { + "string": "{n} secs" + }, + "1A7TZk": { + "string": "What is Snort and how does it work?" + }, + "1udzha": { + "string": "Conversations" + }, + "2/2yg+": { + "string": "Add" + }, + "25V4l1": { + "string": "Banner" + }, + "2IFGap": { + "string": "Donate" + }, + "2eWW0m": { + "string": "Service Key" + }, + "2k0Cv+": { + "string": "Dislikes ({n})" + }, + "3cc4Ct": { + "string": "Light" + }, + "450Fty": { + "string": "None" + }, + "47FYwb": { + "string": "Cancel" + }, + "4L2vUY": { + "string": "Your new NIP-05 handle is:" + }, + "4OB335": { + "string": "Dislike" + }, + "4Vmpt4": { + "string": "Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices" + }, + "4Z3t5i": { + "string": "Use imgproxy to compress images" + }, + "4rYCjn": { + "string": "Note to Self" + }, + "5ykRmX": { + "string": "Send zap" + }, + "6ewQqw": { + "string": "Likes ({n})" + }, + "7+Domh": { + "string": "Notes" + }, + "7hp70g": { + "string": "NIP-05" + }, + "7xzTiH": { + "string": "{action} to {target}" + }, + "8/vBbP": { + "string": "Reposts ({n})" + }, + "89q5wc": { + "string": "Confirm Reposts" + }, + "8E9muH": { + "string": "Import Twitter Follows (optional)" + }, + "8QDesP": { + "string": "Zap {n} sats" + }, + "8g2vyB": { + "string": "name too long" + }, + "9+Ddtu": { + "string": "Next" + }, + "9HU8vw": { + "string": "Reply" + }, + "9SvQep": { + "string": "Follows {n}" + }, + "9WRlF4": { + "string": "Send" + }, + "9wO4wJ": { + "string": "Lightning Invoice" + }, + "ASRK0S": { + "string": "This author has been muted" + }, + "Adk34V": { + "string": "Setup your Profile" + }, + "AyGauy": { + "string": "Login" + }, + "B4C47Y": { + "string": "name too short" + }, + "B6+XJy": { + "string": "zapped" + }, + "BOUMjw": { + "string": "No nostr users found for {twitterUsername}" + }, + "BcGMo+": { + "string": "Notes hold text content, the most popular usage of these notes is to store \"tweet like\" messages." + }, + "C81/uG": { + "string": "Logout" + }, + "CHTbO3": { + "string": "Failed to load invoice" + }, + "Cu/K85": { + "string": "Translated from {lang}" + }, + "D3idYv": { + "string": "Settings" + }, + "DKnriN": { + "string": "Send sats" + }, + "DZzCem": { + "string": "Show latest {n} notes" + }, + "Dt/Zd5": { + "string": "Media in posts will automatically be shown for selected people, otherwise only the link will show" + }, + "E8a4yq": { + "string": "Follow some popular accounts" + }, + "EPYwm7": { + "string": "Your private key is your password. If you lose this key, you will lose access to your account! Copy it and keep it in a safe place. There is no way to reset your private key." + }, + "EWyQH5": { + "string": "Global" + }, + "Ebl/B2": { + "string": "Translate to {lang}" + }, + "EnCOBJ": { + "string": "Buy" + }, + "Eqjl5K": { + "string": "Only Snort and our integration partner identifier gives you a colorful domain name, but you are welcome to use other services too." + }, + "F+B3x1": { + "string": "We have also partnered with nostrplebs.com to give you more options" + }, + "FS3b54": { + "string": "Done!" + }, + "FmXUJg": { + "string": "follows you" + }, + "G/yZLu": { + "string": "Remove" + }, + "GspYR7": { + "string": "{n} Dislike" + }, + "H0JBH6": { + "string": "Log Out" + }, + "H6/kLh": { + "string": "Order Paid!" + }, + "HAlOn1": { + "string": "Name" + }, + "HFls6j": { + "string": "name will be available later" + }, + "HOzFdo": { + "string": "Muted" + }, + "HbefNb": { + "string": "Open Wallet" + }, + "IKKHqV": { + "string": "Follows" + }, + "INSqIz": { + "string": "Twitter username..." + }, + "IUZC+0": { + "string": "This means that nobody can modify notes which you have created and everybody can easily verify that the notes they are reading are created by you." + }, + "JCIgkj": { + "string": "Username" + }, + "JHEHCk": { + "string": "Zaps ({n})" + }, + "JkLHGw": { + "string": "Website" + }, + "K3r6DQ": { + "string": "Delete" + }, + "K7AkdL": { + "string": "Show" + }, + "KQvWvD": { + "string": "Deleted" + }, + "KWuDfz": { + "string": "I have saved my keys, continue" + }, + "KahimY": { + "string": "Unknown event kind: {kind}" + }, + "LgbKvU": { + "string": "Comment" + }, + "M3Oirc": { + "string": "Debug Menus" + }, + "MBAYRO": { + "string": "Shows \"Copy ID\" and \"Copy Event JSON\" in the context menu on each message" + }, + "MI2jkA": { + "string": "Not available:" + }, + "MRp6Ly": { + "string": "Twitter username" + }, + "MzRYWH": { + "string": "Buying {item}" + }, + "N2IrpM": { + "string": "Confirm" + }, + "NdOYJJ": { + "string": "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!" + }, + "NfNk2V": { + "string": "Your private key" + }, + "NndBJE": { + "string": "New users page" + }, + "OEW7yJ": { + "string": "Zaps" + }, + "OKhRC6": { + "string": "Share" + }, + "P61BTu": { + "string": "Copy Event JSON" + }, + "P7FD0F": { + "string": "System (Default)" + }, + "PCSt5T": { + "string": "Preferences" + }, + "Pe0ogR": { + "string": "Theme" + }, + "PrsIg7": { + "string": "Reactions will be shown on every page, if disabled no reactions will be shown" + }, + "RDZVQL": { + "string": "Check" + }, + "RahCRH": { + "string": "Expired" + }, + "RhDAoS": { + "string": "Are you sure you want to delete {id}" + }, + "RoOyAh": { + "string": "Relays" + }, + "Sjo1P4": { + "string": "Custom" + }, + "UQ3pOC": { + "string": "On Nostr, many people have the same username. User names and identity are separate things. You can get a unique identifier in the next step." + }, + "Up5U7K": { + "string": "Block" + }, + "VOjC1i": { + "string": "Pick which upload service you want to upload attachments to" + }, + "VlJkSk": { + "string": "{n} muted" + }, + "VnXp8Z": { + "string": "Avatar" + }, + "Vx7Zm2": { + "string": "How do keys work?" + }, + "W9355R": { + "string": "Unmute" + }, + "WONP5O": { + "string": "Find your twitter follows on nostr (Data provided by {provider})" + }, + "WxthCV": { + "string": "e.g. Jack" + }, + "XgWvGA": { + "string": "Reactions" + }, + "YDURw6": { + "string": "Service URL" + }, + "YXA3AH": { + "string": "Enable reactions" + }, + "ZKORll": { + "string": "Activate Now" + }, + "a5UPxh": { + "string": "Fund developers and platforms providing NIP-05 verification services" + }, + "aWpBzj": { + "string": "Show more" + }, + "brAXSu": { + "string": "Pick a username" + }, + "bxv59V": { + "string": "Just now" + }, + "cWx9t8": { + "string": "Mute all" + }, + "cuV2gK": { + "string": "name is registered" + }, + "cyR7Kh": { + "string": "Back" + }, + "d7d0/x": { + "string": "LN Address" + }, + "dOQCL8": { + "string": "Display name" + }, + "e7qqly": { + "string": "Mark All Read" + }, + "eJj8HD": { + "string": "Get Verified" + }, + "eR3YIn": { + "string": "Posts" + }, + "filwqD": { + "string": "Read" + }, + "flnGvv": { + "string": "What's on your mind?" + }, + "g5pX+a": { + "string": "About" + }, + "gBdUXk": { + "string": "Save your keys!" + }, + "gDZkld": { + "string": "Snort is a Nostr UI, nostr is a decentralised protocol for saving and distributing \"notes\"." + }, + "gjBiyj": { + "string": "Loading..." + }, + "hCUivF": { + "string": "Notes will stream in real time into global and posts tab" + }, + "hK5ZDk": { + "string": "the world" + }, + "hLAvqx": { + "string": "Service Salt" + }, + "hMzcSq": { + "string": "Messages" + }, + "hY4lzx": { + "string": "Supports" + }, + "hicxcO": { + "string": "Show replies" + }, + "iCqGww": { + "string": "Reactions ({n})" + }, + "iDGAbc": { + "string": "Get a Snort identifier" + }, + "iGT1eE": { + "string": "Prevent fake accounts from imitating you" + }, + "iNWbVV": { + "string": "Handle" + }, + "ieGrWo": { + "string": "Follow" + }, + "itPgxd": { + "string": "Profile" + }, + "izWS4J": { + "string": "Unfollow" + }, + "jA3OE/": { + "string": "{n,plural,=1{{n} sat} other{{n} sats}}" + }, + "jCA7Cw": { + "string": "Preview on snort" + }, + "juhqvW": { + "string": "Improve login security with browser extensions" + }, + "jvo0vs": { + "string": "Save" + }, + "k2veDA": { + "string": "Write" + }, + "k7sKNy": { + "string": "Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!" + }, + "lCILNz": { + "string": "Buy Now" + }, + "lD3+8a": { + "string": "Pay" + }, + "lgg1KN": { + "string": "account page" + }, + "ll3xBp": { + "string": "Image proxy service" + }, + "lnaT9F": { + "string": "Following {n}" + }, + "lvlPhZ": { + "string": "Pay Invoice" + }, + "mKAr6h": { + "string": "Follow all" + }, + "mKh2HS": { + "string": "File upload service" + }, + "mKhgP9": { + "string": "{n,plural,=0{} =1{zapped} other{zapped}}" + }, + "n1xHAH": { + "string": "Get an identifier (optional)" + }, + "nDejmx": { + "string": "Unblock" + }, + "nN9XTz": { + "string": "Share your thoughts with {link}" + }, + "nwZXeh": { + "string": "{n} blocked" + }, + "o7e+nJ": { + "string": "{n} followers" + }, + "odFwjL": { + "string": "Follows only" + }, + "osUr8O": { + "string": "You can also use these extensions to login to most Nostr sites." + }, + "oxCa4R": { + "string": "Getting an identifier helps confirm the real you to people who know you. Many people can have a username @jack, but there is only one jack@cash.app." + }, + "pzTOmv": { + "string": "Followers" + }, + "qUJTsT": { + "string": "Blocked" + }, + "qdGuQo": { + "string": "Your Private Key Is (do not share this with anyone)" + }, + "qkvYUb": { + "string": "Add to Profile" + }, + "qmJ8kD": { + "string": "Translation failed" + }, + "r3C4x/": { + "string": "Software" + }, + "rT14Ow": { + "string": "Add Relays" + }, + "reJ6SM": { + "string": "It is recommended to use one of the following browser extensions if you are on a desktop computer to secure your key:" + }, + "rfuMjE": { + "string": "(Default)" + }, + "rrfdTe": { + "string": "This is the same technology which is used by Bitcoin and has been proven to be extremely secure." + }, + "rudscU": { + "string": "Failed to load follows, please try again later" + }, + "sWnYKw": { + "string": "Snort is designed to have a similar experience to Twitter." + }, + "svOoEH": { + "string": "Name-squatting and impersonation is not allowed. Snort and our partners reserve the right to terminate your handle (not your account - nobody can take that away) for violating this rule." + }, + "tOdNiY": { + "string": "Dark" + }, + "thnRpU": { + "string": "Getting NIP-05 verified can help:" + }, + "u/vOPu": { + "string": "Paid" + }, + "uD/N6c": { + "string": "Zap {target} {n} sats" + }, + "uSV4Ti": { + "string": "Reposts need to be manually confirmed" + }, + "usAvMr": { + "string": "Edit Profile" + }, + "ut+2Cd": { + "string": "Get a partner identifier" + }, + "vOKedj": { + "string": "{n,plural,=1{& {n} other} other{& {n} others}}" + }, + "vZ4quW": { + "string": "NIP-05 is a DNS based verification spec which helps to validate you as a real user." + }, + "wEQDC6": { + "string": "Edit" + }, + "wih7iJ": { + "string": "name is blocked" + }, + "wqyN/i": { + "string": "Find out more info about {service} at {link}" + }, + "wtLjP6": { + "string": "Copy ID" + }, + "x82IOl": { + "string": "Mute" + }, + "xIoGG9": { + "string": "Go to" + }, + "xJ9n2N": { + "string": "Your public key" + }, + "xKflGN": { + "string": "{username}''s Follows on Nostr" + }, + "xbVgIm": { + "string": "Automatically load media" + }, + "xmcVZ0": { + "string": "Search" + }, + "zFegDD": { + "string": "Contact" + }, + "zINlao": { + "string": "Owner" + }, + "zQvVDJ": { + "string": "All" + }, + "zcaOTs": { + "string": "Zap amount in sats" + }, + "zjJZBd": { + "string": "You're ready!" + }, + "zonsdq": { + "string": "Failed to load LNURL service" + }, + "zvCDao": { + "string": "Automatically show latest notes" + } +} diff --git a/transifex.yml b/transifex.yml index 40f9647..ed056d0 100644 --- a/transifex.yml +++ b/transifex.yml @@ -1,6 +1,6 @@ git: filters: - - filter_type: dir - file_format: KEYVALUEJSON - source_file_dir: "src/translations" + - filter_type: file + file_format: STRUCTURED_JSON + source_file: "src/lang.json" translation_files_expression: "src/translations/.json" diff --git a/yarn.lock b/yarn.lock index 802a074..a0db831 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1224,6 +1224,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@formatjs/cli@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.0.1.tgz#dc295e4e726c984e028376759b3a3fef5eb1d933" + integrity sha512-Fezqcvn6EAGOLvq1LuBJ8C1dNKb4AKqdL3Bc61uCNQjjvfJv3fsxgLYFV4pkOlLGE/xzXY+xywEkCxN3Eo7Arw== + "@formatjs/ecma402-abstract@1.14.3": version "1.14.3" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz#6428f243538a11126180d121ce8d4b2f17465738"