import { parseAcceptLanguage, parseGeoLocale, resolveSuggestedLocale, } from '../../src/comm/i18n/geo'; describe('T18: Geo / 浏览器语言自动建议', () => { describe('parseAcceptLanguage', () => { it('应将 zh* 映射为 zh-CN', () => { expect(parseAcceptLanguage('zh-CN,zh;q=0.9,en;q=0.8')).toBe('zh-CN'); expect(parseAcceptLanguage('zh')).toBe('zh-CN'); expect(parseAcceptLanguage('zh-TW')).toBe('zh-CN'); expect(parseAcceptLanguage('zh-Hans-CN')).toBe('zh-CN'); }); it('应将 ar* 映射为 ar-SA', () => { expect(parseAcceptLanguage('ar-SA,ar;q=0.8')).toBe('ar-SA'); expect(parseAcceptLanguage('ar')).toBe('ar-SA'); expect(parseAcceptLanguage('ar-EG')).toBe('ar-SA'); }); it('应将 en* 映射为 en-US', () => { expect(parseAcceptLanguage('en-US,en;q=0.9')).toBe('en-US'); expect(parseAcceptLanguage('en')).toBe('en-US'); expect(parseAcceptLanguage('en-GB')).toBe('en-US'); }); it('未识别语言应回退 en-US', () => { expect(parseAcceptLanguage('fr-FR,fr;q=0.9')).toBe('en-US'); expect(parseAcceptLanguage('ja,en;q=0.1')).toBe('en-US'); expect(parseAcceptLanguage('')).toBe('en-US'); expect(parseAcceptLanguage(undefined)).toBe('en-US'); }); it('应按 q 值选择首选语言', () => { expect(parseAcceptLanguage('en;q=0.4,zh-CN;q=0.9')).toBe('zh-CN'); expect(parseAcceptLanguage('ar;q=0.2,en-US;q=0.8')).toBe('en-US'); }); }); describe('parseGeoLocale', () => { it('应将 CN/TW/HK 映射为 zh-CN', () => { expect(parseGeoLocale({ 'cf-ipcountry': 'CN' })).toBe('zh-CN'); expect(parseGeoLocale({ 'x-country': 'TW' })).toBe('zh-CN'); expect(parseGeoLocale({ 'CF-IPCountry': 'hk' })).toBe('zh-CN'); }); it('应将 SA/AE/EG 映射为 ar-SA', () => { expect(parseGeoLocale({ 'cf-ipcountry': 'SA' })).toBe('ar-SA'); expect(parseGeoLocale({ 'x-country': 'AE' })).toBe('ar-SA'); expect(parseGeoLocale({ 'X-Country': 'eg' })).toBe('ar-SA'); }); it('其余国家应回退 en-US', () => { expect(parseGeoLocale({ 'cf-ipcountry': 'US' })).toBe('en-US'); expect(parseGeoLocale({ 'x-country': 'JP' })).toBe('en-US'); expect(parseGeoLocale({})).toBe('en-US'); expect(parseGeoLocale(undefined)).toBe('en-US'); }); it('应优先使用 cf-ipcountry 再回退 x-country', () => { expect( parseGeoLocale({ 'cf-ipcountry': 'SA', 'x-country': 'CN', }) ).toBe('ar-SA'); expect(parseGeoLocale({ 'x-country': 'CN' })).toBe('zh-CN'); }); }); describe('resolveSuggestedLocale 优先级', () => { it('query.lang 应优先于 Accept-Language 与 geo country', () => { expect( resolveSuggestedLocale({ lang: 'ar', headers: { 'accept-language': 'zh-CN,zh;q=0.9', 'cf-ipcountry': 'US', }, }) ).toBe('ar-SA'); expect( resolveSuggestedLocale({ lang: 'zh-TW', headers: { 'accept-language': 'en-US', 'x-country': 'SA', }, }) ).toBe('zh-CN'); }); it('无 query.lang 时应采用 Accept-Language', () => { expect( resolveSuggestedLocale({ headers: { 'accept-language': 'ar-EG,ar;q=0.8', 'cf-ipcountry': 'US', }, }) ).toBe('ar-SA'); }); it('无 query.lang 与 Accept-Language 时应采用 geo country', () => { expect( resolveSuggestedLocale({ headers: { 'cf-ipcountry': 'HK', }, }) ).toBe('zh-CN'); expect( resolveSuggestedLocale({ headers: { 'x-country': 'EG', }, }) ).toBe('ar-SA'); }); it('全无信号时应回退 en-US', () => { expect(resolveSuggestedLocale({})).toBe('en-US'); expect(resolveSuggestedLocale({ lang: ' ', headers: {} })).toBe('en-US'); }); }); });