diff --git a/app/pages/countryRegion/index.vue b/app/pages/countryRegion/index.vue index a13fe01..cba249c 100644 --- a/app/pages/countryRegion/index.vue +++ b/app/pages/countryRegion/index.vue @@ -3,37 +3,69 @@ import {ref, computed, watch} from 'vue'; import pinyin from 'pinyin'; import countryCode from './data/index.js'; import { useI18n } from 'vue-i18n' - +import { useRouter } from 'vue-router' +definePageMeta({ + title: '国家地区', + i18n: 'countryRegion.title', +}) +const router = useRouter() const { t, locale } = useI18n() const value = ref(''); const alphabet = [ + '#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; +// 常用国家的代码列表 +const frequentCountryCodes = ['CN', 'TW', 'JP', 'US']; + function groupByPinyinInitial(data) { const grouped = {}; + + // 先处理常用国家 + grouped['#'] = []; data.forEach(country => { - // 根据当前语言选择对应的国家名称 - const countryName = locale.value === 'zh-CN' ? country.cn : - locale.value === 'zh-TW' ? country.tw : - locale.value === 'ja-JP' ? country.ja : - country.en; - - const initial = locale.value === 'ja-JP' ? '' : - locale.value === 'zh-CN' || locale.value === 'zh-TW' ? - pinyin(countryName, {style: pinyin.STYLE_FIRST_LETTER})[0][0].toUpperCase() : - countryName.charAt(0).toUpperCase(); - - if (!grouped[initial]) { - grouped[initial] = []; + if (frequentCountryCodes.includes(country.code)) { + const countryName = locale.value === 'zh-CN' ? country.cn : + locale.value === 'zh-TW' ? country.tw : + locale.value === 'ja-JP' ? country.ja : + country.en; + grouped['#'].push({ + ...country, + displayName: countryName + }); } - grouped[initial].push({ - ...country, - displayName: countryName - }); }); + // 处理其他国家 + data.forEach(country => { + if (!frequentCountryCodes.includes(country.code)) { + const countryName = locale.value === 'zh-CN' ? country.cn : + locale.value === 'zh-TW' ? country.tw : + locale.value === 'ja-JP' ? country.ja : + country.en; + + const initial = locale.value === 'ja-JP' ? '' : + locale.value === 'zh-CN' || locale.value === 'zh-TW' ? + pinyin(countryName, {style: pinyin.STYLE_FIRST_LETTER})[0][0].toUpperCase() : + countryName.charAt(0).toUpperCase(); + + if (!grouped[initial]) { + grouped[initial] = []; + } + grouped[initial].push({ + ...country, + displayName: countryName + }); + } + }); + + if (locale.value === 'ja-JP') { + // 日文环境下按照片假名排序 + grouped[''] = grouped[''].sort((a, b) => a.displayName.localeCompare(b.displayName, 'ja-JP')); + } + return grouped; } @@ -59,6 +91,16 @@ const searchCountry = computed(() => { const showIndexBar = computed(() => locale.value !== 'ja-JP') +const handleCountrySelect = (country) => { + router.push({ + path: '/login', + query: { + zone: country.zone, + countryName: country.displayName + } + }) +} + initData() // 监听语言变化,重新初始化数据 @@ -78,20 +120,58 @@ watch(locale, () => { :sticky-offset-top="55" :index-list="alphabet" > + + {{ t('countryRegion.frequentCountry') }} + +
+{{ country.zone }}
+
+ +
- +
+
{{ t('countryRegion.frequentCountry') }}
+ +
+{{ country.zone }}
+
+
+ +
+{{ country.zone }}