diff --git a/locale/af_ZA.ts b/locale/af_ZA.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/af_ZA.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ar_SA.ts b/locale/ar_SA.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ar_SA.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/be_BY.ts b/locale/be_BY.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/be_BY.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ca_ES.ts b/locale/ca_ES.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ca_ES.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/cs_CZ.ts b/locale/cs_CZ.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/cs_CZ.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/da_DK.ts b/locale/da_DK.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/da_DK.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/de_AT.ts b/locale/de_AT.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/de_AT.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/de_DE.ts b/locale/de_DE.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/de_DE.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/el_GR.ts b/locale/el_GR.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/el_GR.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/en_GB.ts b/locale/en_GB.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/en_GB.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/en_PT.ts b/locale/en_PT.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/en_PT.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/en_US.ts b/locale/en_US.ts
index 85fc74e7..d9104699 100644
--- a/locale/en_US.ts
+++ b/locale/en_US.ts
@@ -129,7 +129,6 @@ export default {
editing: "Editing {0}",
owner: "{USER}'s Emote Set",
owned: "Owned Emote Set",
-
modal: {
selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
create_button: "Create @:common.object.emote_set",
@@ -141,10 +140,8 @@ export default {
channel_emotes: "Channel Emotes",
editors: "Editors",
roles: "Roles",
-
no_channel_emotes: "{0} does not have any emote on their {1} channel",
no_channels: "{0} doesn't have any channels connected!",
-
card: {
view_full_profile: "View Full Profile",
},
@@ -169,7 +166,6 @@ export default {
complete_step_one: "Continue",
abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
},
-
// Text that is relevant to the inbox
inbox: {
inbox: "Inbox",
@@ -179,7 +175,6 @@ export default {
important: "Important",
},
unread_tag: "Unread",
-
// System inbox messages
generic: {
emote_listed: {
diff --git a/locale/es_ES.ts b/locale/es_ES.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/es_ES.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/et_EE.ts b/locale/et_EE.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/et_EE.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/fa_IR.ts b/locale/fa_IR.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/fa_IR.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/fi_FI.ts b/locale/fi_FI.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/fi_FI.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/fr_FR.ts b/locale/fr_FR.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/fr_FR.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ga_IE.ts b/locale/ga_IE.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ga_IE.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/he_IL.ts b/locale/he_IL.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/he_IL.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/hu_HU.ts b/locale/hu_HU.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/hu_HU.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/it_IT.ts b/locale/it_IT.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/it_IT.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ja_JP.ts b/locale/ja_JP.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ja_JP.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ka_GE.ts b/locale/ka_GE.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ka_GE.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/kk_KZ.ts b/locale/kk_KZ.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/kk_KZ.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ko_KR.ts b/locale/ko_KR.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ko_KR.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/locale.json b/locale/locale.json
index 8a6882ae..028640a3 100644
--- a/locale/locale.json
+++ b/locale/locale.json
@@ -1 +1,41 @@
-{ "en_US": "98cf56cc4032cd90814c73af2621851d9022427a233eaca86731461e4136fdb3" }
+{
+ "af_ZA": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ar_SA": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "be_BY": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ca_ES": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "cs_CZ": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "da_DK": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "de_AT": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "de_DE": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "el_GR": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "en_GB": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "en_PT": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "en_US": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "es_ES": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "et_EE": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "fa_IR": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "fi_FI": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "fr_FR": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ga_IE": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "he_IL": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "hu_HU": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "it_IT": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ja_JP": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ka_GE": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "kk_KZ": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ko_KR": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "nb_NO": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "nl_NL": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "nn_NO": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "pl_PL": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "pt_BR": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "pt_PT": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ro_RO": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "ru_RU": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "sq_AL": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "sr_SP": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "sv_SE": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "tr_TR": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "uk_UA": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d",
+ "vi_VN": "52ef545b1ab15d2ff56109f13a72e43e6dfb9e3c4514430bcbceab2eb198bd0d"
+}
diff --git a/locale/nb_NO.ts b/locale/nb_NO.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/nb_NO.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/nl_NL.ts b/locale/nl_NL.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/nl_NL.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/nn_NO.ts b/locale/nn_NO.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/nn_NO.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/pl_PL.ts b/locale/pl_PL.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/pl_PL.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/pt_BR.ts b/locale/pt_BR.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/pt_BR.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/pt_PT.ts b/locale/pt_PT.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/pt_PT.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ro_RO.ts b/locale/ro_RO.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ro_RO.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/ru_RU.ts b/locale/ru_RU.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/ru_RU.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/sq_AL.ts b/locale/sq_AL.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/sq_AL.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/sr_SP.ts b/locale/sr_SP.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/sr_SP.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/sv_SE.ts b/locale/sv_SE.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/sv_SE.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/tr_TR.ts b/locale/tr_TR.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/tr_TR.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/uk_UA.ts b/locale/uk_UA.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/uk_UA.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};
diff --git a/locale/vi_VN.ts b/locale/vi_VN.ts
new file mode 100644
index 00000000..d9104699
--- /dev/null
+++ b/locale/vi_VN.ts
@@ -0,0 +1,240 @@
+export default {
+ locale: "English (United States)",
+ // Common / Repeated words and phrases
+ common: {
+ appName: "7TV",
+ appHost: "7tv.app",
+ supportEmail: "kathy{'@'}7tv.app",
+ learnMore: "Learn More",
+ more: "More",
+ retry: "Retry",
+ downloads: "Downloads",
+ features: "Features",
+ comments: "Comments",
+ search: "Search",
+ update: "Update",
+ report: "Report",
+ object: {
+ user: "User",
+ emote_set: "Emote Set",
+ emote: "Emote",
+ },
+ },
+ // Text that appears on the home page
+ home: {
+ slogan: "The Emote Platform for All",
+ app_description: "Manage hundreds of emotes for your Twitch or YouTube channels with ease",
+ why_app: "Why @:common.appName{'?'}",
+ download_browser: "Browser Extension",
+ download_mobile: "Mobile Apps",
+ download_misc: "Other Apps",
+ features: {
+ emote_sets: {
+ name: "Emote Sets",
+ detail: "Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.",
+ },
+ many_emote_slots: {
+ name: "Hundreds of emote slots",
+ detail: "Start with {0} slots, with a possible maximum of {1} and no paywall.",
+ },
+ channel_emote_names: {
+ name: "Per-channel emote names",
+ detail: "Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.",
+ },
+ real_time: {
+ name: "Real-time",
+ detail: "Changing emotes in your channel happens instantly, for all viewers. No F5 required.",
+ },
+ emote_versions: {
+ name: "Emote Versioning",
+ detail: "Swap between themed variants or update an emote to an improved version.",
+ },
+ next_gen: {
+ name: "Next-gen image formats like WEBP and AVIF",
+ detail: "We use newer, more optimized image formats to reduce bandwidth usage.",
+ },
+ source_available: {
+ name: "Source-available",
+ detail: "Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.",
+ },
+ },
+ socials: {
+ discord: "Join @:common.appName on Discord",
+ discord_online_count: "{0} online now",
+ twitter: "Follow us on Twitter",
+ github: "Contribute",
+ },
+ },
+ // Navigation
+ nav: {
+ home: "Home",
+ about: "About",
+ emotes: "Emotes",
+ store: "Subscribe",
+ admin: "Admin",
+ sign_in: "Sign In",
+ },
+ // Text that is relevant to emotes
+ emote: {
+ add: "Add Emote",
+ author: "Added by",
+ created_at: "Created",
+ versions: "Versions",
+ use: "Use Emote",
+ switch_version: "Switch to this version",
+ in_n_sets: "in {0} set | in {0} sets",
+ disable: "Disable Emote",
+ update: "Update",
+ report: "Report Emote",
+ makePrivate: "Make Private",
+ makeGlobal: "Make Global",
+ comments: "Comments",
+ channels: "Channels",
+ list: {
+ searching: "Searching",
+ emote_count: "{0} emotes",
+ no_emotes_listed: "No emotes found",
+ fetching_slowly: "Sorry, it seems this is taking a while",
+ },
+ upload: {
+ emote_name: "Emote Name",
+ version_name: "Version Name",
+ version_description: "Version Description",
+ submit_emote: "Submit Emote",
+ create_emote_version: "Create Emote Version",
+ image_upload: "Image Upload",
+ accepted_formats: "Accepted Formats",
+ filetype: "File",
+ animation: "Animation",
+ transparency: "Transparency",
+ emote_details: "Emote Details",
+ version_details: "Version Details",
+ attribution: "Attribution",
+ original_creator: "Original Creator",
+ as_child: "You are creating a {IS_DIVERGED} version of {0}. ",
+ content_moderation: "Content Moderation",
+ half_transparency_tooltip:
+ "Pixels can only be fully transparent or fully opaque (no variable transparency)",
+ },
+ },
+ emote_set: {
+ create: "New @:common.object.emote_set",
+ select: "Select @:common.object.emote_set",
+ explain: {
+ section: "What are @:common.object.emote_set{'s'}?",
+ hint: "Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.",
+ },
+ no_space: "Slots Full",
+ none_selected: "No Set Selected",
+ editing: "Editing {0}",
+ owner: "{USER}'s Emote Set",
+ owned: "Owned Emote Set",
+ modal: {
+ selected_channel_count: "no channel selected | {0} channel selected | {0} channels selected",
+ create_button: "Create @:common.object.emote_set",
+ },
+ },
+ // Text that is relevant to users
+ user: {
+ emote_sets: "Emote Sets",
+ channel_emotes: "Channel Emotes",
+ editors: "Editors",
+ roles: "Roles",
+ no_channel_emotes: "{0} does not have any emote on their {1} channel",
+ no_channels: "{0} doesn't have any channels connected!",
+ card: {
+ view_full_profile: "View Full Profile",
+ },
+ },
+ store: {},
+ // Text that is relating to the reporting system
+ reporting: {
+ report: "Report",
+ emote_reason: {
+ i_made_this: "I made this emote but it was uploaded by someone else",
+ duplicate: "This emote is a duplicate",
+ pornographic: "This emote contains pornographic or overly sexualized imagery",
+ violence_gore: "This emote displays extreme violence or gore",
+ i_appear_there: "This emote depicts me and I don't like it",
+ offensive: "I find this emote offensive",
+ other: "Something else",
+ },
+ uncategorized_prompt: "What's the matter?",
+ details: "Details (additional info and/or evidence for your report)",
+ success: "Report submitted successfully",
+ notify: "You will be notified via the inbox once your report is handled or further information is requested.",
+ complete_step_one: "Continue",
+ abuse_notice: "Abuse of the report feature may lead to your access being revoked.",
+ },
+ // Text that is relevant to the inbox
+ inbox: {
+ inbox: "Inbox",
+ tabs: {
+ all: "All Messages",
+ unread: "Unread",
+ important: "Important",
+ },
+ unread_tag: "Unread",
+ // System inbox messages
+ generic: {
+ emote_listed: {
+ subject: "Emote Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was approved for listing \n
+It will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}
+`,
+ },
+ emote_not_listed: {
+ subject: "Emote Not Approved for Listing",
+ content: `
+# Your emote "{EMOTE_NAME}" was rejected
+It will not be available via the public Emote Directory or visible on @:common.appHost,
+but will remain available for users with the link.
+`,
+ },
+ emote_ownership_claim_request: {
+ subject: "Invitation to claim ownership of an emote",
+ content: `
+## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'
+
+[View Emote]({EMOTE_URL})
+
+**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})
+ `,
+ },
+ client_banned: {
+ subject: "You've been banned",
+ reason: {
+ pornographic_content: "",
+ },
+ content: `
+# Account Banned
+Your access to @:common.appName is now limited.
+### Reason for this action
+{BAN_REASON}
+### Restrictions Applied
+{EFFECT_NO_PERMISSIONS}
+{EFFECT_NO_AUTH}
+{EFFECT_NO_OWNERSHIP}
+{EFFECT_MEMORY_HOLE}
+
+
This decision expires **{BAN_EXPIRE_AT}**.
+_If you believe this is a mistake, please email @:common.supportEmail{'.'}_
+`,
+ effect: {
+ no_permissions: "* You may no longer interact with the app",
+ no_auth: "* You may no longer sign in",
+ no_ownership: "* Any content you created will no longer be available",
+ memory_hole: "* You won't be visible to other users",
+ ip_blocked: "* Your IP is blocked from accessing all @:common.appName services",
+ },
+ },
+ },
+ },
+ // 404 Messages
+ notFound: {
+ troll_despair: "We couldn't find it",
+ doctor_wtf: "The hell's this?",
+ pot_friend: "I'm a pot, friend",
+ },
+};