76 lines
2.2 KiB
TypeScript
76 lines
2.2 KiB
TypeScript
|
|
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;
|
||
|
|
};
|