Files
portfolio/nextjs/components/ui/language-toggle.tsx
Mayne0213 232d0d8762
Some checks failed
Build Docker Image / build-and-push (push) Has been cancelled
CI / lint-and-build (push) Has been cancelled
REFACTOR(repo): simplify project structure
- Move services/nextjs/ to nextjs/
- Move Dockerfile.prod to Dockerfile at root
- Remove deploy/ folder (K8s manifests moved to K3S-HOME/web-apps)
- Remove .gitea/ workflows
- Update GitHub Actions for new structure
- Remove develop branch triggers
2026-01-05 02:02:29 +09:00

59 lines
1.8 KiB
TypeScript

'use client';
import * as React from 'react';
import { Languages } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { usePathname, useRouter } from '@/i18n/routing';
import { useParams } from 'next/navigation';
const LANGUAGES = [
{ code: 'ko', name: '한국어', flag: '🇰🇷' },
{ code: 'en', name: 'English', flag: '🇺🇸' },
{ code: 'de', name: 'Deutsch', flag: '🇩🇪' },
];
export function LanguageToggle() {
const router = useRouter();
const pathname = usePathname();
const params = useParams();
const currentLocale = params.locale as string;
const handleLanguageChange = (locale: string) => {
router.replace(pathname, { locale: locale as any });
};
const currentLanguage = LANGUAGES.find(lang => lang.code === currentLocale) || LANGUAGES[0];
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon" className="ml-2">
<Languages className="h-[1.2rem] w-[1.2rem]" />
<span className="sr-only">Toggle language</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{LANGUAGES.map((language) => (
<DropdownMenuItem
key={language.code}
onClick={() => handleLanguageChange(language.code)}
className="cursor-pointer"
>
<span className="mr-2">{language.flag}</span>
{language.name}
{currentLanguage.code === language.code && (
<span className="ml-2"></span>
)}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
);
}