translation #52

This commit is contained in:
2026-02-06 17:54:21 +02:00
parent 3e9524b4b2
commit 8c804577d1
14 changed files with 140 additions and 67 deletions
+3 -12
View File
@@ -1,16 +1,7 @@
<template>
<!-- <v-navigation-drawer width="133" class="d-none">
<v-btn-toggle variant="tonal" density="comfortable" class="ma-3" v-model="renderType" color="light-blue-darken-4">
<v-btn value="ST" icon="mdi-video-3d-variant"></v-btn>
<v-btn value="VR" icon="mdi-google-cardboard"></v-btn>
<v-btn value="AG" icon="mdi-glasses"></v-btn>
</v-btn-toggle>
<v-btn-toggle variant="tonal" v-model="store.prefs.xr.depthSense" class="ma-3" density="comfortable" color="green-darken-2">
<v-btn :value="true" icon="mdi-cube-outline"></v-btn>
</v-btn-toggle>
<v-btn icon="mdi-walk" @click="control"></v-btn>
</v-navigation-drawer> -->
<v-btn icon="mdi-fullscreen" @click="fullScreen"></v-btn>
<v-navigation-drawer width="133" rail location="right">
<v-btn icon="mdi-fullscreen" @click="fullScreen" variant="text" v-tooltip="l.fullScreen"></v-btn>
</v-navigation-drawer>
<div class="container my-3 position-relative ">
<div ref="target" @click="targetClick" class="game-play-canvas"
@mousedown="targetPointer($event, 'start')"
@@ -5,7 +5,7 @@
</div>
<asset-selector @select="assignCharacter" :type="['Character']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Select character</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.selectCharacter }}</v-btn>
</template>
</asset-selector>
</template>
@@ -1,13 +1,13 @@
<template>
<div v-if="modelValue.go">
<v-select label="Dimension" v-model="modelValue.dimension" :items="['3x3', '5x4', '6x6']" density="compact"></v-select>
<v-select :label="l.dimensions" v-model="modelValue.dimension" :items="['3x3', '5x4', '6x6']" density="compact"></v-select>
<v-textarea :label="l.description" v-model="modelValue.introText"></v-textarea>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
</div>
<asset-selector @select="assignTexture" :type="['Texture']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Choose image object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
</template>
</asset-selector>
</template>
@@ -2,13 +2,13 @@
<div>
<asset-selector @select="assignGameObject" :type="['GameObject']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-panorama-outline" color="success" block>Choose game object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-panorama-outline" color="success" block>{{ l.chooseGameObject }}</v-btn>
</template>
</asset-selector>
<v-textarea :label="l.description" v-model="modelValue.description" class="mt-3"></v-textarea>
<v-checkbox density="compact" v-model="modelValue.hud" hide-details label="Observe in head-up display"></v-checkbox>
<v-checkbox density="compact" v-model="modelValue.exclude" hide-details label="Disable interactions"></v-checkbox>
<v-checkbox density="compact" v-model="modelValue.noPhysics" hide-details label="Disable collisions"></v-checkbox>
<v-checkbox density="compact" v-model="modelValue.hud" hide-details :label="l.viewInHUD"></v-checkbox>
<v-checkbox density="compact" v-model="modelValue.exclude" hide-details :label="l.disableInteractions"></v-checkbox>
<v-checkbox density="compact" v-model="modelValue.noPhysics" hide-details :label="l.disableCollisions"></v-checkbox>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
</div>
@@ -1,7 +1,7 @@
<template>
<v-dialog max-width="1400" scrollable>
<template v-slot:activator="{ props: activatorProps }">
<v-btn v-bind="activatorProps">Manage Questions</v-btn>
<v-btn v-bind="activatorProps">{{ l.manageQuestions }}</v-btn>
</template>
<template v-slot:default="{ isActive }">
@@ -10,7 +10,7 @@
<div class="d-flex flex-wrap w-100">
<v-card v-for="(n, ni) in modelValue.questions" class="v-col-6" variant="outlined" border="0">
<v-card-item>
<v-text-field density="compact" hide-details :label="`Question #${ni+1}`" v-model="n.q" class="py-2">
<v-text-field density="compact" hide-details :label="`${l.question} #${ni+1}`" v-model="n.q" class="py-2">
<template v-slot:append>
<v-btn variant="plain" color="error" @click="deleteQuestion(ni)">
<v-icon icon="mdi-delete-forever"></v-icon>
@@ -18,12 +18,12 @@
</template>
</v-text-field>
<v-text-field hide-details density="compact" v-model="n.a[0]" class="pb-2"
label="Correct answer" icon-color="success" prepend-icon="mdi-check"></v-text-field>
:label="l.correctAnswer" icon-color="success" prepend-icon="mdi-check"></v-text-field>
<v-text-field hide-details density="compact" v-model="n.a[1]" class="pb-2"
label="Wrong answer #1" icon-color="error" prepend-icon="mdi-close"></v-text-field>
:label="`${l.wrongAnswer} #1`" icon-color="error" prepend-icon="mdi-close"></v-text-field>
<v-text-field hide-details density="compact" v-model="n.a[2]" class="pb-2"
label="Wrong answer #2" v-if="n.a[1]" icon-color="error" prepend-icon="mdi-close"></v-text-field>
<v-text-field density="compact" hide-details label="Wrong answer hint" v-model="n.h" class="pb-2"></v-text-field>
:label="`${l.wrongAnswer} #2`" v-if="n.a[1]" icon-color="error" prepend-icon="mdi-close"></v-text-field>
<v-text-field density="compact" hide-details :label="l.wrongAnswerHint" v-model="n.h" class="pb-2"></v-text-field>
</v-card-item>
<v-divider></v-divider>
</v-card>
@@ -36,10 +36,10 @@
</v-card>
</template>
</v-dialog>
<v-checkbox v-model="modelValue.shuffle" hide-details label="Shuffle questions"></v-checkbox>
<v-number-input density="compact" label="Correct answer points" v-model="modelValue.questionPoints"></v-number-input>
<v-number-input density="compact" label="Wrong answer penalty points" v-model="modelValue.questionPenalty"></v-number-input>
<v-select v-model="modelValue.style" :items="styles" density="compact" label="Visual style"></v-select>
<v-checkbox v-model="modelValue.shuffle" hide-details :label="l.shuffleQuestions"></v-checkbox>
<v-number-input density="compact" :label="l.correctAnswerPoints" v-model="modelValue.questionPoints"></v-number-input>
<v-number-input density="compact" :label="l.wrongAnswerPenalty" v-model="modelValue.questionPenalty"></v-number-input>
<v-select v-model="modelValue.style" :items="styles" density="compact" :label="l.visualStyle"></v-select>
<SceneSwitcher v-model="mv"></SceneSwitcher>
</template>
@@ -51,11 +51,11 @@ export default {
data(){
return {
styles:[
{ title: 'Lake reeds', value: 'quiz.gltf' },
{ title: 'Grass and pavement pathway', value: 'quiz-s2.gltf' },
{ title: 'Medieval Fortress', value: 'quiz-fortress.gltf' },
{ title: 'Air Islands', value: 'quiz-on-air.gltf' },
{ title: 'Red lake', value: 'quiz-red-lakes.gltf'}
{ title: 'Lake reeds / тръстики в езерото', value: 'quiz.gltf' },
{ title: 'Grass and pavement pathway / трева и паваж', value: 'quiz-s2.gltf' },
{ title: 'Medieval Fortress / средновековна крепост', value: 'quiz-fortress.gltf' },
{ title: 'Air Islands / острови във въздуха', value: 'quiz-on-air.gltf' },
{ title: 'Red lake / червено езеро', value: 'quiz-red-lakes.gltf'}
]
}
},
@@ -1,13 +1,13 @@
<template>
<div v-if="modelValue.go">
<v-number-input density="compact" label="Number of elements" v-model="modelValue.c"></v-number-input>
<v-number-input density="compact" :label="l.elementsCount" v-model="modelValue.c"></v-number-input>
<v-textarea :label="l.description" v-model="modelValue.introText"></v-textarea>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
</div>
<asset-selector @select="assignTexture" :type="['Texture']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Choose image object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
</template>
</asset-selector>
</template>
@@ -1,19 +1,19 @@
<template>
<div v-if="modelValue.go">
<v-number-input density="compact" :precision="null" label="Particle width" v-model="modelValue.x"></v-number-input>
<v-number-input density="compact" :precision="null" label="Particle height" v-model="modelValue.y"></v-number-input>
<v-number-input density="compact" :precision="null" :label="l.particleWidth" v-model="modelValue.x"></v-number-input>
<v-number-input density="compact" :precision="null" :label="l.particleHeight" v-model="modelValue.y"></v-number-input>
<v-number-input density="compact" :precision="null" label="Area width" v-model="modelValue.w"></v-number-input>
<v-number-input density="compact" :precision="null" label="Area length" v-model="modelValue.h"></v-number-input>
<v-number-input density="compact" :precision="null" :label="l.areaWidth" v-model="modelValue.w"></v-number-input>
<v-number-input density="compact" :precision="null" :label="l.areaLength" v-model="modelValue.h"></v-number-input>
<v-number-input density="compact" label="Count" v-model="modelValue.count"></v-number-input>
<v-number-input density="compact" :label="l.elementsCount" v-model="modelValue.count"></v-number-input>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
</div>
<asset-selector @select="assignTexture" :type="['Texture']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Choose image object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
</template>
</asset-selector>
</template>
@@ -1,14 +1,14 @@
<template>
<div v-if="modelValue.go">
<v-number-input density="compact" label="Width" v-model="modelValue.w"></v-number-input>
<v-number-input density="compact" label="Height" v-model="modelValue.h"></v-number-input>
<v-number-input density="compact" :label="l.width" v-model="modelValue.w"></v-number-input>
<v-number-input density="compact" :label="l.height" v-model="modelValue.h"></v-number-input>
<v-textarea :label="l.description" v-model="modelValue.introText"></v-textarea>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
</div>
<asset-selector @select="assignTexture" :type="['Texture']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Choose image object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
</template>
</asset-selector>
</template>
@@ -1,14 +1,14 @@
<template>
<div v-if="modelValue.go">
<v-number-input density="compact" label="Width" v-model="modelValue.w"></v-number-input>
<v-number-input density="compact" label="Height" v-model="modelValue.h"></v-number-input>
<v-number-input density="compact" :label="l.width" v-model="modelValue.w"></v-number-input>
<v-number-input density="compact" :label="l.height" v-model="modelValue.h"></v-number-input>
<v-textarea :label="l.description" v-model="modelValue.introText"></v-textarea>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
</div>
<asset-selector @select="assignTexture" :type="['Texture']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Choose image object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
</template>
</asset-selector>
</template>
@@ -1,8 +1,8 @@
<template>
<div>
<v-select label="Switch to scene" v-model="modelValue.switchScene" density="compact"
<v-select :label="l.switchToScene" v-model="modelValue.switchScene" density="compact"
:items="scenes"></v-select>
<v-select label="Switch type" v-model="modelValue.switchType" density="compact"
<v-select :label="l.switchType" v-model="modelValue.switchType" density="compact"
:items="switchTypes"></v-select>
<!-- <div class="text-caption text-center">{{ modelValue.title }}</div> -->
</div>
@@ -18,15 +18,12 @@ export default {
data(){
return {
active: false,
switchTypes: [
{ title: 'Award', value: 'award' },
{ title: 'Sphere', value: 'sphere' },
{ title: 'Sensor', value: 'sensor' }
]
switchTypes: ['award', 'sphere', 'sensor']
}
},
mounted(){
this.active = true;
this.switchTypes = this.switchTypes.map(t=>({title: this.l.switchTypes[t], value: t}))
},
props:{
@@ -1,9 +1,9 @@
<template>
<div v-if="modelValue.go">
<v-text-field hide-details density="compact" v-model="modelValue.q" class="pb-2" label="Question" icon-color="blue" prepend-icon="mdi-chat-question-outline"></v-text-field>
<v-text-field hide-details density="compact" v-model="modelValue.a[0]" class="pb-2" label="Correct answer" icon-color="success" prepend-icon="mdi-check"></v-text-field>
<v-text-field hide-details density="compact" v-model="modelValue.q" class="pb-2" :label="l.question" icon-color="blue" prepend-icon="mdi-chat-question-outline"></v-text-field>
<v-text-field hide-details density="compact" v-model="modelValue.a[0]" class="pb-2" :label="l.correctAnswer" icon-color="success" prepend-icon="mdi-check"></v-text-field>
<v-text-field v-for="i in 4" :key="i" hide-details density="compact" v-model="modelValue.a[i]"
v-show="modelValue.a[i-1]" class="pb-2" :label="`Wrong answer #${i}`" icon-color="error"
v-show="modelValue.a[i-1]" class="pb-2" :label="`${l.wrongAnswer} #${i}`" icon-color="error"
prepend-icon="mdi-close"></v-text-field>
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
@@ -2,11 +2,11 @@
<div v-if="modelValue.go">
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
<div class="text-caption text-center">{{ modelValue.title }}</div>
<v-checkbox density="compact" v-model="modelValue.playInHud" hide-details label="Play in full screen"></v-checkbox>
<v-checkbox density="compact" v-model="modelValue.playInHud" hide-details :label="l.viewInHUD"></v-checkbox>
</div>
<asset-selector @select="assignVideoObject" :type="['Video']">
<template v-slot:activator="props">
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>Choose video object</v-btn>
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseVideoObject }}</v-btn>
</template>
</asset-selector>
</template>
+8 -7
View File
@@ -22,22 +22,22 @@
class="scene-switcher" marker-start="url(#arrow)" ></OffsetLine>
</teleport>
<v-card v-if="selected" :title="modelValue.title" class="mx-2" variant="text">
<v-select label="Game Object Type" v-model="modelValue.type" density="compact" hide-details
<v-select :label="l.gameObjectType" v-model="modelValue.type" density="compact" hide-details
:items="InteractiveObjectTypes.map(e=>({title: e.name, value: e.id}))"></v-select>
<v-form class="pt-4">
<v-text-field density="compact" :label="l.name" v-model="modelValue.title"></v-text-field>
<!-- <v-text-field density="compact" :label="l.id" v-model="modelValue.id"></v-text-field> -->
<v-number-input density="compact" label="Completion points" v-model="modelValue.points"></v-number-input>
<v-number-input density="compact" :label="l.completionPoints" v-model="modelValue.points"></v-number-input>
</v-form>
<div v-if="selected && modelValue.type">
<component :is="modelValue.type" v-model="mv"></component>
</div>
<v-card title="Activation requirements" v-if="modelValue.type != 'CharacterObject'">
<v-number-input density="compact" label="Level score should be above" v-model="modelValue.activationScore"></v-number-input>
<v-select density="compact" label="Following elements should be completed" v-model="modelValue.activationTriggers"
<v-card :title="l.activationConditions" v-if="modelValue.type != 'CharacterObject'">
<v-number-input density="compact" :label="l.minActivationScore" v-model="modelValue.activationScore"></v-number-input>
<v-select density="compact" :label="l.completionElements" v-model="modelValue.activationTriggers"
:items="parent.data.items.filter(v=>!v.data.exclude && v.data!==modelValue).map(v=>({title: v.data.title, value: v.data.id}))" multiple ></v-select>
<v-select label="Activation Type" :items="activationTypes" density="compact" v-model="modelValue.activationType"></v-select>
<v-select :label="l.activatoinType" :items="activationTypes" density="compact" v-model="modelValue.activationType"></v-select>
</v-card>
</v-card>
@@ -82,7 +82,7 @@ export default {
return {
InteractiveObjectTypes,
active: false,
activationTypes: [{ title:'Unlock', value:'unlock'}, { title:'Appear', value:'appear'}]
activationTypes: ['unlock', 'appear'],
}
},
mounted(){
@@ -90,6 +90,7 @@ export default {
this.modelValue.points ??= 10;
this.modelValue.activationScore ??= 0;
this.modelValue.type ??= 'GenericObject';
this.activationTypes = this.activationTypes.map(t=>({title: this.l.activationTypes[t], value: t}))
if (components[this.modelValue.type].__transform){
components[this.modelValue.type].__transform(this.modelValue)
}
+84
View File
@@ -26,6 +26,47 @@ const lang = {
captureThumbnail: 'Save thumbnail',
publish: 'Publish',
gameObjects: 'Objects',
gameObjectType: 'Game object type',
activationConditions: 'Activation conditions',
activatoinType: 'Activation type',
activationTypes:{
unlock: 'Unlock',
appear: 'Appear',
},
switchToScene: 'Switch to scene',
switchType:'Switch type',
switchTypes:{
award: 'Award',
sphere: 'Sphere',
sensor: 'Sensor',
},
completionPoints: 'Completion points',
completionElements: 'Following elements should be completed',
minActivationScore: 'Minimum level score for activation',
viewInHUD: 'Observe in head-up display',
disableInteractions: 'Disable interactions',
disableCollisions: 'Disable collisions',
dimensions: 'Dimensions',
elementsCount: 'Number of elements',
particleWidth: 'Particle width',
particleHeight: 'Particle height',
areaWidth: 'Area width',
areaLength: 'Area length',
chooseImage: 'Choose image',
chooseGameObject: 'Choose game object',
chooseVideoObject: 'Choose video object',
selectCharacter: 'Select character',
width: 'Width',
height: 'Height',
question: 'Question',
manageQuestions: 'Manage questions',
shuffleQuestions: 'Shuffle questions',
correctAnswer: 'Correct answer',
correctAnswerPoints: 'Points for correct answer',
wrongAnswer: 'Wrong answer',
wrongAnswerPenalty: 'Penalty for wrong answer (-points)',
wrongAnswerHint: 'Wrong answer hint',
visualStyle: 'Visual style',
gameScenarios: 'Scenarios',
gameRules: 'Rules',
gameDesigner: 'Game studio',
@@ -69,6 +110,7 @@ const lang = {
displayName:'Display Name',
firstName:'First Name',
lastName:'Last Name',
fullScreen: 'Full screen',
errors:{
unauthorized: 'Unauthorized',
notFound: 'Object not found',
@@ -118,6 +160,47 @@ const lang = {
captureThumbnail: 'Save thumbnail',
publish: 'Публикуване',
gameObjects: 'Обекти',
gameObjectType: 'Тип игрови обект',
activationConditions: 'Условия за активиране',
activatoinType: 'Начин на активиране',
activationTypes:{
unlock: 'Отключване',
appear: 'Появяване',
},
switchToScene: 'Преминаване към сцена',
switchType:'Тип преминаване',
switchTypes:{
award: 'Награда',
sphere: 'Сфера',
sensor: 'Преминаване',
},
completionPoints: 'Брой точки',
completionElements: 'Изпълнени елементи преди активиране',
minActivationScore: 'Минимален брой точки за активиране',
viewInHUD: 'Показване в HUD (head-up display)',
disableInteractions: 'Без взаимодействия',
disableCollisions: 'Без колизии',
dimensions: 'Размери',
elementsCount: 'Брой елементи',
particleWidth: 'Ширина на частиците',
particleHeight: 'Височина на частиците',
areaWidth: 'Ширина на площта',
areaLength: 'Дължина на площта',
chooseImage: 'Избери изображение',
chooseGameObject: 'Избери игрови обект',
chooseVideoObject: 'Избери видео обект',
selectCharacter: 'Избери герой',
width: 'Ширина',
height: 'Височина',
question: 'Въпрос',
manageQuestions: 'Въвеждане на въпросите',
shuffleQuestions: 'Разбъркване на въпросите',
correctAnswer: 'Правилен отговор',
correctAnswerPoints: 'Точки за правилен отговор',
wrongAnswer: 'Грешен отговор',
wrongAnswerPenalty: 'Наказание за грешен отговор (-точки)',
wrongAnswerHint: 'Подсказка при грешен отговор',
visualStyle: 'Визия',
gameScenarios: 'Сценарии',
gameRules: 'Правила',
gameDesigner: 'Студио',
@@ -161,6 +244,7 @@ const lang = {
displayName:'Псевдоним',
firstName:'Име',
lastName:'Фамилия',
fullScreen: 'Цял екран',
errors:{
unauthorized: 'Отказан достъп',
notFound: 'Обектът не е намерен',