aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Locale
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-05-24 13:22:34 +0000
committerFuwn <[email protected]>2026-05-24 13:22:34 +0000
commit56a7a7851b09cb30a5cd543c8cb4f926109b4290 (patch)
treea620f908405fa48fd601580c5a48432831ec5c33 /src/lib/Locale
parentfix(layout): preserve list panel when clicking action buttons in summary (diff)
downloaddue.moe-56a7a7851b09cb30a5cd543c8cb4f926109b4290.tar.xz
due.moe-56a7a7851b09cb30a5cd543c8cb4f926109b4290.zip
refactor(locale): move hardcoded UI strings into english locale
Adds optional namespaces (common, errors, commandPalette, headTitle, notifications, schedule, events, home, reader, routes, badgePreview, badgeWall) and extends existing ones (settings.*, lists.*, tools.*, user.*, hololive.*) on the Locale interface. New fields are optional so japanese.ts can omit them; svelte-i18n's fallbackLocale handles the runtime miss. HeadTitle gains an optional routeKey prop for type-safe lookup. defaultActions becomes a factory so the command palette re-reads locale on language toggle. The existing JP feedback translation in routes/settings is preserved via japanese.ts. Out of scope (kept hardcoded): service-worker.ts, app.html, Landing*.svelte, tools.ts registry, Easter Event 2025 pages.
Diffstat (limited to 'src/lib/Locale')
-rw-r--r--src/lib/Locale/english.ts485
-rw-r--r--src/lib/Locale/japanese.ts4
-rw-r--r--src/lib/Locale/layout.ts429
3 files changed, 917 insertions, 1 deletions
diff --git a/src/lib/Locale/english.ts b/src/lib/Locale/english.ts
index f0195948..6e46f132 100644
--- a/src/lib/Locale/english.ts
+++ b/src/lib/Locale/english.ts
@@ -17,6 +17,8 @@ const English: Locale = {
hololive: "hololive Schedule",
myProfile: "My Profile",
myBadgeWall: "My Badge Wall",
+ menu: "Menu",
+ avatar: "Avatar",
},
settings: {
fields: {
@@ -33,6 +35,7 @@ const English: Locale = {
tooltips: {
rss: "Web feed data format",
},
+ feedUrlLabel: "Your AniList notifications RSS feed URL",
},
display: {
title: "Display",
@@ -60,6 +63,16 @@ const English: Locale = {
"Sort anime by difference between last watched and next episode",
hint: "By default, anime are sorted by the number of days left until the next episode airs.",
},
+ hoverCover:
+ "Show media cover when hovering on supported media titles",
+ socialButton: "Show social tab shortcut for media",
+ blurAdult: "Blur NSFW media covers",
+ copyTitleNotLink: "Copy media title instead of linking",
+ totalDueEpisodes:
+ "Display total number of due episodes instead of due media count",
+ totalEpisodes: "Apply to all media lists, not just due media lists",
+ scheduleFilterList:
+ "Only display media on your media lists in Subtitle Schedule",
},
},
dateAndTime: {
@@ -72,6 +85,8 @@ const English: Locale = {
"Show episode countdown in native release date & time",
abbreviateCountdown:
"Abbreviate episode countdown date & time units",
+ lastActivityWarningHint:
+ "A warning will appear at the top of Home and Completed if you have not filled in today's activity history grid point yet. This option is useful to those that like maintaining a consistent activity history grid.",
},
},
motionAndAccessibility: {
@@ -82,6 +97,12 @@ const English: Locale = {
enableAniListNotifications: "Enable AniList notifications",
limitPanelAreaToScreenHeight: "Limit panel area to screen height",
interfaceLanguage: "Interface language",
+ aniListNotificationsHint:
+ "Periodically check for and send recent AniList notifications as native platform notifications. This may be useful for users who have installed due.moe as a PWA or are using due.moe on a mobile device, as AniList has no official mobile app, and the AniList website does not send push notifications.",
+ aniListNotificationsHint1:
+ "Periodically check for and send recent AniList notifications as native platform notifications",
+ aniListNotificationsHint2:
+ "This may be useful for users who have installed due.moe as a PWA or are using due.moe on a mobile device, as AniList has no official mobile app, and the AniList website does not send push notifications.",
},
},
dataSaver: "Data Saver",
@@ -104,6 +125,25 @@ const English: Locale = {
hint: "Let them remind you. It's for your own benefit.",
},
filtersIncludeCompleted: "Affect Completed",
+ includeAdditionalMediaHint1:
+ "Media where either the next episode's release date is unknown or the chapter count could not be resolved is considered unresolved.",
+ includeAdditionalMediaHint2:
+ "Additionally, you can hard exclude specific media from due.moe on AniList. To exclude any media from being included in any due.moe calculation, create an anime or manga list with the tag #DueIgnore in the list's title and add the media you want to exclude to the list. Inversely, you can selectively include media by creating an anime or manga list with the tag #DueInclude in the list's title, which will include only media in the list in any due.moe calculation. #DueInclude will override #DueIgnore.",
+ coverModeTitle: "Show lists with media covers instead of text",
+ coverWidthLabel: "Cover width (px)",
+ listSortFilterTitle: "List sort & filter",
+ animeSortOrder: "Anime sort order",
+ sortOptions: {
+ timeRemaining: "Time Remaining Until Next Airing Episode",
+ difference: "Difference Between Progress and Next Airing Episode",
+ startDate: "Start Date",
+ endDate: "End Date",
+ },
+ reverseSortOrder: "Reverse anime sort order",
+ mediaListFilter: "Enable media list filter",
+ mediaRoulette: "Enable media roulette",
+ mediaRouletteHint:
+ "Adds a roulette button to due and completed media lists to randomly pick something to watch or read",
},
tooltips: {
beta: "Beta",
@@ -116,6 +156,7 @@ const English: Locale = {
tooltips: {
version: "Current due.moe version hash",
},
+ customCSS: "Custom CSS",
},
calculation: {
title: "Calculation",
@@ -130,21 +171,61 @@ const English: Locale = {
},
hideOutOfDateVolumeWarning: {
title: "Hide out-of-date volume warning",
+ hint: "Out-of-date volume warnings display an alert when there is a mismatch between the chapter progress and number of volumes you have logged for a given title. For example, an alert would be shown if you have tracked a manga up to Ch. 50 (Vol. 5), but have less than 4 volumes logged.",
+ hint1:
+ "Out-of-date volume warnings display an alert when there is a mismatch between the chapter progress and number of volumes you have logged for a given title.",
+ hint2:
+ "For example, an alert would be shown if you have tracked a manga up to Ch. 50 (Vol. 5), but have less than 4 volumes logged.",
+ speedupHint:
+ "Disabling this option speeds up refresh times for manga lists.",
},
smartChapterCountEstimation: {
title: "Enable smart chapter count calculation",
+ hint: "Smart chapter count calculation uses statistical methods to estimate the number of chapters available for a given title based on user submitted progress. Disabling this setting will disable light novel chapter count reporting and will disable smart chapter count calculation for titles which you have higher progress than officially reported.",
+ hint1:
+ "Smart chapter count calculation uses statistical methods to estimate the number of chapters available for a given title based on user submitted progress.",
+ hint2:
+ "Disabling this setting will disable light novel chapter count reporting and will disable smart chapter count calculation for titles which you have higher progress than officially reported.",
},
preferNativeChapterCount: {
title: "Prefer native chapter count",
hint: "Prefer comparing against a manga's native chapter count opposed to the translated chapter count",
},
+ smartChapterMethod: {
+ label: "Smart chapter count calculation method",
+ accuracyDisclaimer:
+ "No chapter count estimation method will be 100% accurate. Since estimated media requires scores derived from user submitted progress, high (or low) false-reports skew the data.",
+ options: {
+ mode: "Mode (fast, moderate to low accuracy)",
+ median: "Median (moderate speed, high accuracy, recommended)",
+ iqrMedian:
+ "Interquartile Range with Median (slower, high accuracy)",
+ iqrMode: "Interquartile Range with Mode (slower, high accuracy)",
+ },
+ },
},
},
cache: {
title: "Cache",
+ clearingNote: "Clearing due.moe's site data will clear these caches too.",
+ recacheAnimeLabel: "Re-cache AniList media lists every",
+ recacheMangaLabel: "Re-cache manga data every",
+ minutes: "minutes",
},
attributions: {
title: "Attributions",
+ generalData:
+ "Most data not explicity attributed otherwise, excluding primary chapter and volume data, character birthday data, and subtitled anime release data",
+ nonNativeChapter: "non-native chapter and volume count data",
+ nativeChapter: "Native chapter and volume count data",
+ girlsBandCryIcons: "Girls Band Cry Icon Set",
+ outboundDisclaimerTitle: "Outbound Link Disclaimer",
+ outboundDisclaimerLine1:
+ "due.moe does not host or directly link to any less-than-legal anime or manga material and/or distribution platforms.",
+ outboundDisclaimerLine2:
+ "due.moe is not affiliated with any of the above or below sites and services.",
+ outboundDisclaimerLine3:
+ "At the moment, due.moe only ever contains outbound links to the following sites and services:",
},
media: {
anime: "Anime",
@@ -172,6 +253,22 @@ const English: Locale = {
disable: "Disable & Keep Local Configuration",
delete: "Delete Remote Configuration",
},
+ lastPush: "Last Push",
+ lastPull: "Last Pull",
+ },
+ verbiage: {
+ upcomingEpisodes:
+ "Anime which you have seen all episodes of thus far, and have a scheduled next episode(s) release date",
+ notYetReleased:
+ "Anime which have not yet aired their first episode, and have a scheduled next episode(s) release date",
+ dueEpisodes:
+ "Anime which you have not seen all episodes of thus far, and have a scheduled next episode release date",
+ dueManga:
+ "Manga which you have not read all chapters of thus far, and have an available next chapter(s)",
+ completedAnime:
+ "Anime which you have not seen all episodes of thus far, and have concluded airing",
+ completedManga:
+ "Manga which you have not read all chapters of thus far, and have concluded publishing",
},
},
user: {
@@ -217,6 +314,17 @@ const English: Locale = {
statistics:
"{username} has watched {anime} days of anime and read {manga} days of manga.",
badges: "{username} has collected {badges} badges using Badge Wall.",
+ notLoaded: "Could not load user profile for @{username}.",
+ loadingProfile: "Loading user profile ...",
+ owner: "Owner",
+ badgeWallLink: "Badge Wall",
+ pinnedCategories: "Pinned Categories",
+ categoryPlaceholder: "Category",
+ biography: "Biography",
+ markdownPlaceholder: "Markdown supported!",
+ badgeWallCustomCss: "Badge Wall Custom CSS",
+ customCssPlaceholder:
+ "/* Use classes and IDs such as .badges, #badges, .badge, or standard elements like body and details, or anything, as long as it's valid CSS! */",
},
preferences: {
title: "User Preferences",
@@ -260,6 +368,40 @@ const English: Locale = {
hint: "Concluded manga and light novels that you have not read all available chapters of",
},
},
+ empty: {
+ anime: "No anime to display.",
+ manga: "No manga to display.",
+ },
+ actions: {
+ pickRandomAnime: "Pick a random anime to watch",
+ pickRandomManga: "Pick a random manga to read",
+ forceRefresh: "Force refresh",
+ forceFullRefresh: "Force a full refresh",
+ all: "All",
+ },
+ errors: {
+ mangaDataDown:
+ "due.moe's manga data source is currently down for maintenance. Please check back later.",
+ mangaDataUnavailable:
+ "due.moe's manga data source is currently unavailable. Please check back later.",
+ mangaDataUnreachable:
+ "due.moe's manga data source is currently unreachable. Please check back later.",
+ },
+ dontReadMangaPrompt:
+ "Don't read manga? You can re-enable it later in the Settings.",
+ dontReadMangaPrefix: "Don't read manga?",
+ hideMangaPanel: "Hide the manga panel",
+ reenableInSettings: "You can re-enable it later in the Settings.",
+ roulette: {
+ closeAriaLabel: "Close roulette",
+ watchTitle: "Watch Roulette",
+ readTitle: "Read Roulette",
+ noMedia: "No media available for roulette.",
+ viewOn: "View on {site}",
+ spin: "Spin!",
+ spinAgain: "Spin Again",
+ spinning: "Spinning ...",
+ },
},
tools: {
tool: {
@@ -268,6 +410,110 @@ const English: Locale = {
long: "Today's Character Birthdays",
},
},
+ picker: {
+ placeholder: "Select a tool to continue",
+ },
+ input: {
+ pressEnter: "Or click your Enter key",
+ },
+ episodeDiscussion: {
+ rateLimit:
+ "Threads could not be loaded. You might have been rate-limited.",
+ contactSupport:
+ "Try again in a few minutes. If the problem persists, please contact @fuwn on AniList.",
+ enterUsername: "Enter a username to search for to continue.",
+ },
+ likes: {
+ invalidUrl: "Please enter a valid Activity or Thread URL.",
+ },
+ tracker: {
+ urlTitleRequired: "URL and title are required fields",
+ entryExists: "Entry with URL already exists: {url}",
+ confirmDelete: "Click again to confirm deletion",
+ urlPlaceholder: "URL",
+ titlePlaceholder: "Title",
+ progressPlaceholder: "Progress (defaults to 0)",
+ },
+ followFix: {
+ toggleFor: "Toggle follow for {input}",
+ },
+ sequelSpy: {
+ winter: "Winter",
+ spring: "Spring",
+ summer: "Summer",
+ fall: "Fall",
+ countRatio:
+ "The count ratio is the number of episodes you've seen of any direct prequels, and the total number of episodes of all direct prequels.",
+ },
+ sequelCatcher: {
+ credit: "Thanks to @sevengirl and @esthereae for the idea!",
+ includeCurrent: "Include current (watching, rewatching, paused)",
+ includeSideStories: "Include side stories (e.g., OVAs, specials, etc.)",
+ },
+ activityHistory: {
+ daysAtRisk: "Days in risk of developing an activity history hole",
+ daysAtRiskHint:
+ "Days in which you did not log any activity or only have one activity logged.",
+ dateLabel: "Date:",
+ amountLabel: "Amount:",
+ },
+ wrapped: {
+ highestRated: "Highest Rated",
+ mostWatched: "Most Watched",
+ mostRead: "Most Read",
+ mostCommon: "Most Common",
+ loadingActivityHistory: "Loading activity history ...",
+ loadingUserData: "Loading user data ...",
+ loadingUser: "Loading user ...",
+ errorFetchingMedia: "Error fetching media.",
+ multiAttempt:
+ "With many activities, it may take multiple attempts to obtain all of your activity history from AniList. If this occurs, wait one minute and try again to continue populating your local activity history database.",
+ multiAttemptPrefix: "With ",
+ multiAttemptSuffix:
+ " activities, it may take multiple attempts to obtain all of your activity history from AniList. If this occurs, wait one minute and try again to continue populating your local activity history database.",
+ clickLoadData: "Click load data!",
+ saveImageInstruction:
+ 'Click on the image to download, or right click and select "Save Image As...".',
+ generateImage: "Generate image",
+ loadData: "Load data",
+ reloadData: "Reload data",
+ display: "Display",
+ calculation: "Calculation",
+ advanced: "Advanced",
+ showWatermark: "Show watermark",
+ bgTransparency: "Enable background transparency",
+ lightMode: "Enable light mode",
+ showGenresTags: "Show top genres and tags",
+ hideActivityHistory: "Hide activity history",
+ showRatedPercentages: "Show highest rated media percentages",
+ showGenreTagPercentages: "Show highest rated genre and tag percentages",
+ showOngoingPrevious: "Show ongoing media from previous years",
+ aboveTopRow: "Above Top Row",
+ belowTopRow: "Below Top Row",
+ bottom: "Bottom",
+ activityHistoryPosition: "Activity history position",
+ highestRatedCount: "Highest rated media count",
+ highestGenreTagCount: "Highest genre and tag count",
+ findBestFit: "Find best fit",
+ widthAdjustment: "Width adjustment",
+ enableFullYear: "Enable full-year activity",
+ refreshData: "Refresh data",
+ calculateForYear: "Calculate for year",
+ startDateFilter: "Start date filter",
+ endDateFilter: "End date filter",
+ animeMangaSort: "Anime and manga sort",
+ genreTagSort: "Genre and tag sort",
+ includeMusic: "Include music",
+ includeRewatches: "Include rewatches & rereads",
+ includeSpecials: "Include specials",
+ includeOvas: "Include OVAs",
+ includeMovies: "Include movies",
+ excludeUnrated: "Excluded unrated & unwatched",
+ excludedKeywords: "Excluded keywords",
+ submit: "Submit",
+ excludedHint: 'Comma separated list (e.g., "My Hero, Kaguya")',
+ disableDetailedActivity: "Disable detailed activity information",
+ },
},
debug: {
clearCaches: "Invalidate anime and manga list caches",
@@ -277,7 +523,7 @@ const English: Locale = {
hint: "Resets all settings present on this page to their default values",
},
clearLocalStorage: {
- title: "Clear",
+ title: "Clear local database",
hint1:
"Resets all of your settings to their default values and clears both AniList media list and manga data caches",
hint2:
@@ -310,6 +556,12 @@ const English: Locale = {
}).format,
loadError: "Could not load schedule.",
parseError: "hololive timed out.",
+ noUpcomingStreams: "No upcoming streams.",
+ loadingSchedule: "Loading schedule ...",
+ parsingSchedule: "Parsing schedule ...",
+ tryAgainQuestion: "Try again?",
+ pleasePrefix: "Please",
+ laterSuffix: "later.",
},
dateFormatter: new Intl.DateTimeFormat("en-US", {
year: "numeric",
@@ -328,6 +580,237 @@ const English: Locale = {
day: "numeric",
weekday: "long",
}).format,
+
+ common: {
+ save: "Save",
+ add: "Add",
+ remove: "Remove",
+ submit: "Submit",
+ cancel: "Cancel",
+ previous: "Previous",
+ next: "Next",
+ search: "Search",
+ notFound: "Not found",
+ tryAgain: "try again",
+ failedToLoad: "Failed to load feed",
+ minutes: "minutes",
+ hours: "hours",
+ loading: "Loading {type} ...{percent}",
+ },
+ errors: {
+ routeNotFound: "not found",
+ didYouMean: "Did you mean",
+ somethingWentWrong: "Something went wrong. Try refreshing.",
+ toolNotFound: 'Tool "{tool}" not found',
+ toolNotFoundPrefix: 'Tool "',
+ toolNotFoundSuffix: '" not found',
+ profileCouldNotBeLoaded: "@{username}'s profile could not be loaded.",
+ completedLoginPrompt: "Please log in to view completed media.",
+ rateLimited: {
+ notLoaded: "could not be loaded. You might have been rate-limited.",
+ notLoadedMight: "could not be loaded. You might have been rate-limited.",
+ notLoadedDefinitely: "could not be loaded. You have been rate-limited.",
+ tryAgainOneMinute: "Try again in one minute.",
+ sessionExpired:
+ "Your login session may have expired. Try logging out and logging back in, or try again in a few minutes.",
+ contactSupport:
+ "If the problem persists, please contact @fuwn on AniList.",
+ },
+ animeRateLimited:
+ "It is likely that you have been rate-limited by AniList. Please try again later.",
+ loginRequiredPrefix: "Please ",
+ loginRequiredLink: "log in",
+ loginRequiredSuffix: " to view this page.",
+ },
+ commandPalette: {
+ ariaLabel: "Command palette",
+ placeholder: "Search",
+ searchCommands: "Search commands",
+ commands: "Commands",
+ noResults: "No results found",
+ refreshCaches: "Refresh Anime & Manga List Caches",
+ logIn: "Log In",
+ logOut: "Log Out",
+ toggles: {
+ time24On: "Switch to 24-hour time",
+ time24Off: "Switch to 12-hour time",
+ animationsOff: "Disable animations",
+ animationsOn: "Enable animations",
+ blurAdultOn: "Blur adult content",
+ blurAdultOff: "Show adult content unblurred",
+ showAnimeCovers: "Show anime covers",
+ hideAnimeCovers: "Hide anime covers",
+ showMangaCovers: "Show manga covers",
+ hideMangaCovers: "Hide manga covers",
+ hoverCoverOn: "Enable hover cover preview",
+ hoverCoverOff: "Disable hover cover preview",
+ scheduleListMode: "Schedule: list mode",
+ scheduleGridMode: "Schedule: grid mode",
+ reverseSort: "Reverse sort order",
+ restoreSort: "Restore default sort order",
+ dataSaverOn: "Enable data saver",
+ dataSaverOff: "Disable data saver",
+ notificationsOff: "Disable in-app notifications",
+ notificationsOn: "Enable in-app notifications",
+ switchLanguageJa: "Switch language to 日本語",
+ switchLanguageEn: "Switch language to English",
+ titleFormat: "Title format: {from} → {to}",
+ outboundLinks: "Outbound links: {from} → {to}",
+ },
+ sync: {
+ pushNow: "Push Settings Now",
+ pullNow: "Pull Settings Now",
+ disable: "Disable Settings Sync",
+ pushedDescription: "Pushed local configuration to remote",
+ pulledDescription: "Pulled remote configuration",
+ noRemoteFound: "No remote configuration found",
+ disabledHeading: "Settings sync disabled",
+ },
+ },
+ headTitle: {
+ settings: "Settings",
+ completed: "Completed",
+ schedule: "Schedule",
+ tools: "Tools",
+ profile: "Profile",
+ updates: "Updates",
+ girls: "Anime Girls Holding Programming Books",
+ hololiveSchedule: "hololive Schedule",
+ userProfile: "{username}'s Profile",
+ userBadgeWall: "{username}'s Badge Wall",
+ },
+ notifications: {
+ cacheInvalidated: "Anime and manga list caches successfully invalidated",
+ mangaHeading: "Manga",
+ mangaRefreshing: "Re-freshing manga data ...",
+ recachedFromAniList: "Re-cached media lists from AniList",
+ settingsReset: "All settings successfully reset",
+ localDatabaseCleared: "local database successfully cleared",
+ rssCopied: "RSS feed URL copied to clipboard",
+ pulledRemote: "Pulled remote configuration",
+ createdRemote: "Created remote configuration",
+ pushedRemote: "Pushed local configuration to remote",
+ syncDisabled: "Settings sync disabled",
+ remoteDeleted: "Remote configuration deleted and settings sync disabled",
+ },
+ schedule: {
+ comingSoon: "Coming soon",
+ continuingFromPreviousSeason: "Continuing from previous season",
+ loadingSubtitle: "Loading subtitle schedule ...",
+ loadingSchedule: "Loading schedule ...",
+ },
+ events: {
+ summary: "Events",
+ loadingGroups: "Loading groups ...",
+ parsingGroups: "Parsing groups ...",
+ errorLoadingGroups: "Error loading groups.",
+ errorParsingGroups: "Error parsing groups.",
+ loadingGroup: "Loading group ...",
+ parsingGroup: "Parsing group ...",
+ errorLoadingGroup: "Error loading group.",
+ errorParsingGroup: "Error parsing group.",
+ groupNotExistPrefix: "This group may not exist. Please ",
+ groupNotExistSuffix: " later.",
+ loadingEvents: "Loading events ...",
+ parsingEvents: "Parsing events ...",
+ errorParsingEvents: "Error parsing events.",
+ },
+ home: {
+ lastActivity: {
+ warning:
+ "You don't have any new activity statuses from the past day! Create one within {timeLeft} to keep your streak!",
+ hoursUnit: "hours",
+ minutesUnit: "minutes",
+ },
+ },
+ reader: {
+ mangaUrl: "Manga URL",
+ read: "Read",
+ loadingChapters: "Loading chapters ...",
+ fetchFailed: "Failed to fetch data",
+ unknownError: "An unknown error has occurred.",
+ invalidUrl: "Invalid URL",
+ vol: "Vol.",
+ ch: "Ch.",
+ readFallback: "Read",
+ },
+ routes: {
+ settingsFeedbackPrefix:
+ "Have feedback or suggestions? Send a private message to",
+ settingsFeedbackSuffix: "on AniList!",
+ toolsFeedbackPrefix:
+ "Have any requests for cool tools that you think others might find useful? Send a private message to",
+ toolsFeedbackSuffix: "on AniList!",
+ girlsTitle: "Anime Girls Holding Programming Books",
+ girlsIntro: "The Senpy Club | Anime Girls Holding Programming Books",
+ girlsIntroLeft: "The Senpy Club",
+ girlsIntroRight: "Anime Girls Holding Programming Books",
+ girlsRandomAlt: "A random anime girl holding a programming book",
+ girlsSingleAlt: "An anime girl holding a programming book",
+ girlsLanguages: "Languages",
+ girlsLoadingImage: "Loading image ...",
+ girlsLoadingImages: "Loading images ...",
+ girlsLoadingLanguages: "Loading languages ...",
+ updatesManga: "Manga",
+ updatesNovels: "Novels",
+ updatesFailedToLoad: "Failed to load feed",
+ },
+ badgePreview: {
+ designer: "Designer:",
+ forum: "Forum",
+ activity: "Activity",
+ source: "Source:",
+ category: "Category:",
+ sauceNAO: "SauceNAO:",
+ search: "Search",
+ previous: "Previous",
+ next: "Next",
+ },
+ badgeWall: {
+ noRegistered: "No due.moe registered badges found for this user.",
+ notFound: "Not found",
+ awcGroup: "Anime Watching Club",
+ page: {
+ somethingWentWrong: "Something went wrong. Try refreshing.",
+ notice: "Notice:",
+ shadowHide: "Shadow Hide Badges",
+ unshadowHide: "Un-shadow Hide Badges",
+ migrateCategory: "Migrate Category",
+ hideCategory: "Hide Category",
+ toggleVisibility: "Toggle Visibility",
+ hidden: "Hidden",
+ shown: "Shown",
+ dateTimeHint:
+ "Must be full date and time, defaults to now if any fields empty",
+ migrateAllHint:
+ "Leave category empty to migrate all to or from uncategorised.",
+ hideVisibilityHint:
+ "If the majority of the badges in a category are shown, the category will be hidden, and vice versa.",
+ hideAllHint: "Leave category field empty to hide all.",
+ loadingBadges: "Loading badges ...",
+ noBadgesYet: "No badges yet.",
+ shadowHideNotice1:
+ "The Badge Wall overseer system has detected badges containing AI-generated material on your wall. {count} of your badges have been shadow hidden.",
+ shadowHideNotice2:
+ 'You may use the "Un-shadow Hide Badges" button to unhide these badges, from where you will be required to use the hide feature to hide these badges from the public, while allowing them to stay visible to you as the account holder.',
+ aiNotice1:
+ "AniList has begun purging outbound links which contain AI-generated material, this includes Badge Wall. If you have collected badges with AI-generated elements, kindly use the hide feature to hide these badges from the public, while allowing them to stay visible to you as the account holder.",
+ aiNotice2:
+ "Failure to comply with this request at your earliest convenience will result in the hiding of all badges from your Badge Wall.",
+ dismiss: "Dismiss",
+ loadNoneNoticeBody:
+ "{count} badges have been loaded successfully, but they are not being displayed due to your preferences ({code}).",
+ loadNoneNoticePrefix:
+ "{count} badges have been loaded successfully, but they are not being displayed due to your preferences (",
+ loadNoneNoticeSuffix: ").",
+ shadowHideBadge: "Shadow Hide Badge ({id})",
+ unshadowHideBadge: "Un-shadow Hide Badge ({id})",
+ migrateAction: "Migrate",
+ originalCategoryPlaceholder: "Original Category",
+ newCategoryPlaceholder: "New Category",
+ categoryPlaceholder: "Category",
+ },
+ },
};
export default English;
diff --git a/src/lib/Locale/japanese.ts b/src/lib/Locale/japanese.ts
index 8e3744d4..2e683926 100644
--- a/src/lib/Locale/japanese.ts
+++ b/src/lib/Locale/japanese.ts
@@ -331,6 +331,10 @@ const Japanese: Locale = {
day: "numeric",
weekday: "long",
}).format,
+ routes: {
+ settingsFeedbackPrefix: "フィードバックや提案はありますか?AniListで",
+ settingsFeedbackSuffix: "にDMを送ってください!",
+ },
};
export default Japanese;
diff --git a/src/lib/Locale/layout.ts b/src/lib/Locale/layout.ts
index 697404f2..f5f2fbf6 100644
--- a/src/lib/Locale/layout.ts
+++ b/src/lib/Locale/layout.ts
@@ -23,6 +23,8 @@ export interface Locale {
hololive: LocaleValue;
myProfile: LocaleValue;
myBadgeWall: LocaleValue;
+ menu?: LocaleValue;
+ avatar?: LocaleValue;
};
settings: {
fields: {
@@ -39,6 +41,7 @@ export interface Locale {
tooltips: {
rss: LocaleValue;
};
+ feedUrlLabel?: LocaleValue;
};
display: {
title: LocaleValue;
@@ -65,6 +68,13 @@ export interface Locale {
title: LocaleValue;
hint: LocaleValue;
};
+ hoverCover?: LocaleValue;
+ socialButton?: LocaleValue;
+ blurAdult?: LocaleValue;
+ copyTitleNotLink?: LocaleValue;
+ totalDueEpisodes?: LocaleValue;
+ totalEpisodes?: LocaleValue;
+ scheduleFilterList?: LocaleValue;
};
};
dateAndTime: {
@@ -75,6 +85,7 @@ export interface Locale {
use24HourTime: LocaleValue;
nativeEpisodeCountdown: LocaleValue;
abbreviateCountdown: LocaleValue;
+ lastActivityWarningHint?: LocaleValue;
};
};
motionAndAccessibility: {
@@ -85,6 +96,9 @@ export interface Locale {
enableAniListNotifications: LocaleValue;
limitPanelAreaToScreenHeight: LocaleValue;
interfaceLanguage: LocaleValue;
+ aniListNotificationsHint?: LocaleValue;
+ aniListNotificationsHint1?: LocaleValue;
+ aniListNotificationsHint2?: LocaleValue;
};
};
dataSaver: LocaleValue;
@@ -107,6 +121,22 @@ export interface Locale {
hint: LocaleValue;
};
filtersIncludeCompleted: LocaleValue;
+ includeAdditionalMediaHint1?: LocaleValue;
+ includeAdditionalMediaHint2?: LocaleValue;
+ coverModeTitle?: LocaleValue;
+ coverWidthLabel?: LocaleValue;
+ listSortFilterTitle?: LocaleValue;
+ animeSortOrder?: LocaleValue;
+ sortOptions?: {
+ timeRemaining?: LocaleValue;
+ difference?: LocaleValue;
+ startDate?: LocaleValue;
+ endDate?: LocaleValue;
+ };
+ reverseSortOrder?: LocaleValue;
+ mediaListFilter?: LocaleValue;
+ mediaRoulette?: LocaleValue;
+ mediaRouletteHint?: LocaleValue;
};
tooltips: {
beta: LocaleValue;
@@ -118,6 +148,7 @@ export interface Locale {
tooltips: {
version: LocaleValue;
};
+ customCSS?: LocaleValue;
};
calculation: {
title: LocaleValue;
@@ -132,21 +163,50 @@ export interface Locale {
};
hideOutOfDateVolumeWarning: {
title: LocaleValue;
+ hint?: LocaleValue;
+ hint1?: LocaleValue;
+ hint2?: LocaleValue;
+ speedupHint?: LocaleValue;
};
smartChapterCountEstimation: {
title: LocaleValue;
+ hint?: LocaleValue;
+ hint1?: LocaleValue;
+ hint2?: LocaleValue;
};
preferNativeChapterCount: {
title: LocaleValue;
hint: LocaleValue;
};
+ smartChapterMethod?: {
+ label?: LocaleValue;
+ accuracyDisclaimer?: LocaleValue;
+ options?: {
+ mode?: LocaleValue;
+ median?: LocaleValue;
+ iqrMedian?: LocaleValue;
+ iqrMode?: LocaleValue;
+ };
+ };
};
};
cache: {
title: LocaleValue;
+ clearingNote?: LocaleValue;
+ recacheAnimeLabel?: LocaleValue;
+ recacheMangaLabel?: LocaleValue;
+ minutes?: LocaleValue;
};
attributions: {
title: LocaleValue;
+ generalData?: LocaleValue;
+ nonNativeChapter?: LocaleValue;
+ nativeChapter?: LocaleValue;
+ girlsBandCryIcons?: LocaleValue;
+ outboundDisclaimerTitle?: LocaleValue;
+ outboundDisclaimerLine1?: LocaleValue;
+ outboundDisclaimerLine2?: LocaleValue;
+ outboundDisclaimerLine3?: LocaleValue;
};
media: {
anime: LocaleValue;
@@ -174,6 +234,16 @@ export interface Locale {
disable: LocaleValue;
delete: LocaleValue;
};
+ lastPush?: LocaleValue;
+ lastPull?: LocaleValue;
+ };
+ verbiage?: {
+ upcomingEpisodes?: LocaleValue;
+ notYetReleased?: LocaleValue;
+ dueEpisodes?: LocaleValue;
+ dueManga?: LocaleValue;
+ completedAnime?: LocaleValue;
+ completedManga?: LocaleValue;
};
};
user: {
@@ -217,6 +287,16 @@ export interface Locale {
profile: {
statistics: LocaleValue;
badges: LocaleValue;
+ notLoaded?: LocaleValue;
+ loadingProfile?: LocaleValue;
+ owner?: LocaleValue;
+ badgeWallLink?: LocaleValue;
+ pinnedCategories?: LocaleValue;
+ categoryPlaceholder?: LocaleValue;
+ biography?: LocaleValue;
+ markdownPlaceholder?: LocaleValue;
+ badgeWallCustomCss?: LocaleValue;
+ customCssPlaceholder?: LocaleValue;
};
preferences: {
title: LocaleValue;
@@ -260,6 +340,36 @@ export interface Locale {
hint: LocaleValue;
};
};
+ empty?: {
+ anime?: LocaleValue;
+ manga?: LocaleValue;
+ };
+ actions?: {
+ pickRandomAnime?: LocaleValue;
+ pickRandomManga?: LocaleValue;
+ forceRefresh?: LocaleValue;
+ forceFullRefresh?: LocaleValue;
+ all?: LocaleValue;
+ };
+ errors?: {
+ mangaDataDown?: LocaleValue;
+ mangaDataUnavailable?: LocaleValue;
+ mangaDataUnreachable?: LocaleValue;
+ };
+ dontReadMangaPrompt?: LocaleValue;
+ dontReadMangaPrefix?: LocaleValue;
+ hideMangaPanel?: LocaleValue;
+ reenableInSettings?: LocaleValue;
+ roulette?: {
+ closeAriaLabel?: LocaleValue;
+ watchTitle?: LocaleValue;
+ readTitle?: LocaleValue;
+ noMedia?: LocaleValue;
+ viewOn?: LocaleValue;
+ spin?: LocaleValue;
+ spinAgain?: LocaleValue;
+ spinning?: LocaleValue;
+ };
};
tools: {
tool: {
@@ -268,6 +378,103 @@ export interface Locale {
long: LocaleValue;
};
};
+ picker?: {
+ placeholder?: LocaleValue;
+ };
+ input?: {
+ pressEnter?: LocaleValue;
+ };
+ episodeDiscussion?: {
+ rateLimit?: LocaleValue;
+ contactSupport?: LocaleValue;
+ enterUsername?: LocaleValue;
+ };
+ likes?: {
+ invalidUrl?: LocaleValue;
+ };
+ tracker?: {
+ urlTitleRequired?: LocaleValue;
+ entryExists?: LocaleValue;
+ confirmDelete?: LocaleValue;
+ urlPlaceholder?: LocaleValue;
+ titlePlaceholder?: LocaleValue;
+ progressPlaceholder?: LocaleValue;
+ };
+ followFix?: {
+ toggleFor?: LocaleValue;
+ };
+ sequelSpy?: {
+ winter?: LocaleValue;
+ spring?: LocaleValue;
+ summer?: LocaleValue;
+ fall?: LocaleValue;
+ countRatio?: LocaleValue;
+ };
+ sequelCatcher?: {
+ credit?: LocaleValue;
+ includeCurrent?: LocaleValue;
+ includeSideStories?: LocaleValue;
+ };
+ activityHistory?: {
+ daysAtRisk?: LocaleValue;
+ daysAtRiskHint?: LocaleValue;
+ dateLabel?: LocaleValue;
+ amountLabel?: LocaleValue;
+ };
+ wrapped?: {
+ highestRated?: LocaleValue;
+ mostWatched?: LocaleValue;
+ mostRead?: LocaleValue;
+ mostCommon?: LocaleValue;
+ loadingActivityHistory?: LocaleValue;
+ loadingUserData?: LocaleValue;
+ loadingUser?: LocaleValue;
+ errorFetchingMedia?: LocaleValue;
+ multiAttempt?: LocaleValue;
+ multiAttemptPrefix?: LocaleValue;
+ multiAttemptSuffix?: LocaleValue;
+ clickLoadData?: LocaleValue;
+ saveImageInstruction?: LocaleValue;
+ generateImage?: LocaleValue;
+ loadData?: LocaleValue;
+ reloadData?: LocaleValue;
+ display?: LocaleValue;
+ calculation?: LocaleValue;
+ advanced?: LocaleValue;
+ showWatermark?: LocaleValue;
+ bgTransparency?: LocaleValue;
+ lightMode?: LocaleValue;
+ showGenresTags?: LocaleValue;
+ hideActivityHistory?: LocaleValue;
+ showRatedPercentages?: LocaleValue;
+ showGenreTagPercentages?: LocaleValue;
+ showOngoingPrevious?: LocaleValue;
+ aboveTopRow?: LocaleValue;
+ belowTopRow?: LocaleValue;
+ bottom?: LocaleValue;
+ activityHistoryPosition?: LocaleValue;
+ highestRatedCount?: LocaleValue;
+ highestGenreTagCount?: LocaleValue;
+ findBestFit?: LocaleValue;
+ widthAdjustment?: LocaleValue;
+ enableFullYear?: LocaleValue;
+ refreshData?: LocaleValue;
+ calculateForYear?: LocaleValue;
+ startDateFilter?: LocaleValue;
+ endDateFilter?: LocaleValue;
+ animeMangaSort?: LocaleValue;
+ genreTagSort?: LocaleValue;
+ includeMusic?: LocaleValue;
+ includeRewatches?: LocaleValue;
+ includeSpecials?: LocaleValue;
+ includeOvas?: LocaleValue;
+ includeMovies?: LocaleValue;
+ excludeUnrated?: LocaleValue;
+ excludedKeywords?: LocaleValue;
+ submit?: LocaleValue;
+ excludedHint?: LocaleValue;
+ disableDetailedActivity?: LocaleValue;
+ };
};
debug: {
clearCaches: LocaleValue;
@@ -298,7 +505,229 @@ export interface Locale {
dateFormatter: (date?: number | Date | undefined) => string;
loadError: LocaleValue;
parseError: LocaleValue;
+ noUpcomingStreams?: LocaleValue;
+ loadingSchedule?: LocaleValue;
+ parsingSchedule?: LocaleValue;
+ tryAgainQuestion?: LocaleValue;
+ pleasePrefix?: LocaleValue;
+ laterSuffix?: LocaleValue;
};
dateFormatter: (date?: number | Date | undefined) => string;
dayFormatter: (date?: number | Date | undefined) => string;
+
+ common?: {
+ save?: LocaleValue;
+ add?: LocaleValue;
+ remove?: LocaleValue;
+ submit?: LocaleValue;
+ cancel?: LocaleValue;
+ previous?: LocaleValue;
+ next?: LocaleValue;
+ search?: LocaleValue;
+ notFound?: LocaleValue;
+ tryAgain?: LocaleValue;
+ failedToLoad?: LocaleValue;
+ minutes?: LocaleValue;
+ hours?: LocaleValue;
+ loading?: LocaleValue;
+ };
+ errors?: {
+ routeNotFound?: LocaleValue;
+ didYouMean?: LocaleValue;
+ somethingWentWrong?: LocaleValue;
+ toolNotFound?: LocaleValue;
+ toolNotFoundPrefix?: LocaleValue;
+ toolNotFoundSuffix?: LocaleValue;
+ profileCouldNotBeLoaded?: LocaleValue;
+ completedLoginPrompt?: LocaleValue;
+ rateLimited?: {
+ notLoaded?: LocaleValue;
+ notLoadedMight?: LocaleValue;
+ notLoadedDefinitely?: LocaleValue;
+ tryAgainOneMinute?: LocaleValue;
+ sessionExpired?: LocaleValue;
+ contactSupport?: LocaleValue;
+ };
+ animeRateLimited?: LocaleValue;
+ loginRequiredPrefix?: LocaleValue;
+ loginRequiredLink?: LocaleValue;
+ loginRequiredSuffix?: LocaleValue;
+ };
+ commandPalette?: {
+ ariaLabel?: LocaleValue;
+ placeholder?: LocaleValue;
+ searchCommands?: LocaleValue;
+ commands?: LocaleValue;
+ noResults?: LocaleValue;
+ refreshCaches?: LocaleValue;
+ logIn?: LocaleValue;
+ logOut?: LocaleValue;
+ toggles?: {
+ time24On?: LocaleValue;
+ time24Off?: LocaleValue;
+ animationsOff?: LocaleValue;
+ animationsOn?: LocaleValue;
+ blurAdultOn?: LocaleValue;
+ blurAdultOff?: LocaleValue;
+ showAnimeCovers?: LocaleValue;
+ hideAnimeCovers?: LocaleValue;
+ showMangaCovers?: LocaleValue;
+ hideMangaCovers?: LocaleValue;
+ hoverCoverOn?: LocaleValue;
+ hoverCoverOff?: LocaleValue;
+ scheduleListMode?: LocaleValue;
+ scheduleGridMode?: LocaleValue;
+ reverseSort?: LocaleValue;
+ restoreSort?: LocaleValue;
+ dataSaverOn?: LocaleValue;
+ dataSaverOff?: LocaleValue;
+ notificationsOff?: LocaleValue;
+ notificationsOn?: LocaleValue;
+ switchLanguageJa?: LocaleValue;
+ switchLanguageEn?: LocaleValue;
+ titleFormat?: LocaleValue;
+ outboundLinks?: LocaleValue;
+ };
+ sync?: {
+ pushNow?: LocaleValue;
+ pullNow?: LocaleValue;
+ disable?: LocaleValue;
+ pushedDescription?: LocaleValue;
+ pulledDescription?: LocaleValue;
+ noRemoteFound?: LocaleValue;
+ disabledHeading?: LocaleValue;
+ };
+ };
+ headTitle?: {
+ settings?: LocaleValue;
+ completed?: LocaleValue;
+ schedule?: LocaleValue;
+ tools?: LocaleValue;
+ profile?: LocaleValue;
+ updates?: LocaleValue;
+ girls?: LocaleValue;
+ hololiveSchedule?: LocaleValue;
+ userProfile?: LocaleValue;
+ userBadgeWall?: LocaleValue;
+ };
+ notifications?: {
+ cacheInvalidated?: LocaleValue;
+ mangaHeading?: LocaleValue;
+ mangaRefreshing?: LocaleValue;
+ recachedFromAniList?: LocaleValue;
+ settingsReset?: LocaleValue;
+ localDatabaseCleared?: LocaleValue;
+ rssCopied?: LocaleValue;
+ pulledRemote?: LocaleValue;
+ createdRemote?: LocaleValue;
+ pushedRemote?: LocaleValue;
+ syncDisabled?: LocaleValue;
+ remoteDeleted?: LocaleValue;
+ };
+ schedule?: {
+ comingSoon?: LocaleValue;
+ continuingFromPreviousSeason?: LocaleValue;
+ loadingSubtitle?: LocaleValue;
+ loadingSchedule?: LocaleValue;
+ };
+ events?: {
+ summary?: LocaleValue;
+ loadingGroups?: LocaleValue;
+ parsingGroups?: LocaleValue;
+ errorLoadingGroups?: LocaleValue;
+ errorParsingGroups?: LocaleValue;
+ loadingGroup?: LocaleValue;
+ parsingGroup?: LocaleValue;
+ errorLoadingGroup?: LocaleValue;
+ errorParsingGroup?: LocaleValue;
+ groupNotExistPrefix?: LocaleValue;
+ groupNotExistSuffix?: LocaleValue;
+ loadingEvents?: LocaleValue;
+ parsingEvents?: LocaleValue;
+ errorParsingEvents?: LocaleValue;
+ };
+ home?: {
+ lastActivity?: {
+ warning?: LocaleValue;
+ hoursUnit?: LocaleValue;
+ minutesUnit?: LocaleValue;
+ };
+ };
+ reader?: {
+ mangaUrl?: LocaleValue;
+ read?: LocaleValue;
+ loadingChapters?: LocaleValue;
+ fetchFailed?: LocaleValue;
+ unknownError?: LocaleValue;
+ invalidUrl?: LocaleValue;
+ vol?: LocaleValue;
+ ch?: LocaleValue;
+ readFallback?: LocaleValue;
+ };
+ routes?: {
+ settingsFeedbackPrefix?: LocaleValue;
+ settingsFeedbackSuffix?: LocaleValue;
+ toolsFeedbackPrefix?: LocaleValue;
+ toolsFeedbackSuffix?: LocaleValue;
+ girlsTitle?: LocaleValue;
+ girlsIntro?: LocaleValue;
+ girlsIntroLeft?: LocaleValue;
+ girlsIntroRight?: LocaleValue;
+ girlsRandomAlt?: LocaleValue;
+ girlsSingleAlt?: LocaleValue;
+ girlsLanguages?: LocaleValue;
+ girlsLoadingImage?: LocaleValue;
+ girlsLoadingImages?: LocaleValue;
+ girlsLoadingLanguages?: LocaleValue;
+ updatesManga?: LocaleValue;
+ updatesNovels?: LocaleValue;
+ updatesFailedToLoad?: LocaleValue;
+ };
+ badgePreview?: {
+ designer?: LocaleValue;
+ forum?: LocaleValue;
+ activity?: LocaleValue;
+ source?: LocaleValue;
+ category?: LocaleValue;
+ sauceNAO?: LocaleValue;
+ search?: LocaleValue;
+ previous?: LocaleValue;
+ next?: LocaleValue;
+ };
+ badgeWall?: {
+ noRegistered?: LocaleValue;
+ notFound?: LocaleValue;
+ awcGroup?: LocaleValue;
+ page?: {
+ somethingWentWrong?: LocaleValue;
+ notice?: LocaleValue;
+ shadowHide?: LocaleValue;
+ unshadowHide?: LocaleValue;
+ migrateCategory?: LocaleValue;
+ hideCategory?: LocaleValue;
+ toggleVisibility?: LocaleValue;
+ hidden?: LocaleValue;
+ shown?: LocaleValue;
+ dateTimeHint?: LocaleValue;
+ migrateAllHint?: LocaleValue;
+ hideVisibilityHint?: LocaleValue;
+ hideAllHint?: LocaleValue;
+ loadingBadges?: LocaleValue;
+ noBadgesYet?: LocaleValue;
+ shadowHideNotice1?: LocaleValue;
+ shadowHideNotice2?: LocaleValue;
+ aiNotice1?: LocaleValue;
+ aiNotice2?: LocaleValue;
+ dismiss?: LocaleValue;
+ loadNoneNoticeBody?: LocaleValue;
+ loadNoneNoticePrefix?: LocaleValue;
+ loadNoneNoticeSuffix?: LocaleValue;
+ shadowHideBadge?: LocaleValue;
+ unshadowHideBadge?: LocaleValue;
+ migrateAction?: LocaleValue;
+ originalCategoryPlaceholder?: LocaleValue;
+ newCategoryPlaceholder?: LocaleValue;
+ categoryPlaceholder?: LocaleValue;
+ };
+ };
}