merge: fix: fix ssr teleports and i18n #26
This commit is contained in:
parent
72a301bfee
commit
e1bea3e923
|
@ -43,8 +43,8 @@ const injectTeleports = (
|
|||
appType: 'custom',
|
||||
})
|
||||
|
||||
// 解析accept-language
|
||||
function parseAcceptLanguage(acceptLanguage: string) {
|
||||
// Parse accept-language
|
||||
const parseAcceptLanguage = (acceptLanguage: string) => {
|
||||
const languages = acceptLanguage.split(',')
|
||||
const language = languages[0]
|
||||
const country = language.split('-')[1]
|
||||
|
|
25
src/components/alert/loli.ts
Normal file
25
src/components/alert/loli.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Function to get a random number
|
||||
import { randomNum } from '@/utils/random'
|
||||
// Get a local image file; note that you cannot use @ as the base path here, you can only use ..
|
||||
const getAssetsFile = (name: string) => {
|
||||
return new URL(`../../assets/images/alert/${name}.webp`, import.meta.url).href
|
||||
}
|
||||
|
||||
const number = randomNum(0, 2)
|
||||
|
||||
let loli = ''
|
||||
let name = ''
|
||||
|
||||
if (number === 0) {
|
||||
// Actually, her full name is: アーデルハイト・フォン・ベルクシュトラーセ
|
||||
name = 'あーちゃん'
|
||||
loli = getAssetsFile(name)
|
||||
} else if (number === 1) {
|
||||
name = 'こじかひわ'
|
||||
loli = getAssetsFile(name)
|
||||
} else {
|
||||
name = '雪々'
|
||||
loli = getAssetsFile(name)
|
||||
}
|
||||
|
||||
export default { loli, name }
|
58
src/components/capture/questionsCN.ts
Normal file
58
src/components/capture/questionsCN.ts
Normal file
|
@ -0,0 +1,58 @@
|
|||
import { reactive } from 'vue'
|
||||
|
||||
interface Question {
|
||||
id: number
|
||||
text: string
|
||||
options: string[]
|
||||
correctOption: string
|
||||
}
|
||||
|
||||
export const questionsCN: Question[] = reactive([
|
||||
{
|
||||
id: 1,
|
||||
text: '下列哪个不是《千恋*万花》中的角色?',
|
||||
options: ['丛雨', '芦花', '芳乃', '七海'],
|
||||
correctOption: '七海',
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
text: '《夏日口袋》中紬文德斯的发色是?',
|
||||
options: ['红色', '金色', '紫色', '白色'],
|
||||
correctOption: '金色',
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
text: '`Galgame`被称为?',
|
||||
options: ['Gay game', '美少女游戏', '乙女游戏', '啊这可海星'],
|
||||
correctOption: '美少女游戏',
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
text: '下列哪个游戏不属于五彩斑斓系列?',
|
||||
options: [
|
||||
'五彩斑斓的世界',
|
||||
'五彩斑斓的曙光',
|
||||
'红瞳映入的世界',
|
||||
'五彩斑斓的未来',
|
||||
],
|
||||
correctOption: '五彩斑斓的未来',
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
text: '以下哪部作品中男主没有女装?',
|
||||
options: ['近月少女的礼仪', '少女 * 领域', '美少女万华镜1', '我们没有翅膀'],
|
||||
correctOption: '美少女万华镜1',
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
text: '以下哪个作品是《SMEE》制作的?',
|
||||
options: ['~Friend to Lover~', 'Dal Segno', 'Eden*', 'LOOPERS'],
|
||||
correctOption: '~Friend to Lover~',
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
text: '鲲可爱吗?',
|
||||
options: ['可爱!', '很可爱!', '最可爱了!', '总之就是非常可爱!'],
|
||||
correctOption: '总之就是非常可爱!',
|
||||
},
|
||||
])
|
63
src/components/capture/questionsEN.ts
Normal file
63
src/components/capture/questionsEN.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
import { reactive } from 'vue'
|
||||
|
||||
export interface Question {
|
||||
id: number
|
||||
text: string
|
||||
options: string[]
|
||||
correctOption: string
|
||||
}
|
||||
|
||||
export const questionsEN: Question[] = reactive([
|
||||
{
|
||||
id: 1,
|
||||
text: 'Which one of the following is not a character in "Senren * Banka"?',
|
||||
options: ['Murasame', 'Roka', 'Yoshino', 'Nanami'],
|
||||
correctOption: 'Nanami',
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
text: 'What is the hair color of Tsumugi Wenders in " Summer Pockets REFLECTION BLUE"?',
|
||||
options: ['Red', 'Gold', 'Purple', 'White'],
|
||||
correctOption: 'Gold',
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
text: 'What is "Visual Novel" known as?',
|
||||
options: ['Gay game', 'Galgame', 'Otome game', 'Ah, this is a starfish'],
|
||||
correctOption: 'Galgame',
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
text: 'Which of the following games does not belong to the "Irotoridori" series?',
|
||||
options: [
|
||||
'Irotoridori no Sekai',
|
||||
'Irotoridori no Hikari',
|
||||
'Akai Hitomi ni Utsuru Sekai',
|
||||
'Irotoridori no Mirai',
|
||||
],
|
||||
correctOption: 'Irotoridori no Mirai',
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
text: 'In which of the following games does the male protagonist not cross-dress?',
|
||||
options: [
|
||||
'Tsuki ni Yorisou Otome no Sahou',
|
||||
'Otome * Domain',
|
||||
'Bishoujo Mangekyou 1',
|
||||
'Ore-tachi ni Tsubasa wa Nai',
|
||||
],
|
||||
correctOption: 'Bishoujo Mangekyou 1',
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
text: 'Which of the following games was produced by "SMEE"?',
|
||||
options: ['~Friend to Lover~', 'Dal Segno', 'Eden*', 'LOOPERS'],
|
||||
correctOption: '~Friend to Lover~',
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
text: 'Is Kun cute?',
|
||||
options: ['Cute!', 'Very cute!', 'Cutest!', 'In short, extremely cute!'],
|
||||
correctOption: 'In short, extremely cute!',
|
||||
},
|
||||
])
|
|
@ -65,15 +65,16 @@ export const render = async (
|
|||
const renderedPinia = JSON.stringify(pinia.state.value)
|
||||
|
||||
// i18n
|
||||
app.use(createI18n(
|
||||
language.includes('zh') ? 'zh' : 'en',
|
||||
))
|
||||
app.use(createI18n(language.includes('zh') ? 'zh' : 'en'))
|
||||
|
||||
const renderCtx: { modules?: string[] } = {}
|
||||
const renderCtx: Record<string, string[] | {}> = {}
|
||||
|
||||
const renderedHtml = await renderToString(app, renderCtx)
|
||||
|
||||
const renderedLinks = renderPreloadLinks(renderCtx.modules, manifest)
|
||||
const renderedLinks = renderPreloadLinks(
|
||||
renderCtx.modules as string[],
|
||||
manifest
|
||||
)
|
||||
|
||||
const renderedTeleports = renderCtx.teleports as {
|
||||
'#teleported': string
|
||||
|
|
|
@ -6,13 +6,14 @@ import { KUNGalgameLanguage } from '@/utils/getDefaultEnv'
|
|||
import zh from './zh'
|
||||
import en from './en'
|
||||
|
||||
const createI18n = (language?: string) => _createI18n({
|
||||
locale: language || KUNGalgameLanguage,
|
||||
legacy: false,
|
||||
messages: {
|
||||
zh,
|
||||
en,
|
||||
},
|
||||
})
|
||||
const createI18n = (language?: string) =>
|
||||
_createI18n({
|
||||
locale: language || KUNGalgameLanguage,
|
||||
legacy: false,
|
||||
messages: {
|
||||
zh,
|
||||
en,
|
||||
},
|
||||
})
|
||||
|
||||
export default createI18n
|
||||
|
|
60
src/router/guard/permission.ts
Normal file
60
src/router/guard/permission.ts
Normal file
|
@ -0,0 +1,60 @@
|
|||
// Import rooter
|
||||
import { Router } from 'vue-router'
|
||||
import { whiteList } from '../router'
|
||||
import { useKUNGalgameUserStore } from '@/store/modules/kungalgamer'
|
||||
import { storeToRefs } from 'pinia'
|
||||
|
||||
import NProgress from 'nprogress'
|
||||
import '@/styles/nprogress/nprogress.scss'
|
||||
|
||||
// Do not display the NProgress spinner
|
||||
NProgress.configure({ showSpinner: false })
|
||||
|
||||
export const createPermission = (router: Router) => {
|
||||
router.beforeEach(async (to, from) => {
|
||||
NProgress.start()
|
||||
|
||||
const token = useKUNGalgameUserStore().getToken()
|
||||
const { uid, roles } = storeToRefs(useKUNGalgameUserStore())
|
||||
|
||||
const isInWhitelist = whiteList.includes(to.name as string)
|
||||
// Get the required permissions for the target route
|
||||
const requiredPermissions = to.meta.permission
|
||||
? (to.meta.permission as number[])
|
||||
: [1, 2, 3, 4]
|
||||
|
||||
if (!token && !isInWhitelist) {
|
||||
NProgress.done()
|
||||
return { name: 'Login' }
|
||||
}
|
||||
|
||||
// Authentication is required
|
||||
const currentPageUid = parseInt(to.params.uid as string)
|
||||
|
||||
const currentUserRoles = () => {
|
||||
if (currentPageUid === uid.value) {
|
||||
return 4
|
||||
} else {
|
||||
return roles.value
|
||||
}
|
||||
}
|
||||
|
||||
if (!requiredPermissions.includes(currentUserRoles())) {
|
||||
if (to.matched[0].path === '/kungalgamer') {
|
||||
return { name: 'KUNGalgamerInfo' }
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
!requiredPermissions.includes(currentUserRoles()) &&
|
||||
to.name === '403'
|
||||
) {
|
||||
return { name: '403' }
|
||||
}
|
||||
})
|
||||
|
||||
// Finish NProgress
|
||||
router.afterEach(() => {
|
||||
NProgress.done()
|
||||
})
|
||||
}
|
Loading…
Reference in a new issue