Skip to content

Commit 9b079a9

Browse files
committed
feat(i18n): add message prompt for switching language
1 parent cebc33e commit 9b079a9

6 files changed

Lines changed: 165 additions & 19 deletions

File tree

src/App.vue

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@ import zhTW from 'element-plus/lib/locale/lang/zh-tw'
1212
import en from 'element-plus/lib/locale/lang/en'
1313
import setThemeMode from '@/utils/set-theme-mode'
1414
import { useStore } from '@/stores'
15-
import { getRegionByIP, setWindowTitle, throttle } from '@/utils'
15+
import { getLanguageByRegion, getRegionByIP, setWindowTitle, throttle } from '@/utils'
1616
import { ElementPlusSizeEnum, LanguageEnum } from '@/common/model'
1717
import MainContainer from '@/views/main-container/main-container.vue'
1818
import router from '@/router'
1919
2020
const instance = getCurrentInstance()
2121
const store = useStore()
22-
2322
const userSettings = computed(() => store.getters.getUserSettings).value
24-
2523
const elementPlusSize = ref<ElementPlusSizeEnum>(ElementPlusSizeEnum.default)
2624
const elementPlusLocale = ref(zhCN) // zhCN | zhTW | en
2725
@@ -61,22 +59,52 @@ const setLanguage = (language: LanguageEnum) => {
6159
setWindowTitle(router.currentRoute.value.meta.title as string)
6260
}
6361
64-
const autoSetLanguage = () => {
62+
const initSetLanguage = () => {
63+
// 初始化设置
64+
setLanguage(userSettings.language)
65+
66+
// 根据 IP 自动设置
6567
getRegionByIP().then((region) => {
66-
if (region === 'CN') {
67-
store.dispatch('SET_USER_SETTINGS', {
68-
language: LanguageEnum.zhCN
69-
})
70-
} else if (region === 'HK' || region === 'TW') {
71-
store.dispatch('SET_USER_SETTINGS', {
72-
language: LanguageEnum.zhTW
68+
const language = getLanguageByRegion(region)
69+
70+
if (language !== userSettings.language) {
71+
const confirmTxt = instance?.proxy?.$t(`confirm`, language)
72+
const cancelTxt = instance?.proxy?.$t(`cancel`, language)
73+
const msgTxt = instance?.proxy?.$t(`toggle-language-msg`, language, {
74+
region: instance?.proxy?.$t(`region.${region}`, language),
75+
language: instance?.proxy?.$t(`language.${language}`, language)
7376
})
74-
} else {
75-
store.dispatch('SET_USER_SETTINGS', {
76-
language: LanguageEnum.en
77+
78+
const msgInstance = ElMessage({
79+
customClass: 'toggle-language-message',
80+
duration: 0,
81+
offset: 20,
82+
message: `<div class="content-box">
83+
<span class="msg">${msgTxt}</span>
84+
<spna class="btn-box">
85+
<span class="confirm btn">${confirmTxt}</span>
86+
<span class="cancel btn">${cancelTxt}</span>
87+
</spna>
88+
</div>`,
89+
dangerouslyUseHTMLString: true
7790
})
91+
92+
document
93+
.querySelector('.toggle-language-message .content-box .confirm')
94+
?.addEventListener('click', () => {
95+
setLanguage(language)
96+
store.dispatch('SET_USER_SETTINGS', {
97+
language
98+
})
99+
msgInstance.close()
100+
})
101+
102+
document
103+
.querySelector('.toggle-language-message .content-box .cancel')
104+
?.addEventListener('click', () => {
105+
msgInstance.close()
106+
})
78107
}
79-
setLanguage(userSettings.language)
80108
})
81109
}
82110
@@ -90,7 +118,7 @@ const init = () => {
90118
)
91119
92120
setThemeMode()
93-
autoSetLanguage()
121+
initSetLanguage()
94122
}
95123
96124
watch(

src/locales/en.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"delete": "Delete",
77
"reset": "Reset",
88
"confirm": "Confirm",
9+
"cancel": "Cancel",
910
"author": "Author",
1011
"document": "Document",
1112
"shortcut_key": "Shortcut key",
@@ -217,5 +218,20 @@
217218
"text_2": "We suggest adding our website to your browser bookmarks for easy future access.",
218219
"text_3": "If PicX is helpful to you, please consider donating to the author to support open source development.",
219220
"text_4": "Disclaimer: Do not upload images that violate the laws in your local jurisdiction. The author is not responsible for any consequences arising from such actions."
220-
}
221+
},
222+
"region": {
223+
"CN": "Mainland China",
224+
"HK": "Hong Kong, China",
225+
"MO": "Macao, China",
226+
"TW": "Taiwan, China",
227+
"SG": "Singapore",
228+
"JP": "Japan",
229+
"US": "United States"
230+
},
231+
"language": {
232+
"zh-CN": "Simplified Chinese",
233+
"zh-TW": "Traditional Chinese",
234+
"en": "English"
235+
},
236+
"toggle-language-msg": "We detected that your IP is located in {region}. Do you want to switch to {language}?"
221237
}

src/locales/zh-CN.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"delete": "删除",
77
"reset": "重置",
88
"confirm": "确认",
9+
"cancel": "取消",
910
"author": "作者",
1011
"document": "文档",
1112
"shortcut_key": "快捷键",
@@ -219,5 +220,20 @@
219220
"text_2": "建议将本站添加到浏览器收藏夹,方便下次使用。",
220221
"text_3": "如果 PicX 对你有帮助,欢迎赞赏作者,支持开源。",
221222
"text_4": "郑重声明:请勿使用 PicX 上传违反你当地法律的图片,所造成的一切后果与作者无关。"
222-
}
223+
},
224+
"region": {
225+
"CN": "中国大陆",
226+
"HK": "中国香港",
227+
"MO": "中国澳门",
228+
"TW": "中国台湾",
229+
"SG": "新加坡",
230+
"JP": "日本",
231+
"US": "美国"
232+
},
233+
"language": {
234+
"zh-CN": "中文简体",
235+
"zh-TW": "中文繁体",
236+
"en": "英文"
237+
},
238+
"toggle-language-msg": "检测到你的 IP 所属地为{region},是否切换{language}?"
223239
}

src/locales/zh-TW.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"delete": "刪除",
77
"reset": "重置",
88
"confirm": "確認",
9+
"cancel": "取消",
910
"author": "作者",
1011
"document": "文檔",
1112
"shortcut_key": "快捷鍵",
@@ -219,5 +220,20 @@
219220
"text_2": "建議將本站添加到瀏覽器收藏夾,方便下次使用。",
220221
"text_3": "如果 PicX 對你有幫助,歡迎贊賞作者,支持開源。",
221222
"text_4": "鄭重聲明:請勿使用 PicX 上傳違反你當地法律的圖片,所造成的一切後果與作者無關。"
222-
}
223+
},
224+
"region": {
225+
"CN": "中國大陸",
226+
"HK": "中國香港",
227+
"MO": "中国澳门",
228+
"TW": "中國臺灣",
229+
"SG": "新加坡",
230+
"JP": "日本",
231+
"US": "美國"
232+
},
233+
"language": {
234+
"zh-CN": "中文簡體",
235+
"zh-TW": "中文繁體",
236+
"en": "英文"
237+
},
238+
"toggle-language-msg": "檢測到你的 IP 所屬地為{region},是否切換{language}?"
223239
}

src/styles/base.styl

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,58 @@ li {
194194
}
195195

196196

197+
.toggle-language-message {
198+
box-sizing border-box
199+
background var(--background-color)
200+
border-radius 3rem
201+
box-shadow var(--el-box-shadow-light)
202+
203+
.el-icon {
204+
display none
205+
}
206+
207+
.content-box {
208+
line-height 2
209+
210+
.btn-box {
211+
margin-left 6rem
212+
}
213+
214+
.btn {
215+
margin-left 2rem
216+
padding 2rem 4rem
217+
font-size 12rem
218+
border-style solid
219+
border-width 1rem
220+
border-radius 4rem
221+
cursor pointer
222+
}
223+
224+
.confirm {
225+
color var(--el-color-primary)
226+
background var(--el-color-primary-light-9)
227+
border-color var(--el-color-primary-light-5)
228+
229+
&:hover {
230+
color var(--el-color-white)
231+
background var(--el-color-primary)
232+
border-color var(--el-color-primary)
233+
}
234+
}
235+
236+
.cancel {
237+
color var(--el-color-info)
238+
background var(--el-color-info-light-9)
239+
border-color var(--el-color-info-light-5)
240+
241+
&:hover {
242+
color var(--el-color-white)
243+
background var(--el-color-info)
244+
border-color var(--el-color-info)
245+
}
246+
}
247+
}
248+
}
249+
250+
251+

src/utils/system.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import axios from 'axios'
2+
import { LanguageEnum } from '@/common/model'
23

34
/**
45
* 判断系统是否是黑暗模式
@@ -47,3 +48,17 @@ export const getRegionByIP = async (): Promise<'CN' | 'HK' | 'TW' | 'SG' | 'US'>
4748
return Promise.resolve('CN')
4849
}
4950
}
51+
52+
/**
53+
* 根据地区编码获取语言枚举
54+
* @param region
55+
*/
56+
export const getLanguageByRegion = (region: string): LanguageEnum => {
57+
if (region === 'CN') {
58+
return LanguageEnum.zhCN
59+
}
60+
if (region === 'HK' || region === 'TW' || region === 'MO') {
61+
return LanguageEnum.zhTW
62+
}
63+
return LanguageEnum.en
64+
}

0 commit comments

Comments
 (0)