diff --git a/app/components/layout/Footer.module.css b/app/components/layout/Footer.module.css index 42d9bca3a..5fafbfbc1 100644 --- a/app/components/layout/Footer.module.css +++ b/app/components/layout/Footer.module.css @@ -1,133 +1,235 @@ .footer { + container-type: inline-size; display: flex; flex-direction: column; - padding: var(--s-3); + align-items: center; + padding: var(--s-8) 0 var(--s-32); background-color: var(--color-bg-high); gap: var(--s-6); margin-block-start: auto; - padding-block-end: var(--s-32); } -.linkList { +.thanks { display: flex; - justify-content: space-evenly; - font-size: var(--font-2xs); - - & > * { - flex: 1; - text-align: center; - } -} - -.socials { - display: flex; - justify-content: center; - gap: var(--s-2); -} - -.socialIcon { - height: 2.25rem; - transition: transform 0.25s ease-in-out; -} - -.socialLink { - display: flex; - max-width: 10rem; - height: 12rem; - flex: 1 1 0; flex-direction: column; align-items: center; - justify-content: space-between; - padding: var(--s-4); - border-radius: var(--radius-box); - background-color: var(--color-bg-higher); - cursor: pointer; - font-size: var(--font-lg); - - &:hover > .socialIcon { - transform: translateY(-0.3rem); - } -} - -.socialHeader { - text-align: center; - - & > p { - font-size: var(--font-2xs); - } -} - -.patronTitle { - display: flex; - align-items: flex-end; - justify-content: center; - font-size: var(--font-sm); - font-weight: var(--weight-semi); - gap: var(--s-2); -} - -.patronList { - display: flex; - max-width: 75vw; - flex-wrap: wrap; - justify-content: center; - padding: 0; - margin: 0 auto; - font-size: var(--font-xs); gap: var(--s-1); - list-style: none; - margin-block-start: var(--s-2); + text-align: center; + margin-block-start: var(--s-6); } -.patron { +.thanksTitle { + font-size: var(--font-md); + font-weight: var(--weight-bold); +} + +.thanksSubtitle { + font-size: var(--font-xs); + color: var(--color-text-high); +} + +.marquee { + display: flex; + width: 100%; + flex-direction: column; + overflow: hidden; + gap: var(--s-2); + mask-image: linear-gradient( + to right, + transparent, + black 8%, + black 92%, + transparent + ); + + @media (prefers-reduced-motion: reduce) { + padding-inline: var(--s-4); + mask-image: none; + } +} + +.marqueeRow { + display: flex; + gap: var(--s-2); + + @media (prefers-reduced-motion: reduce) { + flex-wrap: wrap; + justify-content: center; + } +} + +.marqueeGroup { + display: flex; + flex-shrink: 0; + align-items: center; + padding: 0; + margin: 0; + list-style: none; + gap: var(--s-2); + animation: scroll 600s linear infinite; + + @media (prefers-reduced-motion: reduce) { + width: 100%; + flex-wrap: wrap; + justify-content: center; + animation: none; + + &[aria-hidden="true"] { + display: none; + } + } + + .marqueeRow:nth-child(2) > & { + animation-duration: 740s; + animation-direction: reverse; + } + + .marqueeRow:nth-child(3) > & { + animation-duration: 670s; + } + + .marquee:hover & { + animation-play-state: paused; + } +} + +@keyframes scroll { + from { + transform: translateX(0); + } + + to { + transform: translateX(calc(-100% - var(--s-2))); + } +} + +.chip { + display: block; max-width: 250px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - display: block; + font-size: var(--font-xs); + padding: var(--s-1) var(--s-2-5); + border-radius: var(--radius-full); + background-color: var(--color-bg-higher); + color: var(--color-text-accent); } -.copyrightNote { +.cta { + margin-block: calc(var(--s-2) * -1) var(--s-6); +} + +.cards { + display: flex; + flex-wrap: wrap; + justify-content: center; + max-width: 48rem; + gap: var(--s-2); + padding-inline: var(--s-4); + + @container (max-width: 640px) { + display: grid; + align-self: stretch; + max-width: none; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + @container (max-width: 420px) { + grid-template-columns: 1fr; + } +} + +.card { + display: flex; + align-items: center; + min-width: 10.5rem; + gap: var(--s-2); + padding: var(--s-2) var(--s-4); + border-radius: var(--radius-box); + background-color: var(--color-bg-higher); + font-size: var(--font-sm); + font-weight: var(--weight-semi); + + @container (max-width: 640px) { + min-width: 0; + } +} + +.cardIcon { + height: 1.5rem; + width: 1.5rem; + flex-shrink: 0; +} + +.cardHeader { + display: flex; + flex-direction: column; + + & > span { + font-size: var(--font-2xs); + font-weight: var(--weight-body); + color: var(--color-text-high); + } +} + +.privacy { + font-size: var(--font-2xs); +} + +.legal { display: flex; flex-direction: column; color: var(--color-text-high); font-size: var(--font-2xs); text-align: center; + padding-inline: var(--s-4); } -.sourceLink { - margin-inline: auto; +.versionLink { font-size: var(--font-2xs); - color: var(--color-text-high); font-style: italic; + color: var(--color-text-high); } -@media screen and (max-width: 640px) { - .socials { - flex-direction: column; +.sitemap { + display: grid; + width: 100%; + max-width: 44rem; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: var(--s-6); + padding-inline: var(--s-4); + + @container (max-width: 640px) { + grid-template-columns: repeat(2, minmax(0, 1fr)); } - .socialLink { - max-width: initial; - flex-direction: row; - - &:hover > .socialIcon { - transform: translateX(-0.3rem); - } - } - - .socialHeader { - display: flex; - align-items: center; - gap: var(--s-2); - text-align: initial; - - & > p { - margin-block-start: var(--s-1); - } - } - - .socialIcon { - height: 1.75rem; + @container (max-width: 420px) { + grid-template-columns: 1fr; } } + +.sitemapColumn { + display: flex; + flex-direction: column; + gap: var(--s-2); +} + +.sitemapTitle { + font-size: var(--font-2xs); + font-weight: var(--weight-bold); + color: var(--color-text-high); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.sitemapLink { + display: flex; + align-items: center; + gap: var(--s-2); + font-size: var(--font-xs); +} + +.sitemapIcon { + flex-shrink: 0; +} diff --git a/app/components/layout/Footer.tsx b/app/components/layout/Footer.tsx index 65b621ac9..afa44ea5a 100644 --- a/app/components/layout/Footer.tsx +++ b/app/components/layout/Footer.tsx @@ -1,78 +1,241 @@ +import { Braces, CircleHelp, Hand, Heart, HeartHandshake } from "lucide-react"; +import type { ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; +import * as R from "remeda"; import { Config } from "~/config"; -import { useUser } from "~/features/auth/core/user"; +import { leaderboardsPage } from "~/features/leaderboards/leaderboards-urls"; import { usePatrons } from "~/hooks/swr"; +import { useHasRole } from "~/modules/permissions/hooks"; import { GIT_COMMIT } from "~/utils/git-commit"; import { + ANALYZER_URL, API_PAGE, + ART_PAGE, + ARTICLES_MAIN_PAGE, + ASSOCIATIONS_PAGE, + BUILDS_PAGE, + CALENDAR_PAGE, + COMP_ANALYZER_URL, CONTRIBUTIONS_PAGE, + EVENTS_PAGE, FAQ_PAGE, + LFG_PAGE, + LINKS_PAGE, + LUTI_PAGE, + MAPS_URL, NINTENDO_COMMUNITY_TOURNAMENTS_GUIDELINES_URL, + navIconUrl, + OBJECT_DAMAGE_CALCULATOR_URL, + PLANNER_URL, + PLUS_SUGGESTIONS_PAGE, + PLUS_VOTING_RESULTS_PAGE, SENDOU_INK_DISCORD_URL, SENDOU_INK_GITHUB_URL, SENDOU_LOVE_EMOJI_PATH, + SENDOUQ_PAGE, + SENDOUQ_RULES_PAGE, + SETTINGS_PAGE, SUPPORT_PAGE, + scrimsPage, + TIER_LIST_MAKER_URL, + TIERS_PAGE, + TROPHIES_PAGE, userPage, + VODS_PAGE, WELCOME_PAGE, + weaponParamsPage, + XSEARCH_PAGE, } from "~/utils/urls"; - +import { LinkButton } from "../elements/Button"; import { Image } from "../Image"; import { DiscordIcon } from "../icons/Discord"; import { GitHubIcon } from "../icons/GitHub"; import { PatreonIcon } from "../icons/Patreon"; import styles from "./Footer.module.css"; -export function Footer() { - const { t } = useTranslation(); - const user = useUser(); +const MARQUEE_ROWS_COUNT = 3; - const showPrivacySettings = - Config.fuseEnabled && !user?.roles.includes("MINOR_SUPPORT"); +const SITEMAP_COLUMNS = [ + { + title: "nav.play", + items: [ + { name: "sendouq", url: SENDOUQ_PAGE }, + { name: "sendouq", url: SENDOUQ_RULES_PAGE, label: "footer.link.qRules" }, + { name: "sendouq", url: TIERS_PAGE, label: "footer.link.tiers" }, + { name: "scrims", url: scrimsPage() }, + { name: "lfg", url: LFG_PAGE }, + { name: "calendar", url: CALENDAR_PAGE }, + { name: "calendar", url: EVENTS_PAGE, label: "footer.link.events" }, + { + name: "leaderboards", + url: leaderboardsPage({ type: "USER" }), + label: "footer.link.userLeaderboard", + }, + { + name: "leaderboards", + url: leaderboardsPage({ type: "TEAM" }), + label: "footer.link.teamLeaderboard", + }, + { + name: "leaderboards", + url: leaderboardsPage({ type: "XP-ALL" }), + label: "footer.link.xpLeaderboard", + }, + ...(Config.showLutiNavItem + ? [{ name: "luti", url: LUTI_PAGE } as const] + : []), + ], + }, + { + title: "nav.tools", + items: [ + { name: "analyzer", url: ANALYZER_URL }, + { + name: "analyzer", + url: weaponParamsPage("splattershot"), + label: "footer.link.params", + }, + { name: "comp-analyzer", url: COMP_ANALYZER_URL }, + { name: "object-damage-calculator", url: OBJECT_DAMAGE_CALCULATOR_URL }, + { name: "plans", url: PLANNER_URL }, + { name: "maps", url: MAPS_URL }, + { name: "tier-list-maker", url: TIER_LIST_MAKER_URL }, + { name: "xsearch", url: XSEARCH_PAGE }, + { name: "settings", url: SETTINGS_PAGE }, + ], + }, + { + title: "nav.community", + items: [ + { name: "builds", url: BUILDS_PAGE }, + { + name: "associations", + url: ASSOCIATIONS_PAGE, + label: "footer.link.associations", + }, + { name: "art", url: ART_PAGE }, + { name: "articles", url: ARTICLES_MAIN_PAGE }, + { name: "vods", url: VODS_PAGE }, + { name: "trophies", url: TROPHIES_PAGE }, + { name: "links", url: LINKS_PAGE }, + { + name: "plus", + url: PLUS_SUGGESTIONS_PAGE, + label: "footer.link.plusSuggestions", + }, + { + name: "plus", + url: PLUS_VOTING_RESULTS_PAGE, + label: "footer.link.plusVotingResults", + }, + ], + }, +] as const; + +export function Footer() { + const { t } = useTranslation(["common", "front"]); + const isPatron = useHasRole("MINOR_SUPPORT"); + + const showPrivacySettings = Config.fuseEnabled && !isPatron; const currentYear = new Date().getFullYear(); return ( ); } -function PatronsList() { - const { t } = useTranslation(); +type Patron = NonNullable["patrons"]>[number]; + +function PatronMarquee() { const { patrons } = usePatrons(); + if (!patrons || patrons.length === 0) return null; + + const rows = R.chunk(patrons, Math.ceil(patrons.length / MARQUEE_ROWS_COUNT)); + return ( -
-

- {t("footer.thanks")} - -

- +
+ {rows.map((row) => ( +
+ + +
+ ))}
); } + +function PatronChips({ + patrons, + ariaHidden = false, +}: { + patrons: Array; + ariaHidden?: boolean; +}) { + return ( +
    + {patrons.map((patron) => ( +
  • + + {patron.username} + +
  • + ))} +
+ ); +} + +function FooterCard({ + icon, + title, + subtitle, + href, + to, +}: { + icon: ReactNode; + title: string; + subtitle: string; + href?: string; + to?: string; +}) { + const content = ( + <> + {icon} + + {title} + {subtitle} + + + ); + + if (href) { + return ( + + {content} + + ); + } + + return ( + + {content} + + ); +} + +function customThemeChipStyle( + customTheme: Patron["customTheme"], +): React.CSSProperties { + if (!customTheme) return {}; + + return R.pickBy( + customTheme, + (value, key) => + value !== null && !key.includes("--_size") && !key.includes("--_border"), + ) as React.CSSProperties; +} diff --git a/app/features/leaderboards/leaderboards-urls.ts b/app/features/leaderboards/leaderboards-urls.ts index 34f456e0d..ff5152910 100644 --- a/app/features/leaderboards/leaderboards-urls.ts +++ b/app/features/leaderboards/leaderboards-urls.ts @@ -1,9 +1,10 @@ import { LEADERBOARDS_PAGE } from "~/utils/urls"; +import type { LEADERBOARD_TYPES } from "./leaderboards-constants"; import { leaderboardsSearchParams } from "./leaderboards-search-params"; export const leaderboardsPage = (args: { season?: number; - type?: "USER" | "TEAM"; + type?: (typeof LEADERBOARD_TYPES)[number]; }) => leaderboardsSearchParams.href(LEADERBOARDS_PAGE, { season: args.season ?? null, diff --git a/app/features/user-page/UserRepository.server.ts b/app/features/user-page/UserRepository.server.ts index a503580a9..11471e2e3 100644 --- a/app/features/user-page/UserRepository.server.ts +++ b/app/features/user-page/UserRepository.server.ts @@ -499,7 +499,15 @@ export function findModInfoById(id: number) { export function findAllPatrons() { return db .selectFrom("User") - .select(["User.id", "User.discordId", "User.username", "User.patronTier"]) + .select([ + "User.id", + "User.discordId", + "User.username", + "User.patronTier", + asJson( + sql`IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."customTheme", null)`, + ).as("customTheme"), + ]) .where("User.patronTier", "is not", null) .orderBy("User.patronTier", "desc") .orderBy("User.patronStartedAt", "asc") diff --git a/app/utils/urls.ts b/app/utils/urls.ts index 009db86e6..bc67638a8 100644 --- a/app/utils/urls.ts +++ b/app/utils/urls.ts @@ -125,6 +125,9 @@ export const COMP_ANALYZER_URL = "/comp-analyzer"; export const OBJECT_DAMAGE_CALCULATOR_URL = "/object-damage-calculator"; export const SCANNER_PAGE = "/scanner"; export const VODS_PAGE = "/vods"; +export const ART_PAGE = "/art"; +export const XSEARCH_PAGE = "/xsearch"; +export const ASSOCIATIONS_PAGE = "/associations"; export const LEADERBOARDS_PAGE = "/leaderboards"; export const LINKS_PAGE = "/links"; export const SENDOUQ_PAGE = "/q"; @@ -144,6 +147,8 @@ export const FRIENDS_PAGE = "/friends"; export const SETTINGS_PAGE = "/settings"; export const LUTI_PAGE = "/luti"; export const PLUS_VOTING_PAGE = "/plus/voting"; +export const PLUS_VOTING_RESULTS_PAGE = "/plus/voting/results"; +export const PLUS_SUGGESTIONS_PAGE = "/plus/suggestions"; const STATIC_ASSETS_URL = Config.staticAssetsUrl; diff --git a/changelog/2026-08-29-footer-redesign.md b/changelog/2026-08-29-footer-redesign.md new file mode 100644 index 000000000..edccd0308 --- /dev/null +++ b/changelog/2026-08-29-footer-redesign.md @@ -0,0 +1,4 @@ +--- +type: feature +--- +The footer got a redesign diff --git a/e2e/pages/scrims/scrims-page.ts b/e2e/pages/scrims/scrims-page.ts index fd3150f6f..99f142f60 100644 --- a/e2e/pages/scrims/scrims-page.ts +++ b/e2e/pages/scrims/scrims-page.ts @@ -28,7 +28,9 @@ export class ScrimsPage { constructor(page: Page) { this.page = page; this.locators = { - associationsLink: page.getByRole("link", { name: "Associations" }), + associationsLink: page + .getByRole("main") + .getByRole("link", { name: "Associations" }), requestButtons: page.getByTestId("request-scrim-button"), viewRequestButtons: page.getByTestId("view-request-button"), acceptRequestButtons: page.getByTestId("confirm-modal-trigger-button"), diff --git a/locales/da/common.json b/locales/da/common.json index fe3a230e2..234bd28dd 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Støt hjemmesiden", "footer.thanks": "Tak til vores patrons for støtten", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Gem", "actions.unsave": "", diff --git a/locales/de/common.json b/locales/de/common.json index 90edaa0a4..8a0b74e7b 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Support", "footer.thanks": "Danke an die Patrons für den Support", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Speichern", "actions.unsave": "", diff --git a/locales/en/common.json b/locales/en/common.json index 99066ad34..652adf023 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Support", "footer.thanks": "Thanks to the patrons for the support", "footer.version": "Version", + "footer.contributors.subtitle": "The people behind the site", + "footer.faq.subtitle": "Common questions", + "footer.welcome.subtitle": "New here? Get started", + "footer.api.subtitle": "Programmatic access", + "footer.thanks.subtitle": "sendou.ink is made possible by the following people", + "footer.support": "Support sendou.ink", + "footer.link.qRules": "SendouQ rules", + "footer.link.tiers": "Ranking tiers", + "footer.link.events": "Events", + "footer.link.userLeaderboard": "SQ player rankings", + "footer.link.teamLeaderboard": "SQ team rankings", + "footer.link.xpLeaderboard": "X Battle rankings", + "footer.link.params": "Weapon parameters", + "footer.link.associations": "Associations", + "footer.link.plusSuggestions": "Plus suggestions", + "footer.link.plusVotingResults": "Plus voting results", "actions.share": "Share", "actions.save": "Save", "actions.unsave": "Unsave", diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json index f3370feca..2fc34a1d1 100644 --- a/locales/es-ES/common.json +++ b/locales/es-ES/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Apoyar", "footer.thanks": "Gracias a los mecenas por su apoyo", "footer.version": "Versión", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "Compartir", "actions.save": "Guardar", "actions.unsave": "No guardar", diff --git a/locales/es-US/common.json b/locales/es-US/common.json index 734d10d74..6ba4902e5 100644 --- a/locales/es-US/common.json +++ b/locales/es-US/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Apoyar", "footer.thanks": "Gracias a los Patrons por su apoyo", "footer.version": "Versión", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "Compartir", "actions.save": "Guardar", "actions.unsave": "No guardar", diff --git a/locales/fr-CA/common.json b/locales/fr-CA/common.json index 433b604d4..795687d72 100644 --- a/locales/fr-CA/common.json +++ b/locales/fr-CA/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Soutien", "footer.thanks": "Merci à nos Supporters pour le soutien", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Sauvegarder", "actions.unsave": "", diff --git a/locales/fr-EU/common.json b/locales/fr-EU/common.json index 17dfd56d6..b448e6979 100644 --- a/locales/fr-EU/common.json +++ b/locales/fr-EU/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Soutien", "footer.thanks": "Merci à nos Supporters pour le soutien", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Sauvegarder", "actions.unsave": "", diff --git a/locales/he/common.json b/locales/he/common.json index 854b3cdd3..e1079807a 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "תמיכה", "footer.thanks": "תודה לפטרונים על התמיכה", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "שמירה", "actions.unsave": "", diff --git a/locales/it/common.json b/locales/it/common.json index eed4c1bf4..9604f1b35 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Supporto", "footer.thanks": "Mille grazie ai supporter su Patreon!", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Salva", "actions.unsave": "", diff --git a/locales/ja/common.json b/locales/ja/common.json index 1d27a273d..e57a72e53 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "寄付", "footer.thanks": "寄付のご協力ありがとうございます", "footer.version": "バージョン", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "共有", "actions.save": "保存", "actions.unsave": "保存解除", diff --git a/locales/ko/common.json b/locales/ko/common.json index 14a13a971..951475ac9 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "후원", "footer.thanks": "Patreon 후원자들에게 갑사드립니다", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "저장하기", "actions.unsave": "", diff --git a/locales/nl/common.json b/locales/nl/common.json index f92a3ddd8..a1c12c26e 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Steun sendou.ink", "footer.thanks": "Met dank aan alle patrons voor de steun", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Opslaan", "actions.unsave": "", diff --git a/locales/pl/common.json b/locales/pl/common.json index e5d2c05dc..09eb92c4f 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Wsparcie", "footer.thanks": "Dziękujemy patronom za wsparcie", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Zapisz", "actions.unsave": "", diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json index 5b025f6ad..84beda5f6 100644 --- a/locales/pt-BR/common.json +++ b/locales/pt-BR/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Suporte", "footer.thanks": "Obrigado aos patronos e patronesses pelo suporte", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Salvar", "actions.unsave": "", diff --git a/locales/ru/common.json b/locales/ru/common.json index 71e1cf194..a4955321b 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "Поддержать", "footer.thanks": "Спасибо меценатам за поддержку", "footer.version": "", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "", "actions.save": "Сохранить", "actions.unsave": "", diff --git a/locales/zh/common.json b/locales/zh/common.json index 37b0d7a46..c254e8204 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -123,6 +123,22 @@ "footer.patreon.subtitle": "赞助", "footer.thanks": "感谢 Patreon 上的赞助者", "footer.version": "版本", + "footer.contributors.subtitle": "", + "footer.faq.subtitle": "", + "footer.welcome.subtitle": "", + "footer.api.subtitle": "", + "footer.thanks.subtitle": "", + "footer.support": "", + "footer.link.qRules": "", + "footer.link.tiers": "", + "footer.link.events": "", + "footer.link.userLeaderboard": "", + "footer.link.teamLeaderboard": "", + "footer.link.xpLeaderboard": "", + "footer.link.params": "", + "footer.link.associations": "", + "footer.link.plusSuggestions": "", + "footer.link.plusVotingResults": "", "actions.share": "分享", "actions.save": "保存", "actions.unsave": "不保存",