TechCorp/lib/i18n/utils.ts

76 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-09-16 17:40:37 +08:00
import { Language, defaultLanguage, isValidLanguage } from './config';
export const getLanguageFromPath = (pathname: string, search?: string): Language => {
// 首页、产品页面和新闻页面支持 ?lang=xx
if (
(pathname === '/' || pathname === '' || pathname === '/products' || pathname === '/news') &&
search
) {
const params = new URLSearchParams(search);
const lang = params.get('lang');
if (lang && isValidLanguage(lang)) {
return lang as Language;
}
}
const segments = pathname.split('/').filter(Boolean);
const firstSegment = segments[0];
if (firstSegment && isValidLanguage(firstSegment)) {
return firstSegment;
}
return defaultLanguage;
};
export const removeLanguageFromPath = (pathname: string): string => {
const segments = pathname.split('/').filter(Boolean);
const firstSegment = segments[0];
if (firstSegment && isValidLanguage(firstSegment)) {
return '/' + segments.slice(1).join('/');
}
return pathname;
};
export const addLanguageToPath = (pathname: string, language: Language): string => {
if (language === defaultLanguage) {
return pathname;
}
const cleanPath = removeLanguageFromPath(pathname);
return `/${language}${cleanPath === '/' ? '' : cleanPath}`;
};
export const getStoredLanguage = (): Language => {
if (typeof window === 'undefined') return defaultLanguage;
const stored = localStorage.getItem('preferred-language');
if (stored && isValidLanguage(stored)) {
return stored;
}
return defaultLanguage;
};
export const setStoredLanguage = (language: Language): void => {
if (typeof window === 'undefined') return;
localStorage.setItem('preferred-language', language);
};
export const getBrowserLanguage = (): Language => {
if (typeof window === 'undefined') return defaultLanguage;
const browserLang = navigator.language.toLowerCase();
if (browserLang.startsWith('zh-cn') || browserLang.startsWith('zh-hans')) {
return 'zh-CN';
}
if (browserLang.startsWith('zh-tw') || browserLang.startsWith('zh-hant')) {
return 'zh-TW';
}
if (browserLang.startsWith('en')) {
return 'en';
}
return defaultLanguage;
};