feat(i18n) : add personal languages and compact weapon exports
CI / Verify (push) Successful in 1m18s
CI / Build immutable images and deploy (push) Successful in 1m57s

This commit is contained in:
2026-09-14 16:44:44 +07:00 Unverified
parent f214d330f0
commit e0794822b1
72 changed files with 4199 additions and 1011 deletions
+7 -2
View File
@@ -1,3 +1,7 @@
"use client"
import { useTranslation } from "@/components/i18n/locale-provider";
import { Text } from "@/components/i18n/text"
import * as React from "react"
import { mergeProps } from "@base-ui/react/merge-props"
import { useRender } from "@base-ui/react/use-render"
@@ -6,9 +10,10 @@ import { cn } from "@/lib/utils"
import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react"
function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) {
const { t } = useTranslation();
return (
<nav
aria-label="breadcrumb"
aria-label={t("breadcrumb")}
data-slot="breadcrumb"
className={cn(className)}
{...props}
@@ -109,7 +114,7 @@ function BreadcrumbEllipsis({
>
<MoreHorizontalIcon
/>
<span className="sr-only">More</span>
<span className="sr-only"><Text message="More" /></span>
</span>
)
}
+3 -2
View File
@@ -1,5 +1,6 @@
"use client"
import { Text } from "@/components/i18n/text"
import * as React from "react"
import useEmblaCarousel, {
type UseEmblaCarouselType,
@@ -198,7 +199,7 @@ function CarouselPrevious({
{...props}
>
<ChevronLeftIcon />
<span className="sr-only">Previous slide</span>
<span className="sr-only"><Text message="Previous slide" /></span>
</Button>
)
}
@@ -228,7 +229,7 @@ function CarouselNext({
{...props}
>
<ChevronRightIcon />
<span className="sr-only">Next slide</span>
<span className="sr-only"><Text message="Next slide" /></span>
</Button>
)
}
+4 -2
View File
@@ -1,6 +1,7 @@
"use client"
import * as React from "react"
import { useTranslation } from "@/components/i18n/locale-provider"
import { Command as CommandPrimitive } from "cmdk"
import { cn } from "@/lib/utils"
@@ -47,11 +48,12 @@ function CommandDialog({
showCloseButton?: boolean
children: React.ReactNode
}) {
const { t } = useTranslation()
return (
<Dialog {...props}>
<DialogHeader className="sr-only">
<DialogTitle>{title}</DialogTitle>
<DialogDescription>{description}</DialogDescription>
<DialogTitle>{t(title)}</DialogTitle>
<DialogDescription>{t(description)}</DialogDescription>
</DialogHeader>
<DialogContent
className={cn(
+2 -1
View File
@@ -1,5 +1,6 @@
"use client"
import { Text } from "@/components/i18n/text"
import * as React from "react"
import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
@@ -72,7 +73,7 @@ function DialogContent({
>
<XIcon
/>
<span className="sr-only">Close</span>
<span className="sr-only"><Text message="Close" /></span>
</DialogPrimitive.Close>
)}
</DialogPrimitive.Popup>
+11 -4
View File
@@ -1,3 +1,7 @@
"use client"
import { useTranslation } from "@/components/i18n/locale-provider";
import { Text } from "@/components/i18n/text"
import * as React from "react"
import { cn } from "@/lib/utils"
@@ -5,10 +9,11 @@ import { Button } from "@/components/ui/button"
import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from "lucide-react"
function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
const { t } = useTranslation();
return (
<nav
role="navigation"
aria-label="pagination"
aria-label={t("pagination")}
data-slot="pagination"
className={cn("mx-auto flex w-full justify-center", className)}
{...props}
@@ -67,9 +72,10 @@ function PaginationPrevious({
text = "Previous",
...props
}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
const { t } = useTranslation();
return (
<PaginationLink
aria-label="Go to previous page"
aria-label={t("Go to previous page")}
size="default"
className={cn("pl-1.5!", className)}
{...props}
@@ -85,9 +91,10 @@ function PaginationNext({
text = "Next",
...props
}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
const { t } = useTranslation();
return (
<PaginationLink
aria-label="Go to next page"
aria-label={t("Go to next page")}
size="default"
className={cn("pr-1.5!", className)}
{...props}
@@ -114,7 +121,7 @@ function PaginationEllipsis({
>
<MoreHorizontalIcon
/>
<span className="sr-only">More pages</span>
<span className="sr-only"><Text message="More pages" /></span>
</span>
)
}
+2 -1
View File
@@ -1,5 +1,6 @@
"use client"
import { Text } from "@/components/i18n/text"
import * as React from "react"
import { Dialog as SheetPrimitive } from "@base-ui/react/dialog"
@@ -72,7 +73,7 @@ function SheetContent({
>
<XIcon
/>
<span className="sr-only">Close</span>
<span className="sr-only"><Text message="Close" /></span>
</SheetPrimitive.Close>
)}
</SheetPrimitive.Popup>
+8 -5
View File
@@ -1,5 +1,7 @@
"use client"
import { useTranslation } from "@/components/i18n/locale-provider";
import { Text } from "@/components/i18n/text"
import * as React from "react"
import { mergeProps } from "@base-ui/react/merge-props"
import { useRender } from "@base-ui/react/use-render"
@@ -196,8 +198,8 @@ function Sidebar({
side={side}
>
<SheetHeader className="sr-only">
<SheetTitle>Sidebar</SheetTitle>
<SheetDescription>Displays the mobile sidebar.</SheetDescription>
<SheetTitle><Text message="Sidebar" /></SheetTitle>
<SheetDescription><Text message="Displays the mobile sidebar." /></SheetDescription>
</SheetHeader>
<div className="flex h-full w-full flex-col">{children}</div>
</SheetContent>
@@ -272,22 +274,23 @@ function SidebarTrigger({
{...props}
>
<PanelLeftIcon />
<span className="sr-only">Toggle Sidebar</span>
<span className="sr-only"><Text message="Toggle Sidebar" /></span>
</Button>
)
}
function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
const { t } = useTranslation();
const { toggleSidebar } = useSidebar()
return (
<button
data-sidebar="rail"
data-slot="sidebar-rail"
aria-label="Toggle Sidebar"
aria-label={t("Toggle Sidebar")}
tabIndex={-1}
onClick={toggleSidebar}
title="Toggle Sidebar"
title={t("Toggle Sidebar")}
className={cn(
"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2",
"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
+5 -1
View File
@@ -1,9 +1,13 @@
"use client"
import { useTranslation } from "@/components/i18n/locale-provider"
import { cn } from "@/lib/utils"
import { Loader2Icon } from "lucide-react"
function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
const { t } = useTranslation()
return (
<Loader2Icon data-slot="spinner" role="status" aria-label="Loading" className={cn("size-4 animate-spin", className)} {...props} />
<Loader2Icon data-slot="spinner" role="status" aria-label={t("Loading")} className={cn("size-4 animate-spin", className)} {...props} />
)
}