bugfix: i18n问题
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 327 B |
BIN
src/assets/images/award/banner_chinese.mp4
Normal file
BIN
src/assets/images/award/banner_chinese.mp4
Normal file
Binary file not shown.
@@ -1858,14 +1858,16 @@ export default {
|
|||||||
uploadSuccess: '上传成功',
|
uploadSuccess: '上传成功',
|
||||||
uploadFailed: '上传失败',
|
uploadFailed: '上传失败',
|
||||||
pdfFileTip: 'PDF文件,不超过20MB',
|
pdfFileTip: 'PDF文件,不超过20MB',
|
||||||
videoFileTip: '视频文件(MP4, MOV),1080p,不超过100MB'
|
videoFileTip: '视频文件(MP4, MOV),1080p,不超过100MB',
|
||||||
|
wechatTitle: '微信公众号',
|
||||||
|
wechatDesc: '请使用微信扫描二维码'
|
||||||
},
|
},
|
||||||
AwardApply: {
|
AwardApply: {
|
||||||
// 页面主标题区域
|
// 页面主标题区域
|
||||||
applicationForm: '参赛表格',
|
applicationForm: '参赛表格',
|
||||||
emailVerification: '邮箱验证',
|
emailVerification: '邮箱验证',
|
||||||
aidaUsersOnly: '仅限 AiDA 用户',
|
aidaUsersOnly: '仅限 AiDA 用户',
|
||||||
slogan: '绽放你的创意 • AiDA 全球时设计奖 2026',
|
slogan: '绽放你的创意 • AiDA 全球设计奖 2026',
|
||||||
// 邮箱验证部分
|
// 邮箱验证部分
|
||||||
emailAddress: '邮箱',
|
emailAddress: '邮箱',
|
||||||
sendCode: '发送验证码',
|
sendCode: '发送验证码',
|
||||||
@@ -1952,6 +1954,7 @@ export default {
|
|||||||
uploadPdfOnly: '请仅上传 PDF 文件。',
|
uploadPdfOnly: '请仅上传 PDF 文件。',
|
||||||
uploadVideoOnly: '请仅上传 MP4 或 MOV 文件。',
|
uploadVideoOnly: '请仅上传 MP4 或 MOV 文件。',
|
||||||
fileSizeExceeds: '文件大小超过 {sizeLimit} 限制。请上传较小的文件。',
|
fileSizeExceeds: '文件大小超过 {sizeLimit} 限制。请上传较小的文件。',
|
||||||
|
videoDurationExceeds: '视频时长不可超过60秒',
|
||||||
uploadFailed: '上传失败'
|
uploadFailed: '上传失败'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1926,18 +1926,21 @@ export default {
|
|||||||
uploadSuccess: 'Uploaded Successfully',
|
uploadSuccess: 'Uploaded Successfully',
|
||||||
uploadFailed: 'Upload failed',
|
uploadFailed: 'Upload failed',
|
||||||
pdfFileTip: 'PDF file, max 20MB',
|
pdfFileTip: 'PDF file, max 20MB',
|
||||||
videoFileTip: 'Video file (MP4, MOV), 1080p, max 100MB'
|
videoFileTip: 'Video file (MP4, MOV), 1080p, max 100MB',
|
||||||
|
wechatTitle: 'WeChat Official Account',
|
||||||
|
wechatDesc: 'Scan the QR code in WeChat'
|
||||||
},
|
},
|
||||||
AwardApply: {
|
AwardApply: {
|
||||||
// 页面主标题区域
|
// 页面主标题区域
|
||||||
applicationForm: 'Application Form',
|
applicationForm: 'Application Form',
|
||||||
emailVerification: 'Email Verification',
|
emailVerification: 'Email Verification',
|
||||||
aidaUsersOnly: 'AiDA Users Only',
|
aidaUsersOnly: 'AiDA Users Only',
|
||||||
slogan: 'BLOOM YOUR CREATIVITY • AiDA GLOBAL FASHION AWARD 2026',
|
slogan: 'BLOOM YOUR CREATIVITY • AIDA GLOBAL DESIGN AWARDS 2026',
|
||||||
// 邮箱验证部分
|
// 邮箱验证部分
|
||||||
emailAddress: 'Email Address',
|
emailAddress: 'Email Address',
|
||||||
sendCode: 'Send Code',
|
sendCode: 'Send Code',
|
||||||
pleaseUseRegisteredEmail: 'Please use the email address you registered with AiDA.',
|
pleaseUseRegisteredEmail:
|
||||||
|
'Please use the email address you registered with AiDA.',
|
||||||
// 个人信息部分
|
// 个人信息部分
|
||||||
personalInformation: 'Personal Information',
|
personalInformation: 'Personal Information',
|
||||||
tellUsAboutYourself: 'Tell us about yourself',
|
tellUsAboutYourself: 'Tell us about yourself',
|
||||||
@@ -1958,7 +1961,8 @@ export default {
|
|||||||
shareYourCreativeVision: 'Share your creative vision',
|
shareYourCreativeVision: 'Share your creative vision',
|
||||||
designTitle: 'Design Title',
|
designTitle: 'Design Title',
|
||||||
designDescription: 'Design description',
|
designDescription: 'Design description',
|
||||||
designDescriptionPlaceholder: 'Briefly describe your design concept, inspiration, and creative direction...',
|
designDescriptionPlaceholder:
|
||||||
|
'Briefly describe your design concept, inspiration, and creative direction...',
|
||||||
// 提交文件部分
|
// 提交文件部分
|
||||||
submissionFiles: 'Submission Files',
|
submissionFiles: 'Submission Files',
|
||||||
uploadYourDesignMaterials: 'Upload your design materials',
|
uploadYourDesignMaterials: 'Upload your design materials',
|
||||||
@@ -1978,13 +1982,18 @@ export default {
|
|||||||
videoFileLimit: 'Video file (MP4, MOV), 1080p, max 100MB',
|
videoFileLimit: 'Video file (MP4, MOV), 1080p, max 100MB',
|
||||||
// 条款与条件
|
// 条款与条件
|
||||||
termsAndConditions: 'Terms & Conditions',
|
termsAndConditions: 'Terms & Conditions',
|
||||||
conditionFirst: 'I confirm that all submitted work is original and created by me.',
|
conditionFirst:
|
||||||
conditionSecond: 'I understand that Code-Create has marketing and promotional rights to all submitted designs and videos.',
|
'I confirm that all submitted work is original and created by me.',
|
||||||
conditionThird: 'I agree to participate in finalist activities if selected, including AiDA training and award ceremony.',
|
conditionSecond:
|
||||||
conditionFourth: 'I would like to receive updates about AiDA products and future competitions. (Optional)',
|
'I understand that Code-Create has marketing and promotional rights to all submitted designs and videos.',
|
||||||
|
conditionThird:
|
||||||
|
'I agree to participate in finalist activities if selected, including AiDA training and award ceremony.',
|
||||||
|
conditionFourth:
|
||||||
|
'I would like to receive updates about AiDA products and future competitions. (Optional)',
|
||||||
// 提交按钮
|
// 提交按钮
|
||||||
submitYourDesign: 'Submit your Design',
|
submitYourDesign: 'Submit your Design',
|
||||||
unfinishedFormTip: 'The link in the AiDA in-platform message will save your unfinished form.',
|
unfinishedFormTip:
|
||||||
|
'The link in the AiDA in-platform message will save your unfinished form.',
|
||||||
// 验证码弹窗
|
// 验证码弹窗
|
||||||
checkYourEmail: 'Check your email',
|
checkYourEmail: 'Check your email',
|
||||||
enterSixDigitCode: 'Enter the 6-digit code sent to',
|
enterSixDigitCode: 'Enter the 6-digit code sent to',
|
||||||
@@ -2018,7 +2027,10 @@ export default {
|
|||||||
pleaseUploadVideo: 'Please upload your video',
|
pleaseUploadVideo: 'Please upload your video',
|
||||||
uploadPdfOnly: 'Please upload a PDF file only.',
|
uploadPdfOnly: 'Please upload a PDF file only.',
|
||||||
uploadVideoOnly: 'Please upload a MP4 or MOV file only.',
|
uploadVideoOnly: 'Please upload a MP4 or MOV file only.',
|
||||||
fileSizeExceeds: 'File size exceeds {sizeLimit} limit. Please upload a smaller file.',
|
fileSizeExceeds:
|
||||||
|
'File size exceeds {sizeLimit} limit. Please upload a smaller file.',
|
||||||
|
videoDurationExceeds:
|
||||||
|
'Video duration exceeds 60 seconds limit. Please upload a shorter video.',
|
||||||
uploadFailed: 'Upload failed'
|
uploadFailed: 'Upload failed'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,9 @@
|
|||||||
class="form-header"
|
class="form-header"
|
||||||
v-if="!isCompleted && !isExpired"
|
v-if="!isCompleted && !isExpired"
|
||||||
>
|
>
|
||||||
<div class="form-title poppins-bold">{{ t('AwardApply.emailVerification') }}</div>
|
<div class="form-title poppins-bold">
|
||||||
|
{{ t('AwardApply.emailVerification') }}
|
||||||
|
</div>
|
||||||
<div class="desc">{{ t('AwardApply.aidaUsersOnly') }}</div>
|
<div class="desc">{{ t('AwardApply.aidaUsersOnly') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -63,7 +65,9 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row full-row">
|
<div class="form-row full-row">
|
||||||
<div class="form-title poppins-bold">{{ t('AwardApply.personalInformation') }}</div>
|
<div class="form-title poppins-bold">
|
||||||
|
{{ t('AwardApply.personalInformation') }}
|
||||||
|
</div>
|
||||||
<div class="desc">{{ t('AwardApply.tellUsAboutYourself') }}</div>
|
<div class="desc">{{ t('AwardApply.tellUsAboutYourself') }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="user-info flex">
|
<div class="user-info flex">
|
||||||
@@ -109,8 +113,12 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row full-row">
|
<div class="form-row full-row">
|
||||||
<div class="form-title poppins-bold">{{ t('AwardApply.designInformation') }}</div>
|
<div class="form-title poppins-bold">
|
||||||
<div class="desc">{{ t('AwardApply.shareYourCreativeVision') }}</div>
|
{{ t('AwardApply.designInformation') }}
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{ t('AwardApply.shareYourCreativeVision') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a-form-item
|
<a-form-item
|
||||||
class="full-row design-title"
|
class="full-row design-title"
|
||||||
@@ -137,28 +145,30 @@
|
|||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<div class="form-row full-row">
|
<div class="form-row full-row">
|
||||||
<div class="form-title poppins-bold">{{ t('AwardApply.submissionFiles') }}</div>
|
<div class="form-title poppins-bold">
|
||||||
<div class="desc">{{ t('AwardApply.uploadYourDesignMaterials') }}</div>
|
{{ t('AwardApply.submissionFiles') }}
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{ t('AwardApply.uploadYourDesignMaterials') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="information full-row">
|
<div class="information full-row">
|
||||||
<div class="information-title flex align-center">
|
<div class="information-title flex align-center">
|
||||||
<div class="point"></div>
|
<div class="point"></div>
|
||||||
<div class="text poppins-bold">{{ t('AwardApply.submissionRequirements') }}</div>
|
<div class="text poppins-bold">
|
||||||
|
{{ t('AwardApply.submissionRequirements') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ul class="information-list flex space-between">
|
<ul class="information-list flex space-between">
|
||||||
<li class="information-item">
|
<li class="information-item">
|
||||||
{{
|
{{ t('AwardApply.pdfRequirement') }}
|
||||||
t('AwardApply.pdfRequirement')
|
|
||||||
}}
|
|
||||||
</li>
|
</li>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<li class="information-item">
|
<li class="information-item">
|
||||||
{{ t('AwardApply.rightContent.format') }}
|
{{ t('AwardApply.rightContent.format') }}
|
||||||
</li>
|
</li>
|
||||||
<li class="information-item">
|
<li class="information-item">
|
||||||
{{
|
{{ t('AwardApply.rightContent.video') }}
|
||||||
t('AwardApply.rightContent.video')
|
|
||||||
}}
|
|
||||||
</li>
|
</li>
|
||||||
</div>
|
</div>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -187,8 +197,12 @@
|
|||||||
alt=""
|
alt=""
|
||||||
class="upload-icon"
|
class="upload-icon"
|
||||||
/>
|
/>
|
||||||
<p class="desc">{{ t('AwardApply.clickToUploadPdf') }}</p>
|
<p class="desc">
|
||||||
<p class="limit">{{ t('AwardApply.pdfFileLimit') }}</p>
|
{{ t('AwardApply.clickToUploadPdf') }}
|
||||||
|
</p>
|
||||||
|
<p class="limit">
|
||||||
|
{{ t('AwardApply.pdfFileLimit') }}
|
||||||
|
</p>
|
||||||
<template #itemRender="{ file, actions }">
|
<template #itemRender="{ file, actions }">
|
||||||
<div
|
<div
|
||||||
class="custom-upload-list flex align-center space-between"
|
class="custom-upload-list flex align-center space-between"
|
||||||
@@ -258,7 +272,9 @@
|
|||||||
alt=""
|
alt=""
|
||||||
class="upload-icon"
|
class="upload-icon"
|
||||||
/>
|
/>
|
||||||
<p class="desc">{{ t('AwardApply.clickToUploadVideo') }}</p>
|
<p class="desc">
|
||||||
|
{{ t('AwardApply.clickToUploadVideo') }}
|
||||||
|
</p>
|
||||||
<p class="limit">
|
<p class="limit">
|
||||||
{{ t('AwardApply.videoFileLimit') }}
|
{{ t('AwardApply.videoFileLimit') }}
|
||||||
</p>
|
</p>
|
||||||
@@ -308,38 +324,40 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
</a-form>
|
</a-form>
|
||||||
<div class="conditions">
|
<div class="conditions">
|
||||||
<div class="confitions-title poppins-bold">{{ t('AwardApply.termsAndConditions') }}</div>
|
<div class="confitions-title poppins-bold">
|
||||||
<div class="condition-list flex flex-col">
|
{{ t('AwardApply.termsAndConditions') }}
|
||||||
<div
|
</div>
|
||||||
class="condition-item flex align-center"
|
<div class="condition-list flex flex-col">
|
||||||
v-for="item in conditionsList"
|
<div
|
||||||
:key="item.id"
|
class="condition-item flex align-center"
|
||||||
>
|
v-for="item in conditionsList"
|
||||||
<a-checkbox v-model:checked="item.check" />
|
:key="item.id"
|
||||||
<span>
|
>
|
||||||
{{ t('AwardApply.' + item.translationKey) }}
|
<a-checkbox v-model:checked="item.check" />
|
||||||
<span
|
<span>
|
||||||
class="required"
|
{{ t('AwardApply.' + item.translationKey) }}
|
||||||
v-if="item.required"
|
<span
|
||||||
>
|
class="required"
|
||||||
*
|
v-if="item.required"
|
||||||
|
>
|
||||||
|
*
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="submit-container">
|
||||||
<div class="submit-container">
|
<div
|
||||||
<div
|
class="submit-btn poppins-bold"
|
||||||
class="submit-btn poppins-bold"
|
@click="handleSubmitForm"
|
||||||
@click="handleSubmitForm"
|
>
|
||||||
>
|
{{ t('AwardApply.submitYourDesign') }}
|
||||||
{{ t('AwardApply.submitYourDesign') }}
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{ t('AwardApply.unfinishedFormTip') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="desc">
|
|
||||||
{{ t('AwardApply.unfinishedFormTip') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a-modal
|
<a-modal
|
||||||
@@ -359,7 +377,11 @@
|
|||||||
@click="handleCloseModal"
|
@click="handleCloseModal"
|
||||||
/>
|
/>
|
||||||
<div class="title poppins-bold">{{ t('AwardApply.checkYourEmail') }}</div>
|
<div class="title poppins-bold">{{ t('AwardApply.checkYourEmail') }}</div>
|
||||||
<div class="desc">{{ t('AwardApply.enterSixDigitCode') }} {{ form.email }}</div>
|
<div class="desc">
|
||||||
|
{{ t('AwardApply.enterSixDigitCode') }}
|
||||||
|
<br />
|
||||||
|
<span class="email-verify">{{ form.email }}</span>
|
||||||
|
</div>
|
||||||
<div class="code-box">
|
<div class="code-box">
|
||||||
<VerifycationCodeInput
|
<VerifycationCodeInput
|
||||||
:ct="emailCode"
|
:ct="emailCode"
|
||||||
@@ -379,7 +401,9 @@
|
|||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
isCountingDown
|
isCountingDown
|
||||||
? `${t('AwardApply.resendCodeIn')} ${formatCountdown(countdown)}`
|
? `${t('AwardApply.resendCodeIn')} ${formatCountdown(
|
||||||
|
countdown
|
||||||
|
)}`
|
||||||
: t('AwardApply.resendCode')
|
: t('AwardApply.resendCode')
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
@@ -436,6 +460,7 @@
|
|||||||
designDescription: '',
|
designDescription: '',
|
||||||
pdfPath: '',
|
pdfPath: '',
|
||||||
videoPath: '',
|
videoPath: '',
|
||||||
|
videoDuration: 0,
|
||||||
secureToken: ''
|
secureToken: ''
|
||||||
})
|
})
|
||||||
const hasValidEmail = computed(() => {
|
const hasValidEmail = computed(() => {
|
||||||
@@ -493,18 +518,36 @@
|
|||||||
const rulesRef = {
|
const rulesRef = {
|
||||||
email: [{ required: true, validator: validEmail }],
|
email: [{ required: true, validator: validEmail }],
|
||||||
firstName: [
|
firstName: [
|
||||||
{ required: true, message: t('AwardApply.pleaseInputFirstName'), trigger: 'blur' }
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('AwardApply.pleaseInputFirstName'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
],
|
],
|
||||||
lastName: [
|
lastName: [
|
||||||
{ required: true, message: t('AwardApply.pleaseInputLastName'), trigger: 'blur' }
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('AwardApply.pleaseInputLastName'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
],
|
],
|
||||||
gender: [
|
gender: [
|
||||||
{ required: true, message: t('AwardApply.pleaseSelectGender'), trigger: 'blur' }
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('AwardApply.pleaseSelectGender'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
],
|
],
|
||||||
occupation: [
|
occupation: [
|
||||||
{ required: true, message: t('AwardApply.pleaseInputOccupation'), trigger: 'blur' }
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('AwardApply.pleaseInputOccupation'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
age: [
|
||||||
|
{ required: true, message: t('AwardApply.pleaseInputAge'), trigger: 'blur' }
|
||||||
],
|
],
|
||||||
age: [{ required: true, message: t('AwardApply.pleaseInputAge'), trigger: 'blur' }],
|
|
||||||
countryRegionCity: [
|
countryRegionCity: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
@@ -515,7 +558,11 @@
|
|||||||
phoneNumber: [{ required: true, validator: validatePhone, trigger: 'blur' }],
|
phoneNumber: [{ required: true, validator: validatePhone, trigger: 'blur' }],
|
||||||
|
|
||||||
designTitle: [
|
designTitle: [
|
||||||
{ required: true, message: t('AwardApply.pleaseInputDesignTitle'), trigger: 'blur' }
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('AwardApply.pleaseInputDesignTitle'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
],
|
],
|
||||||
designDescription: [
|
designDescription: [
|
||||||
{
|
{
|
||||||
@@ -524,9 +571,15 @@
|
|||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
pdfPath: [{ required: true, message: t('AwardApply.pleaseUploadPdf'), trigger: 'null' }],
|
pdfPath: [
|
||||||
|
{ required: true, message: t('AwardApply.pleaseUploadPdf'), trigger: 'null' }
|
||||||
|
],
|
||||||
videoPath: [
|
videoPath: [
|
||||||
{ required: true, message: t('AwardApply.pleaseUploadVideo'), trigger: 'null' }
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('AwardApply.pleaseUploadVideo'),
|
||||||
|
trigger: 'null'
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,7 +813,24 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 统一的文件上传前验证
|
// 统一的文件上传前验证
|
||||||
const beforeUploadFile = (type: FileType, file: File) => {
|
// 获取视频时长
|
||||||
|
const getVideoDuration = (file: File): Promise<number> => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const video = document.createElement('video')
|
||||||
|
video.preload = 'metadata'
|
||||||
|
video.onloadedmetadata = () => {
|
||||||
|
window.URL.revokeObjectURL(video.src)
|
||||||
|
resolve(video.duration)
|
||||||
|
}
|
||||||
|
video.onerror = () => {
|
||||||
|
window.URL.revokeObjectURL(video.src)
|
||||||
|
reject(new Error('Failed to load video'))
|
||||||
|
}
|
||||||
|
video.src = window.URL.createObjectURL(file)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const beforeUploadFile = async (type: FileType, file: File) => {
|
||||||
if (!hasValidEmail.value) {
|
if (!hasValidEmail.value) {
|
||||||
message.error(t('AwardApply.pleaseVerifyEmailFirst'))
|
message.error(t('AwardApply.pleaseVerifyEmailFirst'))
|
||||||
return Upload.LIST_IGNORE
|
return Upload.LIST_IGNORE
|
||||||
@@ -792,42 +862,33 @@
|
|||||||
|
|
||||||
if (!isValidType) {
|
if (!isValidType) {
|
||||||
message.error(errorMessage)
|
message.error(errorMessage)
|
||||||
// 从文件列表中移除
|
|
||||||
// if (type === 'pdf') {
|
|
||||||
// const index = pdfList.value.findIndex(item => item.uid === file.uid)
|
|
||||||
// if (index > -1) {
|
|
||||||
// pdfList.value.splice(index, 1)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// const index = videoList.value.findIndex(item => item.uid === file.uid)
|
|
||||||
// if (index > -1) {
|
|
||||||
// videoList.value.splice(index, 1)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return Upload.LIST_IGNORE
|
return Upload.LIST_IGNORE
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证文件大小
|
// 验证文件大小
|
||||||
if (file.size > maxSize) {
|
if (file.size > maxSize) {
|
||||||
const sizeLimit = type === 'pdf' ? '20MB' : '100MB'
|
const sizeLimit = type === 'pdf' ? '20MB' : '100MB'
|
||||||
message.error(
|
message.error(t('AwardApply.fileSizeExceeds', { sizeLimit }))
|
||||||
t('AwardApply.fileSizeExceeds', { sizeLimit })
|
|
||||||
)
|
|
||||||
// 从文件列表中移除
|
|
||||||
// if (type === 'pdf') {
|
|
||||||
// const index = pdfList.value.findIndex(item => item.uid === file.uid)
|
|
||||||
// if (index > -1) {
|
|
||||||
// pdfList.value.splice(index, 1)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// const index = videoList.value.findIndex(item => item.uid === file.uid)
|
|
||||||
// if (index > -1) {
|
|
||||||
// videoList.value.splice(index, 1)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return Upload.LIST_IGNORE
|
return Upload.LIST_IGNORE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 验证视频时长
|
||||||
|
let duration = 0
|
||||||
|
if (type === 'video') {
|
||||||
|
duration = await getVideoDuration(file)
|
||||||
|
try {
|
||||||
|
if (duration > 60) {
|
||||||
|
message.error(t('AwardApply.videoDurationExceeds'))
|
||||||
|
return Upload.LIST_IGNORE
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to get video duration:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
form.value.videoDuration = Math.ceil(duration)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -933,7 +994,9 @@
|
|||||||
const status = info.file.status
|
const status = info.file.status
|
||||||
|
|
||||||
if (status === 'done') {
|
if (status === 'done') {
|
||||||
message.success(t('AwardApply.fileUploadedSuccess', { fileName: info.file.name }))
|
message.success(
|
||||||
|
t('AwardApply.fileUploadedSuccess', { fileName: info.file.name })
|
||||||
|
)
|
||||||
if (type === 'pdf') {
|
if (type === 'pdf') {
|
||||||
isUploadingPdf.value = false
|
isUploadingPdf.value = false
|
||||||
uploadProgressPdf.value = 0
|
uploadProgressPdf.value = 0
|
||||||
@@ -957,9 +1020,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统一的上传处理函数
|
|
||||||
const handleUploadFile = async (option: any, type: FileType) => {
|
const handleUploadFile = async (option: any, type: FileType) => {
|
||||||
const file = option.file as File
|
const file = option.file as File
|
||||||
|
//
|
||||||
|
|
||||||
if (!form.value.email) {
|
if (!form.value.email) {
|
||||||
message.error(t('AwardApply.pleaseInputEmail'))
|
message.error(t('AwardApply.pleaseInputEmail'))
|
||||||
@@ -1247,7 +1310,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// :deep(.ant-select-arrow) {
|
// :deep(.ant-select-arrow) {
|
||||||
|
|
||||||
// justify-content: center;
|
// justify-content: center;
|
||||||
// display: flex;
|
// display: flex;
|
||||||
// align-items: center;
|
// align-items: center;
|
||||||
@@ -1552,6 +1615,13 @@
|
|||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
line-height: 3.4rem;
|
line-height: 3.4rem;
|
||||||
margin-top: 1.4rem;
|
margin-top: 1.4rem;
|
||||||
|
text-align: center;
|
||||||
|
.email-verify {
|
||||||
|
color: #232323;
|
||||||
|
font-family: 'ArialBold';
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1.6rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.email {
|
.email {
|
||||||
|
|||||||
@@ -202,6 +202,9 @@ onBeforeUnmount(() => {
|
|||||||
column-gap: 23.22rem;
|
column-gap: 23.22rem;
|
||||||
row-gap: 8rem;
|
row-gap: 8rem;
|
||||||
padding: 0 25rem 0 26.6rem;
|
padding: 0 25rem 0 26.6rem;
|
||||||
|
div{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
.judgement-item {
|
.judgement-item {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
.picture {
|
.picture {
|
||||||
|
|||||||
@@ -52,6 +52,13 @@
|
|||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
isZh: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const prizes = [
|
const prizes = [
|
||||||
{
|
{
|
||||||
money: 'AwardsPage.grandMoney',
|
money: 'AwardsPage.grandMoney',
|
||||||
@@ -83,11 +90,8 @@
|
|||||||
{
|
{
|
||||||
money: 'AwardsPage.awardCertification',
|
money: 'AwardsPage.awardCertification',
|
||||||
name: 'AwardsPage.finalists',
|
name: 'AwardsPage.finalists',
|
||||||
desc: [
|
desc: ['AwardsPage.TravelAllowance', 'AwardsPage.globalMediaExposure'],
|
||||||
'AwardsPage.TravelAllowance',
|
smaller: !props.isZh
|
||||||
'AwardsPage.globalMediaExposure'
|
|
||||||
],
|
|
||||||
smaller: true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -83,12 +83,12 @@
|
|||||||
class="close-icon"
|
class="close-icon"
|
||||||
@click="handleCloseQRcode"
|
@click="handleCloseQRcode"
|
||||||
/>
|
/>
|
||||||
<div class="code-title">WeChat Official Account</div>
|
<div class="code-title">{{ $t('AwardsPage.wechatTitle') }}</div>
|
||||||
<img
|
<img
|
||||||
src="@/assets/images/award/qrcode.jpg"
|
src="@/assets/images/award/qrcode.jpg"
|
||||||
class="qrcode"
|
class="qrcode"
|
||||||
/>
|
/>
|
||||||
<div class="tips">Scan the QR code in WeChat</div>
|
<div class="tips">{{ $t('AwardsPage.wechatDesc') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="award-page">
|
<div
|
||||||
|
class="award-page"
|
||||||
|
:class="{ 'is-zh': isZh }"
|
||||||
|
>
|
||||||
<div class="banner">
|
<div class="banner">
|
||||||
<video
|
<video
|
||||||
src="@/assets/images/award/banner.mp4"
|
:src="bannerUrl"
|
||||||
autoplay
|
autoplay
|
||||||
muted
|
muted
|
||||||
loop
|
loop
|
||||||
@@ -11,32 +14,33 @@
|
|||||||
webkit-playsinline
|
webkit-playsinline
|
||||||
x5-playsinline
|
x5-playsinline
|
||||||
></video>
|
></video>
|
||||||
<div
|
<div
|
||||||
class="submit-btn flex flex-center"
|
class="submit-btn flex flex-center"
|
||||||
@click="handleSubmitApplication"
|
@click="handleSubmitApplication"
|
||||||
>
|
>
|
||||||
<div>{{ $t('AwardsPage.submitApplication') }}</div>
|
<div>{{ $t('AwardsPage.submitApplication') }}</div>
|
||||||
<img
|
<img
|
||||||
src="@/assets/images/award/arrow_right.png"
|
src="@/assets/images/award/arrow_right.png"
|
||||||
alt=""
|
alt=""
|
||||||
class="arrow"
|
class="arrow"
|
||||||
/>
|
/>
|
||||||
<div class="ddl">{{ $t('AwardsPage.applicationDeadline') }}</div>
|
<div class="ddl">{{ $t('AwardsPage.applicationDeadline') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Slogan />
|
<Slogan />
|
||||||
<Bloom />
|
<Bloom />
|
||||||
<TimeLine />
|
<TimeLine />
|
||||||
<JudgesSection />
|
<JudgesSection />
|
||||||
<PrizesSection />
|
<PrizesSection :is-zh="isZh" />
|
||||||
<ApplySection />
|
<ApplySection />
|
||||||
<SelectionSection />
|
<SelectionSection />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import JudgesSection from './components/JudgesSection.vue'
|
import JudgesSection from './components/JudgesSection.vue'
|
||||||
import SelectionSection from './components/SelectionSection.vue'
|
import SelectionSection from './components/SelectionSection.vue'
|
||||||
@@ -46,7 +50,19 @@
|
|||||||
import Bloom from './components/Bloom.vue'
|
import Bloom from './components/Bloom.vue'
|
||||||
import Slogan from './components/Slogan.vue'
|
import Slogan from './components/Slogan.vue'
|
||||||
|
|
||||||
|
import banner from '@/assets/images/award/banner.mp4'
|
||||||
|
import bannerZh from '@/assets/images/award/banner_chinese.mp4'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
const { locale } = useI18n()
|
||||||
|
|
||||||
|
const isZh = computed(() => {
|
||||||
|
return locale.value === 'CHINESE_SIMPLIFIED'
|
||||||
|
})
|
||||||
|
|
||||||
|
const bannerUrl = computed(() => {
|
||||||
|
return isZh.value ? bannerZh : banner
|
||||||
|
})
|
||||||
|
|
||||||
const handleSubmitApplication = () => {
|
const handleSubmitApplication = () => {
|
||||||
router.push('/award/contestants')
|
router.push('/award/contestants')
|
||||||
@@ -110,4 +126,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.is-zh {
|
||||||
|
.submit-btn {
|
||||||
|
padding: 0 7.5rem;
|
||||||
|
height: 7.8rem;
|
||||||
|
border-radius: 7.74rem;
|
||||||
|
column-gap: 3.8rem;
|
||||||
|
// justify-content: space-between;
|
||||||
|
&,
|
||||||
|
.ddl {
|
||||||
|
width: 35.4rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user