diff --git a/src/assets/languages.ts b/src/assets/languages.ts
index b05e1412..7fb52914 100644
--- a/src/assets/languages.ts
+++ b/src/assets/languages.ts
@@ -4,6 +4,7 @@ import en from "@/assets/locales/en.json";
import fr from "@/assets/locales/fr.json";
import it from "@/assets/locales/it.json";
import nl from "@/assets/locales/nl.json";
+import pirate from "@/assets/locales/pirate.json";
import pl from "@/assets/locales/pl.json";
import tr from "@/assets/locales/tr.json";
import vi from "@/assets/locales/vi.json";
@@ -20,4 +21,5 @@ export const locales = {
tr,
vi,
zh,
+ pirate,
};
diff --git a/src/assets/locales/pirate.json b/src/assets/locales/pirate.json
new file mode 100644
index 00000000..5f66f526
--- /dev/null
+++ b/src/assets/locales/pirate.json
@@ -0,0 +1,391 @@
+{
+ "auth": {
+ "deviceNameLabel": "Ship name",
+ "deviceNamePlaceholder": "Muad'Dib's Pirate Ship",
+ "register": {
+ "information": {
+ "title": "Pirate Account information",
+ "color1": "First Mate color",
+ "color2": "Second Mate color",
+ "icon": "Pirate icon",
+ "header": "Enter a moniker for yer ship and choose a pirate icon and colors, arrr!"
+ }
+ },
+ "login": {
+ "title": "Hoist the Jolly Roger",
+ "description": "Arr, ye be askin' for the key to me top-secret lair, also known as The Fortress of Wordsmithery, accessed only by recitin' the sacred incantation of the 12-word passphrase!",
+ "validationError": "Arr, invalid or incomplete passphrase",
+ "submit": "Hoist Anchor",
+ "passphraseLabel": "12-Word Passphrase",
+ "passphrasePlaceholder": "Passphrase"
+ },
+ "generate": {
+ "title": "Yer Passphrase",
+ "description": "If ye lose this, ye be a silly goose and will be posted on the wall of shame™️"
+ },
+ "trust": {
+ "title": "Do ye trust this ship?",
+ "host": "Do ye trust <0>{{hostname}}0>?",
+ "failed": {
+ "title": "Failed to reach the backend",
+ "text": "Did ye configure it correctly?"
+ },
+ "yes": "Trust",
+ "no": "Abandon Ship"
+ },
+ "verify": {
+ "title": "Enter yer passphrase",
+ "description": "If ye already lost it, how will ye ever be able to take care of a wee buccaneer?",
+ "invalidData": "Data be not valid",
+ "noMatch": "Passphrase doesn't match",
+ "recaptchaFailed": "ReCaptcha validation failed",
+ "passphraseLabel": "Yer passphrase",
+ "register": "Register"
+ }
+ },
+ "errors": {
+ "details": "Error details",
+ "reloadPage": "Reload the page",
+ "badge": "Shiver me timbers",
+ "title": "That be an error, Captain"
+ },
+ "notFound": {
+ "badge": "Not found",
+ "title": "Couldn't find that treasure map",
+ "message": "We looked everywhere: under the bins, in the closet, behind the proxy but ultimately couldn't find the treasure map ye be lookin' for.",
+ "goHome": "Back to home port"
+ },
+ "global": {
+ "name": "movie-web",
+ "pages": {
+ "pagetitle": "{{title}} - movie-web",
+ "dmca": "DMCA",
+ "settings": "Settings",
+ "about": "About",
+ "login": "Login",
+ "register": "Register"
+ }
+ },
+ "media": {
+ "types": {
+ "movie": "Film",
+ "show": "Show"
+ },
+ "episodeDisplay": "S{{season}} E{{episode}}"
+ },
+ "player": {
+ "scraping": {
+ "notFound": {
+ "badge": "Not found",
+ "title": "Goo goo gaa gaa",
+ "text": "Oh, me apologies, sweetie! The itty-bitty movie-web did its utmost bestest, but alas, no wucky videos to be spotted anywhere (´⊙ω⊙`) Please don't be angwy, wittle movie-web ish twying so hard. Can ye find it in yer heart to forgive? UwU 💖",
+ "homeButton": "Go home port"
+ },
+ "items": {
+ "pending": "Checkin' for videos...",
+ "notFound": "Doesn't have the video",
+ "failure": "Error occurred"
+ }
+ },
+ "playbackError": {
+ "badge": "Not found",
+ "title": "Whoops, it broke!",
+ "text": "Oh, me apologies, sweetie! The itty-bitty movie-web did its utmost bestest, but alas, no wucky videos to be spotted anywhere (´⊙ω⊙`) Please don't be angwy, wittle movie-web ish twying so hard. Can ye find it in yer heart to forgive? UwU 💖",
+ "homeButton": "Go home port",
+ "errors": {
+ "errorAborted": "The fetchin' of the associated resource was aborted by the user's request.",
+ "errorNetwork": "Some kind of network error occurred which prevented the media from bein' successfully fetched, despite havin' previously been available.",
+ "errorDecode": "Despite havin' previously been determined to be usable, an error occurred while tryin' to decode the media resource, resultin' in an error.",
+ "errorNotSupported": "The associated resource or media provider object has been found to be unsuitable.",
+ "errorGenericMedia": "Unknown media error occurred"
+ }
+ },
+ "metadata": {
+ "notFound": {
+ "badge": "Not found",
+ "title": "Couldn't find that media.",
+ "text": "We couldn't find the media ye requested. Either it's been removed or ye tampered with the URL.",
+ "homeButton": "Back to home port"
+ },
+ "failed": {
+ "badge": "Failed",
+ "title": "Failed to load meta data",
+ "text": "Oh, me apologies, sweetie! The itty-bitty movie-web did its utmost bestest, but alas, no wucky videos to be spotted anywhere (´⊙ω⊙`) Please don't be angwy, wittle movie-web ish twying so hard. Can ye find it in yer heart to forgive? UwU 💖",
+ "homeButton": "Go home port"
+ }
+ },
+ "back": {
+ "default": "Back to home port",
+ "short": "Back"
+ },
+ "time": {
+ "regular": "{{timeWatched}} / {{duration}}",
+ "shortRegular": "{{timeWatched}}",
+ "remaining": "{{timeLeft}} left • Finish at {{timeFinished, datetime}}",
+ "shortRemaining": "-{{timeLeft}}"
+ },
+ "nextEpisode": {
+ "next": "Next episode",
+ "cancel": "Cancel"
+ },
+ "menus": {
+ "settings": {
+ "videoSection": "Video settings",
+ "experienceSection": "Viewing Experience",
+ "enableCaptions": "Enable Sea Shanties",
+ "captionItem": "Sea Shanty settings",
+ "sourceItem": "Video sources",
+ "playbackItem": "Playback settings",
+ "downloadItem": "Buried Treasure",
+ "qualityItem": "Quality"
+ },
+ "episodes": {
+ "button": "Episodes",
+ "loadingTitle": "Loading...",
+ "loadingList": "Loading...",
+ "loadingError": "Error loadin' season",
+ "emptyState": "There be no episodes in this season, check back later!",
+ "episodeBadge": "E{{episode}}"
+ },
+ "sources": {
+ "title": "Sources",
+ "unknownOption": "Unknown",
+ "noStream": {
+ "title": "No stream",
+ "text": "This source has no streams for this film or show."
+ },
+ "noEmbeds": {
+ "title": "No embeds found",
+ "text": "We were unable to find any embeds for this source, please try another."
+ },
+ "failed": {
+ "title": "Failed to scrape",
+ "text": "We were unable to find any videos for this source. Don't come bitchin' to us about it, just try another source."
+ }
+ },
+ "captions": {
+ "title": "Sea Shanties",
+ "customizeLabel": "Customize",
+ "settings": {
+ "fixCapitals": "Fix capitalization",
+ "delay": "Shanty delay"
+ },
+ "customChoice": "Upload sea shanties",
+ "offChoice": "Off",
+ "unknownLanguage": "Unknown"
+ },
+ "downloads": {
+ "title": "Buried Treasure",
+ "disclaimer": "Downloads be taken directly from the provider. movie-web does not have control over how the downloads be provided.",
+ "hlsExplanation": "Insert explanation for why ye can't download HLS here",
+ "downloadVideo": "Download film",
+ "downloadCaption": "Download current sea shanty",
+ "onPc": {
+ "1": "On PC, right click the film and select
- {t("settings.sidebar.info.backendUrl")} +
{t("settings.sidebar.info.backendUrl")}
{backendUrl.replace(/https?:\/\//, "")}
@@ -193,7 +193,7 @@ export function SidebarPart() { /> ) : null} {backendMeta.loading ? ( - + ) : ( backendMeta?.value?.version || t("settings.sidebar.info.unknownVersion") diff --git a/src/setup/i18n.ts b/src/setup/i18n.ts index 84402df1..ac86edcc 100644 --- a/src/setup/i18n.ts +++ b/src/setup/i18n.ts @@ -18,6 +18,13 @@ i18n.use(initReactI18next).init({ }); export const appLanguageOptions = langCodes.map((lang) => { + if (lang === "pirate") { + return { + code: "pirate", + name: "Pirate", + nativeName: "Pirate Tongue", + }; + } const [langObj] = ISO6391.getLanguages([lang]); if (!langObj) throw new Error(`Language with code ${lang} cannot be found in database`);