Browse Source

电商翻译

lzm_web
Linzm 3 months ago
parent
commit
75e04a4de3
  1. 97
      src/App.vue
  2. 314
      src/lang/data/en.ts
  3. 313
      src/lang/data/ko.ts
  4. 311
      src/lang/data/zh-CN.ts
  5. 312
      src/lang/data/zh-TW.ts
  6. 57
      src/lang/i18n.ts
  7. 1
      src/lang/utils.ts
  8. 151
      src/views/badge/index.vue
  9. 15
      src/views/badge/myOrder.vue
  10. 47
      src/views/badge/orderDetail.vue
  11. 110
      src/views/badge/preview.vue
  12. 17
      src/views/badge/record.vue

97
src/App.vue

@ -12,89 +12,50 @@ import ko from 'vant/es/locale/lang/ko-KR'; @@ -12,89 +12,50 @@ import ko from 'vant/es/locale/lang/ko-KR';
const { i18next, t } = useTranslation();
i18n.set(t);
watch(
() => i18next.language,
(val: any) => {
console.log("val", val);
},
{ immediate: true }
);
// function getLocaleName() {
// switch (i18next.language) {
// case 'zh':
// case "zh-CN":
// return 'zh-CN';
// case "en-US":
// case "en":
// return 'en-US';
// case "es":
// case "es-AR":
// case "es-BO":
// case "es-CL":
// case "es-ES":
// case "es-MX":
// case "es-AR":
// return 'es';
// case "zh-TW":
// case "zh-HK":
// return 'zh-TW';
// default:
// return 'en';
// }
// }
function getLocale() {
switch (i18next.language) {
// i18next Vant Locale
function getVantLocale() {
const lang = i18next.language || "zh-CN";
switch (lang) {
case "zh-CN":
return zhCN;
case "en":
return enUS;
case "es":
case "es-AR":
case "es-BO":
case "es-CL":
case "es-ES":
case "es-MX":
case "es-AR":
case "en-US":
return enUS;
case "zh-TW":
case "zh-HK":
return zhTW;
case "ko":
case "ko-KR":
return ko;
default:
return enUS;
return zhCN; // 使
}
}
// Vant Locale
function updateVantLocale() {
const lang = i18next.language || "zh-CN";
const vantLocale = getVantLocale();
Locale.use(lang, vantLocale);
console.log("语言已切换为:", lang);
}
onMounted(() => {
let obj = filterUrl(window.location.href)
// console.log(obj)
let urlLan = obj.lang;
//
let cookieLan = localStorage.getItem("i18nextLng")
//
let userLan = navigator.language;
let lang = urlLan || cookieLan || userLan || "zh-CN";
Locale.use(lang || i18next.language, getLocale())
})
function filterUrl(url) {
let filter = url.split("?")[1]?.split("&");
var obj = {};
for (var i = 0; i < filter?.length; i++) {
var item = filter[i].split('=');
var key = item[0];
var value = item[1];
obj[key] = value;
// i18next Vant Locale
watch(
() => i18next.language,
(newLang: string) => {
if (newLang) {
updateVantLocale();
}
return obj
}
},
{ immediate: true }
);
// Vant Locale
onMounted(() => {
// i18next Vant Locale
updateVantLocale();
});
</script>

314
src/lang/data/en.ts

@ -1,167 +1,153 @@ @@ -1,167 +1,153 @@
const en = {
user: {
"language": "language"
},
"store_name": "Store",
"type_id_2": "Size",
"type_id_3": "person",
"type_id_4": "Pet",
"type_id_5": "props",
"total": "total",
"total_price": "total price",
"submit_tip": "Click to log in to submit and wait for the queue",
"mobile_form_tip": "or fill in the mobile phone name registration",
"title": "Line up for taking photos abroad",
"err_tip_page": "The link parameter is wrong, the store information cannot be obtained",
"pl_chose_goods": "Please choose Size",
"pl_chose_attr": "Please choose the Posture",
"success_queue": "Successful queuing",
"fail_queue": "queuing failed",
"email": "Email",
"mobile": "Mobile phone number",
"InternationalTelephoneAreaCode": "International telephone area code",
"name": "Name",
"submit": "Submit",
"mobile_empty": "Mobile phone number cannot be empty",
"name_empty": "Name cannot be empty",
"email_empty": "Email cannot be empty",
"tip": "The above is the reference price for a single photo. Please consult with the shop assistant for details.",
"user_service_agreement": "user service agreement",
"user_privacy_agreement": "privacy policy",
"suwa_child_privacy_policy": "children privacy policy",
"agree_and_continue": "agree and continue",
"agree_text": "I agree",
"privacy_hint_one": "Regardless of where your data is processed and stored, we will always collect and process your data in accordance with our privacy policy and user agreement.",
"privacy_hint_two": "In compliance with the requirements of privacy protection laws in the mainland of China, you are required to sign this informed consent form.",
"agreement_and_policy": "User Agreement and Privacy Policy",
"agree_tip": "Please agree to the user service agreement and privacy policy",
"queue_success": "Successful queuing",
"your_queue_number_is": "Your queue number is",
"Please_wait_for_the_number_to_be_called": "Please wait for the number to be called",
"Number": "Number",
"go_back": "Go back",
"user_phone_is_empty": "User phone number is empty",
"store_is_empty": "Store is empty",
"calculate_total_amount_error": "Calculate total amount error",
"create_user_error": "Create user error",
"You_have_registered_please_wait": "You have registered, please wait",
"server_error": "The server is having a small break, please try again later",
"name_required": "Name is required",
"mobile_required": "Mobile is required",
"站姿": "Standing",
"宠物+站姿": "Pet+Standing",
"弯腰/半蹲/坐椅": "Bending/Squatting/Sit on a chair",
"全蹲/坐地": "Full squat/Sitting",
"宠物": "Pet",
"道具": "Props",
"suwa_user_service_agreement": "Suwa User Service Agreement",
"suwa_privacy_policy": "Suwa Privacy Policy",
"queue_buy_type": "Buy type",
'loading': 'Loading',
'加载中...': 'Loading...',
"agree_tip_prefix": "I have read and agreed",
"queue_price_tip": "The above is the reference price for a single photo. Please consult with the shop assistant for details.",
"birthday": "birthday",
"手办": "Collectible Figure",
"3D相册": "3D Album",
"体验3D相册": "Experience 3D Album",
"元": "CNY",
"合计:": "Total:",
"您前面还有": "There are",
"人请等待叫号": "people ahead of you, please wait for your turn.",
"返回": "Go back",
"排队成功": "Queue successful",
"葡哇立体肖像": "3D Photography",
"排队": "Queue",
"登录": "Login",
"客户手机号和客户编号不能同时为空": "The customer's phone number and customer ID cannot both be empty at the same time.",
"详情": "Details",
"人": "Person",
"3D相册制作中": "3D album creation in progress",
"3D相册体验中": "3D album experiencing",
"3D相册体验结束": "3D album experience ended",
"您购买的3D相册正在精修中!": "You purchased 3D album is being refined!",
"请求失败,点击重新加载": "Request failed, please click to reload.",
"没有更多了": "There is no more",
"查看3D相册": "View 3D album",
"倒计时": "countdown ",
"天": "days",
"建模完成":"modeling completed",
"待修模":"To be repair",
"修模中":"Repairing",
"待打印":"To be print",
"待建模":"To be model",
"打印中":"printing",
"未提交":"Not submitted",
"快递中":"express delivery",
"称净重":"Weighted(net)",
"建模中":"Modelling",
"3D相册已创建":"3D album created",
"后道工序处理":"printed processing",
"后道工序处理中":"printed processing",
"订单信息": "Order information",
"订单详情": "Order detail",
"订单ID":"order ID",
"拍摄时间":"shoot time",
"复制":"copy",
"重打":"Retype",
"加打":"Placing order",
"订单":"Order",
"首页":"Home",
"我的订单":"Order",
"订单记录": "Order record",
"联系门店": "Contact store",
"拍摄门店": "Shooting location",
"费用合计": "Total cost",
"复制成功": "Copy succeeded",
"复制失败": "Copy Failed",
"保存成功": "Successfully saved",
"暂无快递信息": "No tracking info",
"退出登录...": "Logging out...",
"渲染中...": "Rendering...",
"数据加载中...": "Data loading...",
"故障模型,请联系门店处理": "Faulty model, please contact the store for assistance",
"3D相册体验已结束": "3D album experience has expired",
"您购买的3D相册正在精修中,请稍候!": "The 3D album is being edited, please wait!",
"您未购买3D相册": "You have not purchased a 3D album.",
"体验还剩": "Experience remaining",
"模型问题反馈": "Model issue feedback",
"我要认领": "Claim",
"纯色背景": "Solid Color Background",
"已选择": "Selected",
"主题背景": "Theme Background",
"复位": "reset",
"保存": "save",
"旋转": "rotate",
"停止": "stop",
"换背景": "background",
"收起": "Collapse",
"展开": "Expand",
"体验AR": "AR",
"我的":"Profile",
"关于我们":"About us",
"语言":"Language",
"头像":"Avatar",
"账号":"Account",
"性别":"Sex",
"退出登录":"Logout",
"确认退出登录?":"Confirm to log out?",
"确认退出":"Confirm",
"我再想想":"Cancel",
"个人中心":"Personal Center",
"请登录":"Please log in",
"删除订单":"delete the order",
"取消":"cancel",
"退出AR":"Exit",
"称毛重管理":"Weighing management",
"称毛重":"Weighing",
"简体中文":"Simplified Chinese",
"英文":"English",
"繁体中文":"Traditional Chinese",
"韩文":"Korean",
"订单编号": "Order ID",
"产品类型": "Product Type",
"立体徽章": "3D Badge",
"浮雕相框": "Relief Frame",
"3D冰箱贴": "3D Fridge Magnet",
"3D卡通手办": "3D Cartoon Figure",
"剩余兑换数量": "Remaining Exchange Quantity",
"剩余兑换": "Remaining Exchange",
"设计图集": "Design Gallery",
"手机号码": "Mobile Number",
"请输入手机号": "Please enter mobile number",
"3D真人肖像": "3D Portrait",
"人物立体徽章": "Character 3D Badge",
"宠物立体徽章": "Pet 3D Badge",
"上传正面照片": "Upload Front Photo",
"确认下单": "Confirm Order",
"1张五官清晰的正面照片": "1 clear front-facing photo",
"选择一个你喜欢的设计": "Choose a design you like",
"人物主体": "Character Subject",
"宠物主体": "Pet Subject",
"不同主体的照片检测标准不同": "Different subjects have different photo detection standards",
"照片示例": "Photo Examples",
"图片上传指南": "Image Upload Guide",
"点击上传照片": "Click to upload photo",
"上传照片时建议勾选[原图]": "It is recommended to select [Original] when uploading photos",
"请确定您对上传的照片拥有合法使用权利或已取得他人合法授权,且同意本平台分析图片信息以提供生成服务": "Please confirm that you have legal rights to use the uploaded photos or have obtained legal authorization from others, and agree that this platform analyzes image information to provide generation services",
"风格类型": "Style Type",
"多视角参考图": "Multi-angle Reference Images",
"AI建模具有随机性,上传参考图有助于更好的还原主体特征": "AI modeling has randomness, uploading reference images helps better restore subject features",
"温馨提示:请上传只有": "Tip: Please upload only ",
"人的照片": " person(s) in the photo",
"只宠物的照片": " pet(s) in the photo",
"剩余": "Remaining ",
"次": " times",
"体验1次": "Experience 1 time",
"开始设计": "Start Design",
"我已了解": "I Understand",
"多主体": "Multiple Subjects",
"光线昏暗": "Dim Light",
"后侧面及背影": "Back/Side View",
"照片模糊": "Blurry Photo",
"照片留白过少": "Insufficient Margins",
"注:需要先输入手机号才可体验徽章设计": "Note: Please enter mobile number first to experience badge design",
"请先上传照片": "Please upload photo first",
"剩余次数不足": "Insufficient remaining times",
"请输入正确的手机号": "Please enter a valid mobile number",
"请上传尺寸大于300*300像素的照片": "Please upload a photo larger than 300*300 pixels",
"照片大小不能超过10M": "Photo size cannot exceed 10M",
"人脸检测成功": "Face detection successful",
"人脸检测失败": "Face detection failed",
"上传失败": "Upload failed",
"上传中...": "Uploading...",
"照片上传成功": "Photo uploaded successfully",
"人物3D冰箱贴暂未开放": "Character 3D fridge magnet is not yet available",
"该订单属于宠物卡通手办": "This order is for pet cartoon figure",
"该订单属于人物卡通手办": "This order is for character cartoon figure",
"图片读取失败": "Failed to read image",
"图片加载失败": "Failed to load image",
"张": " photos",
"笔": " orders",
"我的订单": "My Orders",
"效果预览": "Effect Preview",
"正面照片": "Front Photo",
"清晰的正面照片": "Clear front photo",
"选择一个你喜欢的效果图下单": "Choose an effect image you like to place an order",
"总计大约需要90秒,请耐心等待...": "It will take about 90 seconds in total, please wait patiently...",
"设计中": "Designing",
"设计失败": "Design Failed",
"人物浮雕相框": "Character Relief Frame",
"宠物浮雕相框": "Pet Relief Frame",
"人物3D冰箱贴": "Character 3D Fridge Magnet",
"宠物3D冰箱贴": "Pet 3D Fridge Magnet",
"人物卡通手办": "Character Cartoon Figure",
"宠物卡通手办": "Pet Cartoon Figure",
"3D全彩打印": "3D Full Color Printing",
"工艺": "Craft",
"请输入文字": "Please enter text",
"订购数量": "Order Quantity",
"地址识别": "Address Recognition",
"请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)": "Please enter name, mobile number, and detailed address (e.g.: Zhang San 13800138000 No.1 Science Park, Nanshan District, Shenzhen, Guangdong Province)",
"自动识别": "Auto Recognize",
"识别结果": "Recognition Result",
"收货地址": "Delivery Address",
"请选择": "Please select",
"再次生成": "Regenerate",
"前后对比": "Before/After Comparison",
"保存图片": "Save Image",
"确认选择": "Confirm Selection",
"原图": "Original",
"效果图": "Effect",
"温馨提示:AI设计的徽章效果图是根据用户提供的照片机器学习生成的,多试几次就能找到你满意的徽章~": "Tip: The AI-designed badge effect image is generated by machine learning based on photos provided by users. Try a few more times to find a badge you're satisfied with~",
"长按图片 → 保存到相册": "Long press image → Save to album",
"徽章预览": "Badge Preview",
"当前次数已用完,请重新购买": "Current times have been used up, please purchase again",
"请确认是否重新生成。": "Please confirm whether to regenerate.",
"请先选择下单数量": "Please select order quantity first",
"请先填写收货人信息": "Please fill in recipient information first",
"请先填写收货人手机号": "Please fill in recipient mobile number first",
"请先选择地区": "Please select region first",
"请先填写详细地址": "Please fill in detailed address first",
"请再次确认是否选择这个模型下单,下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "Please confirm again whether to select this model to place an order. After placing the order, it is expected to take 10 days to complete production and shipping. If you have any questions about the product, please contact customer service.",
"下单成功": "Order placed successfully",
"照片数据分析中": "Analyzing photo data",
"提炼图像关键词": "Extracting image keywords",
"图像生成中": "Generating image",
"图像后处理与优化": "Post-processing and optimizing image",
"订单详情": "Order Details",
"下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "After placing an order, it is expected to take 10 days to complete production and shipping. If you have any questions about the product, please contact customer service.",
"收货信息": "Delivery Information",
"收货人信息": "Recipient Information",
"产品信息": "Product Information",
"产品名称": "Product Name",
"人物冰箱贴": "Character Fridge Magnet",
"宠物冰箱贴": "Pet Fridge Magnet",
"尺寸": "Size",
"形状": "Shape",
"购买数量": "Purchase Quantity",
"订单信息": "Order Information",
"购买订单id": "Order ID",
"购买时间": "Purchase Time",
"待支付": "Pending Payment",
"已取消": "Cancelled",
"生产中": "In Production",
"待收货": "Pending Delivery",
"已完成": "Completed",
"设计记录": "Design Records",
"注:可点击效果图进行下单打印": "Note: Click on the effect image to place an order for printing",
"没有更多了": "No more data",
"加载中...": "Loading...",
"暂无数据": "No data",
"获取数据失败": "Failed to fetch data",
"圆形": "Round",
"方形": "Square",
"圆角方形": "Rounded Square",
"圆角长方体": "Rounded Rectangle",
"心形": "Heart",
"方形波浪款": "Square Wave",
"椭圆形波浪款": "Ellipse Wave",
"写实手办": "Realistic Figure",
"Q版卡通": "Q-style Cartoon",
"无道具(≤6cm-ds)": "No props (≤6cm-ds)",
"有道具(>6cm-ds)": "Props (>6cm-ds)",
"无道具( ≤ 6cm)": "No props (≤6cm)",
"有道具(>6cm)": "Props (>6cm)",
"Q版卡通-宠物": "Q-style Cartoon - Pet",
"宠物写实肖像": "Pet Realistic Portrait",
"写实肖像": "Realistic Portrait",
"日漫3D": "Japanese 3D",
"迪斯尼皮克斯": "Disney Pixar",
"潮玩IP": "IP Toy",
}
export default en

313
src/lang/data/ko.ts

@ -1,166 +1,153 @@ @@ -1,166 +1,153 @@
const ko = {
user: {
"language": "language"
},
"store_name": "문점",
"type_id_2": "모델크기",
"type_id_3": "촬영포즈",
"type_id_4": "애완동물",
"type_id_5": "추가 휴대품",
"total": "합계",
"total_price": "가격",
"submit_tip": "로그인 클릭 후 제출하여 대기합니다",
"mobile_form_tip": "휴대폰 번호와 이름 등록",
"title": "사진을 찍고 줄을 서다",
"err_tip_page": "링크 매개변수 오류로 인해 매장 정보를 가져올 수 없습니다",
"pl_chose_goods": "먼저 피규어 크기를 선택하세요",
"pl_chose_attr": "먼저 촬영 포즈를 선택하세요",
"success_queue": "대기 성공",
"fail_queue": "대기 실패",
"email": "이메일",
"mobile": "휴대폰",
"InternationalTelephoneAreaCode": "국제 전화 국가 코드",
"name": "이름",
"submit": "제출",
"mobile_empty": "휴대폰 번호는 비워둘 수 없습니다",
"name_empty": "이름은 비워둘 수 없습니다",
"email_empty": "사서함은 비워둘 수 없습니다",
"tip": "1 인용 사진 참고가격이라 자세히 점원과 문의할 수 있습니다",
"user_service_agreement": "서비스 계약",
"user_privacy_agreement": "개인 정보 보호 정책",
"suwa_child_privacy_policy": "어린이 개인 정보 보호 정책",
"agree_and_continue": "동의하고 계속",
"agree_text": "나는 동의한다",
"privacy_hint_one": "데이터가 처리되고 저장되는 위치에 관계없이, 당사는 항상 개인 정보 보호 정책 및 사용자 계약에 따라 귀하의 데이터를 수집하고 처리합니다.",
"privacy_hint_two": "중국 본토의 개인 정보 보호법의 요구 사항을 준수하기 위해, 귀하는 이 동의서에 서명해야합니다.",
"agreement_and_policy": "사용자 계약 및 개인 정보 보호 정책",
"agree_tip": "계약서를 읽고 동의해 주세요",
"your_queue_number_is": "대기 일련 번호는 다음과 같습니다",
"Please_wait_for_the_number_to_be_called": "전화 번호를 기다려 주세요",
"Number": "번호",
"go_back": "돌아오다",
"user_phone_is_empty": "핸드폰 번호는 비워둘 수 없습니다",
"store_is_empty": "문점은 비워둘 수 없다",
"calculate_total_amount_error": "총 금액 계산 오류",
"create_user_error": "사용자 생성 오류",
"You_have_registered_please_wait": "이미 등록하셨으니 기다려 주세요",
"server_error": "서버가 소실되었으니, 잠시 후에 다시 시도해 주십시오",
"name_required": "이름은 필수 항목입니다",
"mobile_required": "휴대폰은 필수다",
"站姿": "자세",
"宠物+站姿": "애완동물+자세",
"弯腰/半蹲/坐椅": "허리를 굽히다/쭈그리고 앉다",
"全蹲/坐地": "쭈그리고 앉다",
"宠物": "애완동물",
"道具": "소품",
"suwa_user_service_agreement": "빠른 와우 사용자 서비스 계약",
"suwa_privacy_policy": "빠른 와우 개인 정보 보호 정책",
"queue_buy_type": "구매 유형",
'loading': '로드 중',
'加载中...': '로드 중...',
"agree_tip_prefix": "나는 이미 읽고 동의했다",
"queue_price_tip": "1 인용 사진 참고가격이라 자세히 점원과 문의할 수 있습니다",
"birthday": "생일",
"手办": "숫자",
"3D相册": "3D 앨범",
"体验3D相册": "체험 3D 앨범",
"元": "위안",
"合计:": "합계:",
"您前面还有": "당신 앞에 아직",
"人请等待叫号": "명이 있습니다. 호출을 기다려 주세요",
"返回": "돌아오다",
"排队成功": "줄을 서서 성공하다",
"葡哇立体肖像": "3D 촬영",
"排队": "줄을 서다",
"登录": "로그인",
"客户手机号和客户编号不能同时为空": "고객 휴대폰 번호와 고객 번호는 동시에 비워 둘 수 없습니다",
"详情": "상세 정보",
"人": "사람",
"3D相册制作中": "3D 앨범 제작 중",
"3D相册体验中": "3D 앨범 체험 중",
"3D相册体验结束": "3D 앨범 체험 끝",
"您购买的3D相册正在精修中!": "구매하신 3D 앨범은 지금 정밀 수리 중입니다!",
"请求失败,点击重新加载": "요청이 실패했습니다. 다시 로드를 클릭하십시오",
"没有更多了": "더 이상",
"查看3D相册": "더 이상",
"倒计时": "카운트다운",
"天": "하늘",
"建模完成":"모델링이 완료되었습니다",
"待修模":"수정준비",
"修模中":"수정",
"待打印":"인쇄준비",
"待建模":"모델링준비",
"打印中":"프린터",
"未提交":"제출되지 않았습니다",
"快递中":"특급 배송",
"称净重":"무게측정(g)",
"建模中":"모델링",
"3D相册已创建":"3D 앨범 생성",
"后道工序处理":"인쇄 처리",
"后道工序处理中":"후속 프로세스 처리 중",
"订单信息": "주문 정보",
"订单详情": "주문 상세 정보",
"订单ID":"주문 ID",
"拍摄时间":"촬영 시간",
"复制":"복사",
"重打":"다시 입력",
"加打":"인쇄 추가",
"订单":"주문",
"首页":"홈 페이지",
"我的订单":"주문",
"订单记录": "주문 기록",
"联系门店": "문점에 연락하다",
"拍摄门店": "매장을 찍다",
"费用合计": "비용 합계",
"复制成功": "복사에 성공했습니다",
"复制失败": "복사에 실패했습니다",
"保存成功": "저장에 성공했습니다",
"暂无快递信息": "잠시 택배 정보가 없습니다",
"退出登录...": "로그인을 종료하다...",
"渲染中...": "렌더링 중...",
"数据加载中...": "데이터 로드 중...",
"故障模型,请联系门店处理": "고장 모델, 문점에 연락하여 처리해 주세요",
"3D相册体验已结束": "3D 앨범 체험이 끝났습니다",
"您购买的3D相册正在精修中,请稍候!": "구입하신 3D 앨범은 지금 정밀 수리 중입니다. 잠시만 기다려 주세요!",
"您未购买3D相册": "3D 앨범을 구입하지 않았습니다",
"体验还剩": "체험이 아직 남아있다",
"模型问题反馈": "모델 문제 피드백",
"我要认领": "나는 주장하고 싶다.",
"纯色背景": "단색 배경",
"已选择": "선택됨",
"主题背景": "테마 배경",
"复位": "재설정",
"保存": "저장",
"旋转": "회전",
"停止": "멈추다",
"换背景": "배경",
"收起": "거두다",
"展开": "펼치다",
"体验AR": "AR",
"我的":"윤곽",
"关于我们":"우리에 대해서",
"语言":"언어",
"头像":"아바타",
"账号":"계좌번호",
"性别":"성별",
"退出登录":"로그인을 종료하다",
"确认退出登录?":"로그인 종료를 확인하시겠습니까?",
"确认退出":"확인",
"我再想想":"취소",
"个人中心":"개인센터",
"请登录":"로그인하십시오",
"删除订单":"주문을 삭제합니다",
"取消":"확인",
"称毛重管理":"무게 측정 관리",
"称毛重":"무게 측정",
"退出AR":"수출",
"简体中文":"중국어 간체",
"英文":"영어",
"繁体中文":"중국어 번체",
"韩文":"한국어",
"订单编号": "주문 번호",
"产品类型": "제품 유형",
"立体徽章": "3D 배지",
"浮雕相框": "부조 액자",
"3D冰箱贴": "3D 냉장고 자석",
"3D卡通手办": "3D 만화 피규어",
"剩余兑换数量": "남은 교환 수량",
"剩余兑换": "남은 교환",
"设计图集": "디자인 갤러리",
"手机号码": "휴대폰 번호",
"请输入手机号": "휴대폰 번호를 입력하세요",
"3D真人肖像": "3D 초상화",
"人物立体徽章": "캐릭터 3D 배지",
"宠物立体徽章": "애완동물 3D 배지",
"上传正面照片": "정면 사진 업로드",
"确认下单": "주문 확인",
"1张五官清晰的正面照片": "1장의 선명한 정면 사진",
"选择一个你喜欢的设计": "좋아하는 디자인 선택",
"人物主体": "캐릭터 주제",
"宠物主体": "애완동물 주제",
"不同主体的照片检测标准不同": "다른 주제는 다른 사진 감지 기준을 가집니다",
"照片示例": "사진 예시",
"图片上传指南": "이미지 업로드 가이드",
"点击上传照片": "사진 업로드 클릭",
"上传照片时建议勾选[原图]": "사진 업로드 시 [원본] 선택을 권장합니다",
"请确定您对上传的照片拥有合法使用权利或已取得他人合法授权,且同意本平台分析图片信息以提供生成服务": "업로드한 사진에 대한 합법적인 사용 권한이 있거나 타인의 합법적 승인을 받았으며, 본 플랫폼이 이미지 정보를 분석하여 생성 서비스를 제공하는 것에 동의함을 확인하세요",
"风格类型": "스타일 유형",
"多视角参考图": "다각도 참조 이미지",
"AI建模具有随机性,上传参考图有助于更好的还原主体特征": "AI 모델링은 무작위성을 가지며, 참조 이미지를 업로드하면 주제 특징을 더 잘 복원하는 데 도움이 됩니다",
"温馨提示:请上传只有": "팁: 다음만 포함된 사진을 업로드하세요: ",
"人的照片": "명의 사람",
"只宠物的照片": "마리의 애완동물",
"剩余": "남은 ",
"次": "회",
"体验1次": "1회 체험",
"开始设计": "디자인 시작",
"我已了解": "이해했습니다",
"多主体": "다중 주제",
"光线昏暗": "어두운 조명",
"后侧面及背影": "후면/측면 뷰",
"照片模糊": "흐릿한 사진",
"照片留白过少": "여백 부족",
"注:需要先输入手机号才可体验徽章设计": "참고: 배지 디자인을 체험하려면 먼저 휴대폰 번호를 입력해야 합니다",
"请先上传照片": "먼저 사진을 업로드하세요",
"剩余次数不足": "남은 횟수가 부족합니다",
"请输入正确的手机号": "올바른 휴대폰 번호를 입력하세요",
"请上传尺寸大于300*300像素的照片": "300*300픽셀보다 큰 사진을 업로드하세요",
"照片大小不能超过10M": "사진 크기는 10M를 초과할 수 없습니다",
"人脸检测成功": "얼굴 감지 성공",
"人脸检测失败": "얼굴 감지 실패",
"上传失败": "업로드 실패",
"上传中...": "업로드 중...",
"照片上传成功": "사진 업로드 성공",
"人物3D冰箱贴暂未开放": "캐릭터 3D 냉장고 자석은 아직 제공되지 않습니다",
"该订单属于宠物卡通手办": "이 주문은 애완동물 만화 피규어용입니다",
"该订单属于人物卡通手办": "이 주문은 캐릭터 만화 피규어용입니다",
"图片读取失败": "이미지 읽기 실패",
"图片加载失败": "이미지 로드 실패",
"张": "장",
"笔": "건",
"我的订单": "내 주문",
"效果预览": "효과 미리보기",
"正面照片": "정면 사진",
"清晰的正面照片": "선명한 정면 사진",
"选择一个你喜欢的效果图下单": "좋아하는 효과 이미지를 선택하여 주문하세요",
"总计大约需要90秒,请耐心等待...": "총 약 90초가 소요됩니다. 잠시만 기다려주세요...",
"设计中": "디자인 중",
"设计失败": "디자인 실패",
"人物浮雕相框": "캐릭터 부조 액자",
"宠物浮雕相框": "애완동물 부조 액자",
"人物3D冰箱贴": "캐릭터 3D 냉장고 자석",
"宠物3D冰箱贴": "애완동물 3D 냉장고 자석",
"人物卡通手办": "캐릭터 만화 피규어",
"宠物卡通手办": "애완동물 만화 피규어",
"3D全彩打印": "3D 풀컬러 프린팅",
"工艺": "공예",
"请输入文字": "텍스트를 입력하세요",
"订购数量": "주문 수량",
"地址识别": "주소 인식",
"请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)": "이름, 휴대폰 번호, 상세 주소를 입력하세요 (예: 장산 13800138000 광동성 심천시 남산구 과학기술원 1호)",
"自动识别": "자동 인식",
"识别结果": "인식 결과",
"收货地址": "배송 주소",
"请选择": "선택하세요",
"再次生成": "다시 생성",
"前后对比": "전후 비교",
"保存图片": "이미지 저장",
"确认选择": "선택 확인",
"原图": "원본",
"效果图": "효과",
"温馨提示:AI设计的徽章效果图是根据用户提供的照片机器学习生成的,多试几次就能找到你满意的徽章~": "팁: AI가 디자인한 배지 효과 이미지는 사용자가 제공한 사진을 기반으로 머신러닝으로 생성됩니다. 몇 번 더 시도하면 만족스러운 배지를 찾을 수 있습니다~",
"长按图片 → 保存到相册": "이미지 길게 누르기 → 앨범에 저장",
"徽章预览": "배지 미리보기",
"当前次数已用完,请重新购买": "현재 횟수가 모두 소진되었습니다. 다시 구매해주세요",
"请确认是否重新生成。": "다시 생성할지 확인하세요.",
"请先选择下单数量": "먼저 주문 수량을 선택하세요",
"请先填写收货人信息": "먼저 수령인 정보를 입력하세요",
"请先填写收货人手机号": "먼저 수령인 휴대폰 번호를 입력하세요",
"请先选择地区": "먼저 지역을 선택하세요",
"请先填写详细地址": "먼저 상세 주소를 입력하세요",
"请再次确认是否选择这个模型下单,下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "이 모델을 선택하여 주문할지 다시 확인하세요. 주문 후 생산 및 배송 완료까지 약 10일이 소요됩니다. 제품에 대한 문의사항이 있으시면 고객 서비스에 문의하세요.",
"下单成功": "주문 성공",
"照片数据分析中": "사진 데이터 분석 중",
"提炼图像关键词": "이미지 키워드 추출 중",
"图像生成中": "이미지 생성 중",
"图像后处理与优化": "이미지 후처리 및 최적화 중",
"订单详情": "주문 상세",
"下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "주문 후 생산 및 배송 완료까지 약 10일이 소요됩니다. 제품에 대한 문의사항이 있으시면 고객 서비스에 문의하세요.",
"收货信息": "배송 정보",
"收货人信息": "수령인 정보",
"产品信息": "제품 정보",
"产品名称": "제품명",
"人物冰箱贴": "캐릭터 냉장고 자석",
"宠物冰箱贴": "애완동물 냉장고 자석",
"尺寸": "크기",
"形状": "모양",
"购买数量": "구매 수량",
"订单信息": "주문 정보",
"购买订单id": "주문 ID",
"购买时间": "구매 시간",
"待支付": "결제 대기",
"已取消": "취소됨",
"生产中": "생산 중",
"待收货": "배송 대기",
"已完成": "완료됨",
"设计记录": "디자인 기록",
"注:可点击效果图进行下单打印": "참고: 효과 이미지를 클릭하여 주문 및 인쇄할 수 있습니다",
"没有更多了": "더 이상 데이터가 없습니다",
"加载中...": "로딩 중...",
"暂无数据": "데이터 없음",
"获取数据失败": "데이터 가져오기 실패",
"圆形": "둥근",
"方形": "네모",
"圆角方形": "둥근 네모",
"圆角长方体": "둥근 직사각형",
"心形": "하트",
"方形波浪款": "네모 파도",
"椭圆形波浪款": "타원형 파도",
"写实手办": "실물 피규어",
"Q版卡通": "Q-스타일 만화",
"无道具(≤6cm-ds)": "무거운 물건 없음(≤6cm-ds)",
"有道具(>6cm-ds)": "무거운 물건 있음(>6cm-ds)",
"无道具( ≤ 6cm)": "무거운 물건 없음( ≤ 6cm)",
"有道具(>6cm)": "무거운 물건 있음(>6cm)",
"Q版卡通-宠物": "Q-스타일 만화 - 애완동물",
"宠物写实肖像": "애완동물 실물 초상화",
"写实肖像": "실물 초상화",
"日漫3D": "일본 3D",
"迪斯尼皮克斯": "디즈니 픽사",
"潮玩IP": "IP 토이",
}
export default ko

311
src/lang/data/zh-CN.ts

@ -1,169 +1,152 @@ @@ -1,169 +1,152 @@
const zhCN = {
user: {
"language": "语言",
},
"store_name":"门店",
"type_id_2":"手办尺寸",
"type_id_3":"拍摄姿势",
"type_id_4":"额外携带",
"type_id_5":"额外携带",
"total_price":"价格",
"total":"合计",
"submit_tip":"点击登录提交等待排队",
"mobile_form_tip":"或填写手机姓名登记",
"title":"拍照排队",
"err_tip_page":"链接参数错误,无法获取到门店信息",
"pl_chose_goods":"请先选择手办尺寸",
"pl_chose_attr":"请先选择拍摄姿势",
"success_queue":"排队成功",
"fail_queue":"排队失败",
"email": "邮箱",
"mobile": "手机",
"InternationalTelephoneAreaCode": "国际电话区号",
"name": "姓名",
"submit": "提交",
"mobile_empty": "手机号不能为空",
"name_empty": "姓名不能为空",
"email_empty": "邮箱不能为空",
"tip": "以上为单人拍照参考价格,详细可与店员咨询",
"user_service_agreement": "用户服务协议",
"user_privacy_agreement": "用户隐私政策",
"agree_tip": "请阅读并同意协议",
"your_queue_number_is": "您的排队序号是",
"Please_wait_for_the_number_to_be_called": "请等待叫号",
"Number": "号",
"go_back": "返回",
"user_phone_is_empty": "手机号不能为空",
"store_is_empty": "门店不能为空",
"calculate_total_amount_error": "计算总金额错误",
"create_user_error": "创建用户错误",
"You_have_registered_please_wait": "您已经登记过了,请等待",
"server_error": "服务器开小差了,请稍后再试",
"name_required": "名称是必填项",
"mobile_required": "手机是必填项",
"站姿": "站姿",
"宠物+站姿": "宠物+站姿",
"弯腰/半蹲/坐椅": "弯腰/半蹲/坐椅",
"全蹲/坐地": "全蹲/坐地",
"宠物": "宠物",
"道具": "道具",
"suwa_user_service_agreement": "用户服务协议",
"suwa_privacy_policy": "隐私政策",
"suwa_child_privacy_policy": "儿童隐私政策",
"agree_and_continue": "同意并继续",
"agree_text": "我同意",
"privacy_hint_one": "无论数据在何处进行处理和存储,我们将始终按照隐私政策及用户协议收集、处理您的数据。",
"privacy_hint_two": "遵照中国大陆隐私保护法律的要求,需要你签署本知情同意书。",
"agreement_and_policy": "用户协议及隐私政策",
'loading': '加载中',
'加载中...': '加载中...',
"agree_tip_prefix": "我已阅读并同意",
"queue_buy_type": "购买类型",
"queue_price_tip": "以上为单人拍照参考价格,详细可与店员咨询",
"birthday": "生日",
"手办":"手办",
"3D相册":"3D相册",
"体验3D相册":"体验3D相册",
"元": "元",
"合计:": "合计:",
"您前面还有": "您前面还有",
"人请等待叫号": "人请等待叫号",
"返回": "返回",
"排队成功": "排队成功",
"葡哇立体肖像": "葡哇立体肖像",
"排队": "排队",
"登录": "登录",
"客户手机号和客户编号不能同时为空": "客户手机号和客户编号不能同时为空",
"详情": "详情",
"建模完成": "建模完成",
"人": "人",
"3D相册制作中": "3D相册制作中",
"3D相册体验中": "3D相册体验中",
"3D相册体验结束": "3D相册体验结束",
"您购买的3D相册正在精修中!": "您购买的3D相册正在精修中!",
"请求失败,点击重新加载": "请求失败,点击重新加载",
"没有更多了": "没有更多了",
"查看3D相册": "查看3D相册",
"倒计时": "倒计时",
"天": "天",
"待修模":"待修模",
"修模中":"修模中",
"待打印":"待打印",
"待建模":"待建模",
"打印中":"打印中",
"未提交":"未提交",
"快递中":"快递中",
"称净重":"称净重",
"建模中":"建模中",
"3D相册已创建":"3D相册已创建",
"后道工序处理":"后道工序处理",
"后道工序处理中":"后道工序处理中",
"订单编号": "订单编号",
"产品类型": "产品类型",
"立体徽章": "立体徽章",
"浮雕相框": "浮雕相框",
"3D冰箱贴": "3D冰箱贴",
"3D卡通手办": "3D卡通手办",
"剩余兑换数量": "剩余兑换数量",
"剩余兑换": "剩余兑换",
"设计图集": "设计图集",
"手机号码": "手机号码",
"请输入手机号": "请输入手机号",
"3D真人肖像": "3D真人肖像",
"人物立体徽章": "人物立体徽章",
"宠物立体徽章": "宠物立体徽章",
"上传正面照片": "上传正面照片",
"确认下单": "确认下单",
"1张五官清晰的正面照片": "1张五官清晰的正面照片",
"选择一个你喜欢的设计": "选择一个你喜欢的设计",
"人物主体": "人物主体",
"宠物主体": "宠物主体",
"不同主体的照片检测标准不同": "不同主体的照片检测标准不同",
"照片示例": "照片示例",
"图片上传指南": "图片上传指南",
"点击上传照片": "点击上传照片",
"上传照片时建议勾选[原图]": "上传照片时建议勾选[原图]",
"请确定您对上传的照片拥有合法使用权利或已取得他人合法授权,且同意本平台分析图片信息以提供生成服务": "请确定您对上传的照片拥有合法使用权利或已取得他人合法授权,且同意本平台分析图片信息以提供生成服务",
"风格类型": "风格类型",
"多视角参考图": "多视角参考图",
"AI建模具有随机性,上传参考图有助于更好的还原主体特征": "AI建模具有随机性,上传参考图有助于更好的还原主体特征",
"温馨提示:请上传只有": "温馨提示:请上传只有",
"人的照片": "人的照片",
"只宠物的照片": "只宠物的照片",
"剩余": "剩余",
"次": "次",
"体验1次": "体验1次",
"开始设计": "开始设计",
"我已了解": "我已了解",
"多主体": "多主体",
"光线昏暗": "光线昏暗",
"后侧面及背影": "后侧面及背影",
"照片模糊": "照片模糊",
"照片留白过少": "照片留白过少",
"注:需要先输入手机号才可体验徽章设计": "注:需要先输入手机号才可体验徽章设计",
"请先上传照片": "请先上传照片",
"剩余次数不足": "剩余次数不足",
"请输入正确的手机号": "请输入正确的手机号",
"请上传尺寸大于300*300像素的照片": "请上传尺寸大于300*300像素的照片",
"照片大小不能超过10M": "照片大小不能超过10M",
"人脸检测成功": "人脸检测成功",
"人脸检测失败": "人脸检测失败",
"上传失败": "上传失败",
"上传中...": "上传中...",
"照片上传成功": "照片上传成功",
"人物3D冰箱贴暂未开放": "人物3D冰箱贴暂未开放",
"该订单属于宠物卡通手办": "该订单属于宠物卡通手办",
"该订单属于人物卡通手办": "该订单属于人物卡通手办",
"图片读取失败": "图片读取失败",
"图片加载失败": "图片加载失败",
"张": "张",
"笔": "笔",
"效果预览": "效果预览",
"正面照片": "正面照片",
"清晰的正面照片": "清晰的正面照片",
"选择一个你喜欢的效果图下单": "选择一个你喜欢的效果图下单",
"总计大约需要90秒,请耐心等待...": "总计大约需要90秒,请耐心等待...",
"设计中": "设计中",
"设计失败": "设计失败",
"人物浮雕相框": "人物浮雕相框",
"宠物浮雕相框": "宠物浮雕相框",
"人物3D冰箱贴": "人物3D冰箱贴",
"宠物3D冰箱贴": "宠物3D冰箱贴",
"人物卡通手办": "人物卡通手办",
"宠物卡通手办": "宠物卡通手办",
"3D全彩打印": "3D全彩打印",
"工艺": "工艺",
"请输入文字": "请输入文字",
"订购数量": "订购数量",
"地址识别": "地址识别",
"请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)": "请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)",
"自动识别": "自动识别",
"识别结果": "识别结果",
"收货地址": "收货地址",
"请选择": "请选择",
"再次生成": "再次生成",
"前后对比": "前后对比",
"保存图片": "保存图片",
"确认选择": "确认选择",
"原图": "原图",
"效果图": "效果图",
"温馨提示:AI设计的徽章效果图是根据用户提供的照片机器学习生成的,多试几次就能找到你满意的徽章~": "温馨提示:AI设计的徽章效果图是根据用户提供的照片机器学习生成的,多试几次就能找到你满意的徽章~",
"长按图片 → 保存到相册": "长按图片 → 保存到相册",
"徽章预览": "徽章预览",
"当前次数已用完,请重新购买": "当前次数已用完,请重新购买",
"请确认是否重新生成。": "请确认是否重新生成。",
"请先选择下单数量": "请先选择下单数量",
"请先填写收货人信息": "请先填写收货人信息",
"请先填写收货人手机号": "请先填写收货人手机号",
"请先选择地区": "请先选择地区",
"请先填写详细地址": "请先填写详细地址",
"下单成功": "下单成功",
"照片数据分析中": "照片数据分析中",
"提炼图像关键词": "提炼图像关键词",
"图像生成中": "图像生成中",
"图像后处理与优化": "图像后处理与优化",
"订单详情": "订单详情",
"下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。",
"收货信息": "收货信息",
"收货人信息": "收货人信息",
"产品信息": "产品信息",
"产品名称": "产品名称",
"人物冰箱贴": "人物冰箱贴",
"宠物冰箱贴": "宠物冰箱贴",
"尺寸": "尺寸",
"形状": "形状",
"购买数量": "购买数量",
"订单信息": "订单信息",
"订单ID":"订单ID",
"拍摄时间":"拍摄时间",
"复制":"复制",
"重打":"重打",
"加打":"加打",
"首页":"首页",
"订单":"订单",
"我的订单":"我的订单",
"订单记录": "订单记录",
"联系门店": "联系门店",
"拍摄门店": "拍摄门店",
"费用合计": "费用合计",
"复制成功": "复制成功",
"复制失败": "复制失败",
"保存成功": "保存成功",
"暂无快递信息": "暂无快递信息",
"退出登录中...": "退出登录中...",
"渲染中...": "渲染中...",
"数据加载中...": "数据加载中...",
"故障模型,请联系门店处理": "故障模型,请联系门店处理",
"3D相册体验已结束": "3D相册体验已结束",
"您购买的3D相册正在精修中,请稍候!": "您购买的3D相册正在精修中,请稍候!",
"您未购买3D相册": "您未购买3D相册",
"体验还剩": "体验还剩",
"模型问题反馈": "模型问题反馈",
"我要认领": "我要认领",
"纯色背景": "纯色背景",
"已选择": "已选择",
"主题背景": "主题背景",
"复位": "复位",
"保存": "保存",
"旋转": "旋转",
"停止": "停止",
"换背景": "换背景",
"收起": "收起",
"展开": "展开",
"体验AR": "体验AR",
"我的":"我的",
"关于我们":"关于我们",
"语言":"语言",
"头像":"头像",
"账号":"账号",
"性别":"性别",
"退出登录":"退出登录",
"确认退出登录?":"确认退出登录?",
"确认退出":"确认退出",
"我再想想":"我再想想",
"个人中心":"个人中心",
"请登录":"请登录",
"删除订单":"删除订单",
"取消":"取消",
"称毛重管理":"称毛重管理",
"称毛重":"称毛重",
"退出AR":"退出AR",
"简体中文":"简体中文",
"英文":"英文",
"繁体中文":"繁体中文",
"韩文":"韩文",
"购买订单id": "购买订单id",
"购买时间": "购买时间",
"待支付": "待支付",
"已取消": "已取消",
"生产中": "生产中",
"待收货": "待收货",
"已完成": "已完成",
"我的订单": "我的订单",
"设计记录": "设计记录",
"注:可点击效果图进行下单打印": "注:可点击效果图进行下单打印",
"没有更多了": "没有更多了",
"加载中...": "加载中...",
"暂无数据": "暂无数据",
"获取数据失败": "获取数据失败",
"圆形": "圆形",
"方形": "方形",
"圆角方形": "圆角方形",
"圆角长方体": "圆角长方体",
"心形": "心形",
"方形波浪款": "方形波浪款",
"椭圆形波浪款": "椭圆形波浪款",
"写实手办": "写实手办",
"Q版卡通": "Q版卡通",
"无道具(≤6cm-ds)": "无道具(≤6cm-ds)",
"有道具(>6cm-ds)": "有道具(>6cm-ds)",
"无道具( ≤ 6cm)": "无道具( ≤ 6cm)",
"有道具(>6cm)": "有道具(>6cm)",
"Q版卡通-宠物": "Q版卡通-宠物",
"宠物写实肖像": "宠物写实肖像",
"写实肖像": "写实肖像",
"日漫3D": "日漫3D",
"迪斯尼皮克斯": "迪斯尼皮克斯",
"潮玩IP": "潮玩IP",
}
export default zhCN

312
src/lang/data/zh-TW.ts

@ -1,167 +1,153 @@ @@ -1,167 +1,153 @@
const zhCT = {
user: {
"language": "語言"
},
"store_name": "門店",
"type_id_2": "手辦尺寸",
"type_id_3": "拍攝姿勢",
"type_id_4": "額外攜帶",
"type_id_5": "額外攜帶",
"total_price": "價格",
"total": "合計",
"submit_tip": "點擊登錄提交等待排隊",
"mobile_form_tip": "或填寫手機姓名登記",
"title": "拍照排隊",
"err_tip_page": "連結參數錯誤,無法獲取到門店資訊",
"pl_chose_goods": "請先選擇手辦尺寸",
"pl_chose_attr": "請先選擇拍攝姿勢",
"success_queue": "排隊成功",
"fail_queue": "排隊失敗",
"email": "郵箱",
"mobile": "手機",
"InternationalTelephoneAreaCode": "國際電話區號",
"name": "姓名",
"submit": "提交",
"mobile_empty": "手機號不能为空",
"name_empty": "姓名不能为空",
"email_empty": "郵箱不能为空",
"tip": "以上為單人拍照參考價格,詳細可與店員諮詢",
"user_service_agreement": "用戶服務協議",
"user_privacy_agreement": "隱私政策",
"suwa_child_privacy_policy": "兒童隱私政策",
"agree_and_continue": "同意並繼續",
"agree_text": "我同意",
"privacy_hint_one": "無論數據在何處進行處理和存儲,我們將始終按照隱私政策及用戶協議收集、處理您的數據。",
"privacy_hint_two": "遵照中國大陸隱私保護法律的要求,需要你簽署本知情同意書。",
"agreement_and_policy": "用戶協議及隱私協議",
"agree_tip": "請閱讀並同意協議",
"queue_success": "排隊成功",
"your_queue_number_is": "您的排隊號碼是",
"Please_wait_for_the_number_to_be_called": "請等待叫號",
"Number": "號",
"go_back": "返回",
"user_phone_is_empty": "手機號不能为空",
"store_is_empty": "門店不能为空",
"calculate_total_amount_error": "計算總金額錯誤",
"create_user_error": "創建用戶錯誤",
"You_have_registered_please_wait": "您已經登記過了,請等待",
"server_error": "服務器開小差了,請稍後再試",
"name_required": "名稱是必填項",
"mobile_required": "手機是必填項",
"站姿": "站姿",
"宠物+站姿": "寵物+站姿",
"弯腰/半蹲/坐椅": "彎腰/半蹲/坐椅",
"全蹲/坐地": "全蹲/坐地",
"宠物": "寵物",
"道具": "道具",
'loading': '載入中',
'加载中...': '載入中...',
"agree_tip_prefix": "我已閱讀並同意",
"queue_buy_type": "購買類型",
"queue_price_tip": "以上為單人拍照參考價格,詳細可與店員諮詢",
"birthday": "生日",
"手办": "手辦",
"3D相册": "3D相冊",
"体验3D相册": "體驗3D相冊",
"元": "元",
"合计:": "合計:",
"您前面还有": "您前面還有",
"人请等待叫号": "人請等待叫號",
"返回": "返回",
"排队成功": "排隊成功",
"葡哇立体肖像": "3D攝影",
"排队": "排隊",
"登录": "登錄",
"客户手机号和客户编号不能同时为空": "客户手機號碼與客戶編號不能同時為空",
"详情": "詳情",
"modeling_completed": "建模完成",
"人": "人",
"3D相册制作中": "3D相冊製作中",
"3D相册体验中": "3D相冊體驗中",
"3D相册体验结束": "3D相冊體驗結束",
"您购买的3D相册正在精修中!": "您所購買的3D相冊正在精修中!",
"请求失败,点击重新加载": "請求失敗,點擊重新加載",
"没有更多了": "沒有更多了",
"查看3D相册": "查看3D相冊",
"倒计时": "倒數",
"天": "天",
"待修模":"待修模",
"修模中":"修模中",
"待打印":"待列印",
"待建模":"待建模",
"打印中":"列印中",
"未提交":"未提交",
"快递中":"快遞中",
"称净重":"稱淨重",
"建模中":"建模中",
"3D相册已创建":"3D相冊已創建",
"后道工序处理":"後道工序處理",
"后道工序处理中":"後道工序處理中",
"订单信息": "訂單資訊",
"订单编号": "訂單編號",
"产品类型": "產品類型",
"立体徽章": "立體徽章",
"浮雕相框": "浮雕相框",
"3D冰箱贴": "3D冰箱貼",
"3D卡通手办": "3D卡通手辦",
"剩余兑换数量": "剩餘兌換數量",
"剩余兑换": "剩餘兌換",
"设计图集": "設計圖集",
"手机号码": "手機號碼",
"请输入手机号": "請輸入手機號",
"3D真人肖像": "3D真人肖像",
"人物立体徽章": "人物立體徽章",
"宠物立体徽章": "寵物立體徽章",
"上传正面照片": "上傳正面照片",
"确认下单": "確認下單",
"1张五官清晰的正面照片": "1張五官清晰的正面照片",
"选择一个你喜欢的设计": "選擇一個你喜歡的設計",
"人物主体": "人物主體",
"宠物主体": "寵物主體",
"不同主体的照片检测标准不同": "不同主體的照片檢測標準不同",
"照片示例": "照片示例",
"图片上传指南": "圖片上傳指南",
"点击上传照片": "點擊上傳照片",
"上传照片时建议勾选[原图]": "上傳照片時建議勾選[原圖]",
"请确定您对上传的照片拥有合法使用权利或已取得他人合法授权,且同意本平台分析图片信息以提供生成服务": "請確定您對上傳的照片擁有合法使用權利或已取得他人合法授權,且同意本平台分析圖片信息以提供生成服務",
"风格类型": "風格類型",
"多视角参考图": "多視角參考圖",
"AI建模具有随机性,上传参考图有助于更好的还原主体特征": "AI建模具有隨機性,上傳參考圖有助於更好的還原主體特徵",
"温馨提示:请上传只有": "溫馨提示:請上傳只有",
"人的照片": "人的照片",
"只宠物的照片": "隻寵物的照片",
"剩余": "剩餘",
"次": "次",
"体验1次": "體驗1次",
"开始设计": "開始設計",
"我已了解": "我已了解",
"多主体": "多主體",
"光线昏暗": "光線昏暗",
"后侧面及背影": "後側面及背影",
"照片模糊": "照片模糊",
"照片留白过少": "照片留白過少",
"注:需要先输入手机号才可体验徽章设计": "註:需要先輸入手機號才可體驗徽章設計",
"请先上传照片": "請先上傳照片",
"剩余次数不足": "剩餘次數不足",
"请输入正确的手机号": "請輸入正確的手機號",
"请上传尺寸大于300*300像素的照片": "請上傳尺寸大於300*300像素的照片",
"照片大小不能超过10M": "照片大小不能超過10M",
"人脸检测成功": "人臉檢測成功",
"人脸检测失败": "人臉檢測失敗",
"上传失败": "上傳失敗",
"上传中...": "上傳中...",
"照片上传成功": "照片上傳成功",
"人物3D冰箱贴暂未开放": "人物3D冰箱貼暫未開放",
"该订单属于宠物卡通手办": "該訂單屬於寵物卡通手辦",
"该订单属于人物卡通手办": "該訂單屬於人物卡通手辦",
"图片读取失败": "圖片讀取失敗",
"图片加载失败": "圖片加載失敗",
"张": "張",
"笔": "筆",
"我的订单": "我的訂單",
"效果预览": "效果預覽",
"正面照片": "正面照片",
"清晰的正面照片": "清晰的正面照片",
"选择一个你喜欢的效果图下单": "選擇一個你喜歡的效果圖下單",
"总计大约需要90秒,请耐心等待...": "總計大約需要90秒,請耐心等待...",
"设计中": "設計中",
"设计失败": "設計失敗",
"人物浮雕相框": "人物浮雕相框",
"宠物浮雕相框": "寵物浮雕相框",
"人物3D冰箱贴": "人物3D冰箱貼",
"宠物3D冰箱贴": "寵物3D冰箱貼",
"人物卡通手办": "人物卡通手辦",
"宠物卡通手办": "寵物卡通手辦",
"3D全彩打印": "3D全彩打印",
"工艺": "工藝",
"请输入文字": "請輸入文字",
"订购数量": "訂購數量",
"地址识别": "地址識別",
"请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)": "請輸入姓名、手機號、詳細地址(如:張三 13800138000 廣東省深圳市南山區科技園1號)",
"自动识别": "自動識別",
"识别结果": "識別結果",
"收货地址": "收貨地址",
"请选择": "請選擇",
"再次生成": "再次生成",
"前后对比": "前後對比",
"保存图片": "保存圖片",
"确认选择": "確認選擇",
"原图": "原圖",
"效果图": "效果圖",
"温馨提示:AI设计的徽章效果图是根据用户提供的照片机器学习生成的,多试几次就能找到你满意的徽章~": "溫馨提示:AI設計的徽章效果圖是根據用戶提供的照片機器學習生成的,多試幾次就能找到你滿意的徽章~",
"长按图片 → 保存到相册": "長按圖片 → 保存到相冊",
"徽章预览": "徽章預覽",
"当前次数已用完,请重新购买": "當前次數已用完,請重新購買",
"请确认是否重新生成。": "請確認是否重新生成。",
"请先选择下单数量": "請先選擇下單數量",
"请先填写收货人信息": "請先填寫收貨人信息",
"请先填写收货人手机号": "請先填寫收貨人手機號",
"请先选择地区": "請先選擇地區",
"请先填写详细地址": "請先填寫詳細地址",
"请再次确认是否选择这个模型下单,下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "請再次確認是否選擇這個模型下單,下單後預計需要10天完成生產發貨。如對產品有疑問,可以聯繫客服諮詢。",
"下单成功": "下單成功",
"照片数据分析中": "照片數據分析中",
"提炼图像关键词": "提煉圖像關鍵詞",
"图像生成中": "圖像生成中",
"图像后处理与优化": "圖像後處理與優化",
"订单详情": "訂單詳情",
"订单ID":"訂單ID",
"拍摄时间":"拍攝時間",
"复制":"複製",
"重打":"重打",
"加打":"加打",
"我的订单":"我的訂單",
"订单":"訂單",
"首页":"首頁",
"订单记录": "訂單記錄",
"联系门店": "聯繫門店",
"拍摄门店": "拍攝門店",
"费用合计": "費用合計",
"复制成功": "複製成功",
"复制失败": "複製失敗",
"保存成功": "保存成功",
"暂无快递信息": "暫無快遞信息",
"退出登录中...": "退出登錄中...",
"渲染中...": "渲染中...",
"数据加载中...": "數據加載中...",
"故障模型,请联系门店处理": "故障模型,請聯繫門店處理",
"3D相册体验已结束": "3D相冊體驗已結束",
"您购买的3D相册正在精修中,请稍候!": "您購買的3D相冊正在精修中,請稍後",
"您未购买3D相册": "您未購買3D相冊",
"体验还剩": "體驗還剩",
"模型问题反馈": "模型問題反饋",
"我要认领": "我要認領",
"纯色背景": "純色背景",
"已选择": "已選擇",
"主题背景": "主題背景",
"复位": "復位",
"保存": "保存",
"旋转": "旋转",
"停止": "停止",
"换背景": "换背景",
"收起": "收起",
"展开": "展開",
"体验AR": "體驗AR",
"我的":"我的",
"关于我们":"關於我們",
"语言":"語言",
"头像":"頭像",
"账号":"賬號",
"性别":"性別",
"退出登录":"退出登錄",
"确认退出登录?":"確認退出登錄?",
"确认退出":"確認退出",
"我再想想":"我再想想",
"个人中心":"個人中心",
"请登录":"請登錄",
"删除订单":"刪除訂單",
"取消":"取消",
"退出AR":"退出AR",
"称毛重管理":"稱毛重管理",
"称毛重":"稱毛重",
"简体中文":"簡體中文",
"英文":"英語",
"繁体中文":"繁體中文",
"韩文":"韓語",
"下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。": "下單後預計需要10天完成生產發貨。如對產品有疑問,可以聯繫客服諮詢。",
"收货信息": "收貨信息",
"收货人信息": "收貨人信息",
"产品信息": "產品信息",
"产品名称": "產品名稱",
"人物冰箱贴": "人物冰箱貼",
"宠物冰箱贴": "寵物冰箱貼",
"尺寸": "尺寸",
"形状": "形狀",
"购买数量": "購買數量",
"订单信息": "訂單信息",
"购买订单id": "購買訂單id",
"购买时间": "購買時間",
"待支付": "待支付",
"已取消": "已取消",
"生产中": "生產中",
"待收货": "待收貨",
"已完成": "已完成",
"设计记录": "設計記錄",
"注:可点击效果图进行下单打印": "註:可點擊效果圖進行下單打印",
"没有更多了": "沒有更多了",
"加载中...": "加載中...",
"暂无数据": "暫無數據",
"获取数据失败": "獲取數據失敗",
"圆形": "圓形",
"方形": "方形",
"圆角方形": "圓角方形",
"圆角长方体": "圓角長方體",
"心形": "心形",
"方形波浪款": "方形波浪款",
"椭圆形波浪款": "橢圓形波浪款",
"写实手办": "寫實手辦",
"Q版卡通": "Q版卡通",
"无道具(≤6cm-ds)": "無道具(≤6cm-ds)",
"有道具(>6cm-ds)": "有道具(>6cm-ds)",
"无道具( ≤ 6cm)": "無道具( ≤ 6cm)",
"有道具(>6cm)": "有道具(>6cm)",
"Q版卡通-宠物": "Q版卡通-寵物",
"宠物写实肖像": "寵物寫實肖像",
"写实肖像": "寫實肖像",
"日漫3D": "日漫3D",
"迪斯尼皮克斯": "迪士尼皮克斯",
"潮玩IP": "潮玩IP",
}
export default zhCT

57
src/lang/i18n.ts

@ -7,6 +7,49 @@ import messages from './data/index' @@ -7,6 +7,49 @@ import messages from './data/index'
import LanguageDetector from "i18next-browser-languagedetector";
// 支持的语言列表
const supportedLanguages = ["zh-CN", "zh-TW", "zh-HK", "en", "ko"];
// 语言映射函数:将浏览器语言代码映射到支持的语言代码
function mapLanguageCode(lang: string): string {
if (!lang) return "zh-CN";
// 转换为小写并处理
const normalizedLang = lang.toLowerCase().trim();
// 精确匹配(不区分大小写)
const matchedLang = supportedLanguages.find(
supportedLang => supportedLang.toLowerCase() === normalizedLang
);
if (matchedLang) {
return matchedLang;
}
// 处理语言代码变体
if (normalizedLang.startsWith("zh")) {
// 中文变体映射
if (normalizedLang.includes("tw") || normalizedLang.includes("hk") || normalizedLang.includes("mo")) {
return "zh-TW";
}
if (normalizedLang.includes("cn") || normalizedLang === "zh") {
return "zh-CN";
}
// 默认简体中文
return "zh-CN";
}
if (normalizedLang.startsWith("en") || normalizedLang.startsWith("en-US")) {
return "en";
}
if (normalizedLang.startsWith("ko") || normalizedLang.startsWith("ko-KR")) {
return "ko";
}
// 默认返回简体中文
return "zh-CN";
}
export const createI18n = () => {
i18n.use(LanguageDetector).init({
resources: {
@ -18,13 +61,21 @@ export const createI18n = () => { @@ -18,13 +61,21 @@ export const createI18n = () => {
// es: { translation: messages["es"] }
},
fallbackLng: "zh-CN",
debug: true,
supportedLngs: supportedLanguages,
debug: false, // 生产环境建议设为 false
react: {
useSuspense: false
},
detection: {
order: ["querystring", "localStorage", "navigator"],
lookupQuerystring: "lang"
// 检测顺序:URL参数 > localStorage > 浏览器语言 > HTML lang属性
order: ["querystring", "localStorage", "navigator", "htmlTag"],
lookupQuerystring: "lang",
lookupLocalStorage: "i18nextLng",
caches: ["localStorage"],
// 转换检测到的语言代码
convertDetectedLanguage: (lng: string) => {
return mapLanguageCode(lng);
}
}
});

1
src/lang/utils.ts

@ -14,7 +14,6 @@ export function t(key: string, defaultValue: string) { @@ -14,7 +14,6 @@ export function t(key: string, defaultValue: string) {
}
const mappingConfig: any = {
valid: false
};

151
src/views/badge/index.vue

@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
<div class="order-type">
<div class="order-type-item">
<div class="order-type-item-title" v-if="orderStat.order_no">
订单编号
{{ toValueWithout("订单编号") }}
</div>
<div class="order-type-item-title">
{{ orderStat.order_no }}
@ -13,24 +13,24 @@ @@ -13,24 +13,24 @@
</div>
<div class="order-type-item" v-if="prodId">
<div class="order-type-item-title">
产品类型
{{ toValueWithout("产品类型") }}
</div>
<div class="order-type-item-title" v-if="typeId == 1">
立体徽章
{{ toValueWithout("立体徽章") }}
</div>
<div class="order-type-item-title" v-if="typeId == 2">
浮雕相框
{{ toValueWithout("浮雕相框") }}
</div>
<div class="order-type-item-title" v-if="typeId == 3">
3D冰箱贴
{{ toValueWithout("3D冰箱贴") }}
</div>
<div class="order-type-item-title" v-if="typeId == 4">
3D卡通手办
{{ toValueWithout("3D卡通手办") }}
</div>
</div>
</div>
<div class="size-title">
剩余兑换数量
{{ toValueWithout("剩余兑换数量") }}
</div>
<div class="size-options">
<div class="size-item" v-for="item in sizeList" :key="item.id">
@ -38,7 +38,7 @@ @@ -38,7 +38,7 @@
{{ item.size }}
</div>
<div class="size-count">
剩余兑换{{ item.remaining }}
{{ toValueWithout("剩余兑换") }}{{ item.remaining }}
</div>
</div>
</div>
@ -46,41 +46,41 @@ @@ -46,41 +46,41 @@
<div class="badge-info" v-if="trialCode == false">
<div class="badge-item" @click="goToRecord">
<div class="badge-title">
设计图集
{{ toValueWithout("设计图集") }}
</div>
<div class="badge-count">
{{ orderStat.create_count || 0 }}
{{ orderStat.create_count || 0 }}{{ toValueWithout("") }}
</div>
</div>
<div class="badge-item" @click="goToMyOrder">
<div class="badge-title">
我的订单
{{ toValueWithout("我的订单") }}
</div>
<div class="badge-count">
{{ orderStat.order_count || 0 }}
{{ orderStat.order_count || 0 }}{{ toValueWithout("") }}
</div>
</div>
</div>
<div class="badge-phone" v-if="trialCode == true">
<van-field
label="手机号码"
:label="toValueWithout('手机号码')"
type="number"
v-model="mobile"
placeholder="请输入手机号"
:placeholder="toValueWithout('请输入手机号')"
required
maxlength="11"
:rules="[{ required: true, message: '请输入手机号' }]"
:rules="[{ required: true, message: toValueWithout('请输入手机号') }]"
@blur="onBlur"
@confirm="onBlur"
/>
<p style="font-size: 12px; color: #000; margin-left: 16px;">需要先输入手机号才可体验徽章设计</p>
<p style="font-size: 12px; color: #000; margin-left: 16px;">{{ toValueWithout("注:需要先输入手机号才可体验徽章设计") }}</p>
<div class="style-box">
<div class="style-box-item">
<div class="style-item-title" :class="{ styleActive: prodId == 7 || prodId == 1 }" @click="styleChange(7)">
{{ prop == '3D真人肖像' ? '3D真人肖像' : '人物立体徽章' }}
{{ prop == '3D真人肖像' ? toValueWithout('3D真人肖像') : toValueWithout('人物立体徽章') }}
</div>
<div class="style-item-title" :class="{ styleActive: prodId == 8 || prodId == 2 }" @click="styleChange(8)">
宠物立体徽章
{{ toValueWithout("宠物立体徽章") }}
</div>
</div>
</div>
@ -93,10 +93,10 @@ @@ -93,10 +93,10 @@
</div>
<div class="step-content">
<div class="step-title">
上传正面照片
{{ toValueWithout("上传正面照片") }}
</div>
<div class="step-desc">
1张五官清晰的正面照片
{{ toValueWithout("1张五官清晰的正面照片") }}
</div>
</div>
</div>
@ -106,10 +106,10 @@ @@ -106,10 +106,10 @@
</div>
<div class="step-content">
<div class="step-title">
确认下单
{{ toValueWithout("确认下单") }}
</div>
<div class="step-desc">
选择一个你喜欢的设计
{{ toValueWithout("选择一个你喜欢的设计") }}
</div>
</div>
</div>
@ -117,20 +117,20 @@ @@ -117,20 +117,20 @@
<div class="tag-change-box" v-if="trialCode == false">
<div class="tag-change-item">
<div class="tag-change-item-title" :class="{ tagActive: prodId == 7 || prodId == 1 }" @click="prodChange(7)">
人物主体
{{ toValueWithout("人物主体") }}
</div>
<div class="tag-change-item-title" :class="{ tagActive: prodId == 8 || prodId == 19 }" @click="prodChange(8)">
宠物主体
{{ toValueWithout("宠物主体") }}
</div>
</div>
<div style="font-size: 12px; color: #888; text-align: center;">不同主体的照片检测标准不同</div>
<div style="font-size: 12px; color: #888; text-align: center;">{{ toValueWithout("不同主体的照片检测标准不同") }}</div>
</div>
<div class="step-line" v-if="prop == '3D真人肖像'">
<div class="step-line-item">
<div class="step-line-item-title">
<span style="display: flex; align-items: center;justify-content: center;">
<span style="height: 1px; background: #ccc;width: 50px;"></span>
<span style="margin: 0 8px; color: #888;">照片示例</span>
<span style="margin: 0 8px; color: #888;">{{ toValueWithout("照片示例") }}</span>
<span style="height: 1px; background: #ccc;width: 50px;"></span>
</span>
</div>
@ -154,21 +154,21 @@ @@ -154,21 +154,21 @@
<div v-if="!picture" class="photo-upload-box">
<div class="photo-upload-header" @click="imgShow = true">
<van-icon name="question-o" size="16px" class="photo-upload-guide-icon" />
<span class="photo-upload-guide-text">图片上传指南</span>
<span class="photo-upload-guide-text">{{ toValueWithout("图片上传指南") }}</span>
</div>
<div class="photo-upload-area">
<div class="photo-upload-plus">
+
</div>
<div class="photo-upload-text">
点击上传照片
{{ toValueWithout("点击上传照片") }}
</div>
<div class="photo-upload-tip">
*上传照片时建议勾选[原图]
*{{ toValueWithout("上传照片时建议勾选[原图]") }}
</div>
</div>
<div class="photo-upload-footer">
请确定您对上传的照片拥有合法使用权利或已取得他人合法授权且同意本平台分析图片信息以提供生成服务
{{ toValueWithout("请确定您对上传的照片拥有合法使用权利或已取得他人合法授权,且同意本平台分析图片信息以提供生成服务") }}
</div>
</div>
<img class="photo-upload-img" v-if="picture" :src="picture" alt="" srcset="">
@ -177,41 +177,41 @@ @@ -177,41 +177,41 @@
</div>
</div>
<div v-if="typeId == 4 && kindList.length > 0">
<div style="font-size: 16px; color: #222; font-weight: bold; margin-top: 16px;padding: 0 16px;">风格类型</div>
<div style="font-size: 16px; color: #222; font-weight: bold; margin-top: 16px;padding: 0 16px;">{{ toValueWithout("风格类型") }}</div>
<div class="kind-box">
<div class="kind-box-item" v-for="item in kindList" :key="item.id" :class="{ styleActive: kindId == item.id }">
<div class="kind-item-title" @click="kindChange(item.id)">
{{ item.name }}
{{ toValueWithout(item.name) }}
</div>
</div>
</div>
</div>
<div v-if="typeId == 4 && prodId == 19">
<div style="font-size: 16px; color: #222; font-weight: bold; margin-top: 16px;padding: 0 16px;">多视角参考图</div>
<div style="font-size: 12px; color: #aaa; margin-top: 8px;padding: 0 16px;">AI建模具有随机性上传参考图有助于更好的还原主体特征</div>
<div style="font-size: 16px; color: #222; font-weight: bold; margin-top: 16px;padding: 0 16px;">{{ toValueWithout("多视角参考图") }}</div>
<div style="font-size: 12px; color: #aaa; margin-top: 8px;padding: 0 16px;">{{ toValueWithout("AI建模具有随机性,上传参考图有助于更好的还原主体特征") }}</div>
<div class="photo-upload-box-refer">
<van-uploader v-model="referPicture" multiple :max-count="3" :max-size="10 * 1024 * 1024" @oversize="onOversize" :deletable="true" :show-preview="true" :before-read="beforeRead" upload-icon="plus" />
</div>
</div>
<div v-if="typeId != 4">
<div style="font-size: 12px; color: red; margin-top: 16px; text-align: center;" v-if="prodId == 7 || prodId == 1">温馨提示请上传只有{{ prop == '3D真人肖像' ? '1' : '1-3' }}人的照片</div>
<div style="font-size: 12px; color: red; margin-top: 16px; text-align: center;" v-if="prodId == 8 || prodId == 2">温馨提示请上传只有1-3只宠物的照片</div>
<div style="font-size: 12px; color: red; margin-top: 16px; text-align: center;" v-if="prodId == 7 || prodId == 1">{{ toValueWithout("温馨提示请上传只有") }}{{ prop == '3D真人肖像' ? '1' : '1-3' }}{{ toValueWithout("人的照片") }}</div>
<div style="font-size: 12px; color: red; margin-top: 16px; text-align: center;" v-if="prodId == 8 || prodId == 2">{{ toValueWithout("温馨提示请上传只有") }}1-3{{ toValueWithout("只宠物的照片") }}</div>
</div>
<div style="height: 120px;"></div>
<div class="design-action-bar">
<div class="design-left">
<img class="design-leaf-icon" width="18" height="18" src="@/assets/badge/leaf.png" alt="">
<span v-if="trialCode == false" class="design-remaining">剩余{{ orderStat.remain_count || 0 }}</span>
<span v-if="trialCode == true" class="design-remaining">体验1次</span>
<span v-if="trialCode == false" class="design-remaining">{{ toValueWithout("剩余") }}{{ orderStat.remain_count || 0 }}{{ toValueWithout("") }}</span>
<span v-if="trialCode == true" class="design-remaining">{{ toValueWithout("体验1次") }}</span>
</div>
<button class="design-btn" @click="goToPreview">
<span>开始设计</span>
<span>{{ toValueWithout("开始设计") }}</span>
<img class="design-arrow" src="@/assets/badge/arrow.png" alt="">
</button>
</div>
</div>
<van-action-sheet v-model:show="imgShow" title="图片上传指南" :close-on-click-overlay="true" closeable>
<van-action-sheet v-model:show="imgShow" :title="toValueWithout('图片上传指南')" :close-on-click-overlay="true" closeable>
<div style="padding: 0 16px 24px 16px;">
<div style="text-align: center;">
<img :src="sundryList[0].path" alt="照片上传指南" style="width: 90vw; border-radius: 16px; margin-bottom: 16px;">
@ -220,19 +220,19 @@ @@ -220,19 +220,19 @@
<div style="flex: 1; text-align: center;">
<img :src="sundryList[1].path" alt="多主体" style="width: 25vw; height: 25vw; border-radius: 8px; object-fit: cover;">
<div style="font-size: 13px; color: #888; margin-top: 4px;">
多主体
{{ toValueWithout("多主体") }}
</div>
</div>
<div style="flex: 1; text-align: center;">
<img :src="sundryList[2].path" alt="光线昏暗" style="width: 25vw; height: 25vw; border-radius: 8px; object-fit: cover;">
<div style="font-size: 13px; color: #888; margin-top: 4px;">
光线昏暗
{{ toValueWithout("光线昏暗") }}
</div>
</div>
<div style="flex: 1; text-align: center;">
<img :src="sundryList[3].path" alt="后侧面及背影" style="width: 25vw; height: 25vw; border-radius: 8px; object-fit: cover;">
<div style="font-size: 13px; color: #888; margin-top: 4px;">
后侧面及背影
{{ toValueWithout("后侧面及背影") }}
</div>
</div>
</div>
@ -240,19 +240,19 @@ @@ -240,19 +240,19 @@
<div style="flex: 1; text-align: center;">
<img :src="sundryList[4].path" alt="照片模糊" style="width: 25vw; height: 25vw; border-radius: 8px; object-fit: cover;">
<div style="font-size: 13px; color: #888; margin-top: 4px;">
照片模糊
{{ toValueWithout("照片模糊") }}
</div>
</div>
<div style="flex: 1; text-align: center;">
<img :src="sundryList[5].path" alt="照片留白过少" style="width: 25vw; height: 25vw; border-radius: 8px; object-fit: cover;">
<div style="font-size: 13px; color: #888; margin-top: 4px;">
照片留白过少
{{ toValueWithout("照片留白过少") }}
</div>
</div>
</div>
<div style="margin-top: 24px; text-align: center;">
<button style="width: 90%; height: 44px; background: linear-gradient(90deg, #d6f5b7 0%, #50cf54 100%); border: none; border-radius: 22px; color: #222; font-size: 18px; font-weight: bold; cursor: pointer;" @click="imgShow = false">
我已了解
{{ toValueWithout("我已了解") }}
</button>
</div>
</div>
@ -265,10 +265,17 @@ import "vue-cropper-h5/dist/style.css" @@ -265,10 +265,17 @@ import "vue-cropper-h5/dist/style.css"
import { showLoadingToast, showToast, closeToast, showFailToast, showSuccessToast } from 'vant';
import type { UploaderFileListItem } from 'vant'
import * as badgeApi from '@/api/badge'
import { useTranslation } from "i18next-vue";
import * as i18n from '@/lang/utils'
import { toValueWithout } from '@/lang/utils'
import { localStorage } from '@/utils/local-storage'
import CryptoJS from 'crypto-js'
//
const { t } = useTranslation();
i18n.set(t);
const show = ref(false)
const imgShow = ref(false)
@ -376,16 +383,16 @@ const getKindList = () => { @@ -376,16 +383,16 @@ const getKindList = () => {
const prodChange = (id: number) => {
console.log('prodChange', id)
if (typeId.value == 3 && id == 7) {
showToast('人物3D冰箱贴暂未开放')
showToast(toValueWithout('人物3D冰箱贴暂未开放'))
return
}
if (typeId.value == 4) {
if(prodId.value == 19) {
showToast('该订单属于宠物卡通手办')
showToast(toValueWithout('该订单属于宠物卡通手办'))
return
}
if(prodId.value == 1) {
showToast('该订单属于人物卡通手办')
showToast(toValueWithout('该订单属于人物卡通手办'))
return
}
}
@ -409,11 +416,11 @@ function goToPreview() { @@ -409,11 +416,11 @@ function goToPreview() {
}
console.log('goToPreview')
if (!imgurl.value) {
showToast('请先上传照片')
showToast(toValueWithout('请先上传照片'))
return
}
if (orderStat.value.remain_count <= 0) {
showToast('剩余次数不足')
showToast(toValueWithout('剩余次数不足'))
return
}
isLoading.value = true
@ -427,12 +434,12 @@ function goToPreview() { @@ -427,12 +434,12 @@ function goToPreview() {
//
const trialPhone = async () => {
if (!mobile.value) {
showToast('请输入手机号');
showToast(toValueWithout('请输入手机号'));
return;
}
const mobileReg = /^1[3-9]\d{9}$/;
if (!mobileReg.test(mobile.value)) {
showToast('请输入正确的手机号');
showToast(toValueWithout('请输入正确的手机号'));
return;
}
await badgeApi.trialPhone({
@ -469,14 +476,14 @@ function getbase64Data(data) { @@ -469,14 +476,14 @@ function getbase64Data(data) {
imageWidth.value = img.naturalWidth;
imageHeight.value = img.naturalHeight;
if (imageWidth.value < 300 || imageHeight.value < 300) {
showToast('请上传尺寸大于300*300像素的照片')
showToast(toValueWithout('请上传尺寸大于300*300像素的照片'))
imgurl.value = null
picture.value = null
return false;
}
const blob = base64ToBlob(data);
if (blob.size > 1024 * 1024 * 10) {
showToast('照片大小不能超过10M')
showToast(toValueWithout('照片大小不能超过10M'))
imgurl.value = null
picture.value = null
return false;
@ -510,7 +517,7 @@ function imgorigoinf(data) { @@ -510,7 +517,7 @@ function imgorigoinf(data) {
imageWidth.value = img.naturalWidth;
imageHeight.value = img.naturalHeight;
if (imageWidth.value < 300 || imageHeight.value < 300) {
showToast('请上传尺寸大于300*300像素的照片')
showToast(toValueWithout('请上传尺寸大于300*300像素的照片'))
setTimeout(() => {
const btn = document.querySelector('.btn')
if (btn) {
@ -555,13 +562,13 @@ const sendFaceToOss = async (src: string, url: string, path: string) => { @@ -555,13 +562,13 @@ const sendFaceToOss = async (src: string, url: string, path: string) => {
}).then((res: any) => {
console.log('faceCheck', res)
showSuccessToast({
message: '人脸检测成功',
message: toValueWithout('人脸检测成功'),
duration: 2000,
})
}).catch((err) => {
console.log('faceCheck', err)
showFailToast({
message: err.message || '人脸检测失败',
message: err.message || toValueWithout('人脸检测失败'),
icon: 'none',
duration: 2000,
})
@ -576,7 +583,7 @@ const sendFaceToOss = async (src: string, url: string, path: string) => { @@ -576,7 +583,7 @@ const sendFaceToOss = async (src: string, url: string, path: string) => {
} catch (err) {
closeToast()
showFailToast({
message: err.message || '上传失败',
message: err.message || toValueWithout('上传失败'),
icon: 'none',
duration: 2000,
})
@ -585,7 +592,7 @@ const sendFaceToOss = async (src: string, url: string, path: string) => { @@ -585,7 +592,7 @@ const sendFaceToOss = async (src: string, url: string, path: string) => {
const onOversize = (file: any) => {
if (file.size > 10 * 1024 * 1024) {
showToast('照片大小不能超过10M')
showToast(toValueWithout('照片大小不能超过10M'))
return false
}
return true
@ -600,7 +607,7 @@ const beforeRead = (file: any) => { @@ -600,7 +607,7 @@ const beforeRead = (file: any) => {
return new Promise((resolve, reject) => {
const raw: File = input.file || input
if (raw.size > MAX_SIZE) {
showToast('照片大小不能超过10M')
showToast(toValueWithout('照片大小不能超过10M'))
reject(false)
return
}
@ -614,7 +621,7 @@ const beforeRead = (file: any) => { @@ -614,7 +621,7 @@ const beforeRead = (file: any) => {
imageHeight.value = height
URL.revokeObjectURL(objectUrl)
if (width < MIN_WIDTH || height < MIN_HEIGHT) {
showToast(`请上传尺寸大于${MIN_WIDTH}×${MIN_HEIGHT}像素的照片`)
showToast(toValueWithout(`请上传尺寸大于${MIN_WIDTH}×${MIN_HEIGHT}像素的照片`))
reject(false)
return
}
@ -627,13 +634,13 @@ const beforeRead = (file: any) => { @@ -627,13 +634,13 @@ const beforeRead = (file: any) => {
resolve(out)
}
reader.onerror = () => {
showToast('图片读取失败')
showToast(toValueWithout('图片读取失败'))
reject(false)
}
reader.readAsDataURL(raw)
}
img.onerror = () => {
showToast('图片加载失败')
showToast(toValueWithout('图片加载失败'))
URL.revokeObjectURL(objectUrl)
reject(false)
}
@ -658,7 +665,7 @@ const beforeRead = (file: any) => { @@ -658,7 +665,7 @@ const beforeRead = (file: any) => {
const pid = ref('')
const getPid = async () => {
showLoadingToast({
message: '上传中...',
message: toValueWithout('上传中...'),
forbidClick: true,
loadingType: 'spinner',
duration: 0,
@ -694,7 +701,7 @@ const getPid = async () => { @@ -694,7 +701,7 @@ const getPid = async () => {
closeToast()
console.error('上传失败:', err)
showFailToast({
message: '上传失败',
message: toValueWithout('上传失败'),
duration: 2000,
})
isLoading.value = false
@ -771,11 +778,11 @@ const createLog = () => { @@ -771,11 +778,11 @@ const createLog = () => {
type_id: typeId.value,
kind_id: kindId.value
}
badgeApi.createLog(params).then((res: any) => {
badgeApi.createLog(params).then((res: any) => {
console.log('createLog', res)
closeToast()
showSuccessToast({
message: '照片上传成功',
message: toValueWithout('照片上传成功'),
duration: 2000,
})
setTimeout(() => {
@ -842,12 +849,12 @@ const userId = ref('') @@ -842,12 +849,12 @@ const userId = ref('')
const onBlur = async () => {
console.log(mobile.value);
if (!mobile.value) {
showToast('请输入手机号');
showToast(toValueWithout('请输入手机号'));
return;
}
const mobileReg = /^1[3-9]\d{9}$/;
if (!mobileReg.test(mobile.value)) {
showToast('请输入正确的手机号');
showToast(toValueWithout('请输入正确的手机号'));
return;
}
}
@ -1070,7 +1077,7 @@ onMounted(() => { @@ -1070,7 +1077,7 @@ onMounted(() => {
.photo-upload-plus {
font-size: 48px;
color: #c2c2c2;
margin-bottom: 8px;
margin-bottom: 0;
}
.photo-upload-text {
font-size: 16px;
@ -1083,7 +1090,7 @@ onMounted(() => { @@ -1083,7 +1090,7 @@ onMounted(() => {
}
.photo-upload-footer {
position: absolute;
bottom: 10px;
bottom: 0px;
left: 0;
width: 100%;
text-align: center;

15
src/views/badge/myOrder.vue

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<template>
<div class="my-order">
<div class="header" @click="goBack">
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> 我的订单</span>
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> {{ toValueWithout("我的订单") }}</span>
</div>
<div class="order-list" v-if="orders.length > 0">
<div class="order-item" @click="OrderDetail(item.id)" v-for="item in orders" :key="item.id">
@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
</div>
</div>
<div v-else class="record-image-item-null">
<img src="@/assets/badge/null-data.png" alt="暂无数据">
<img src="@/assets/badge/null-data.png" :alt="toValueWithout('暂无数据')">
</div>
</div>
</template>
@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
import { useRouter } from 'vue-router'
import * as badgeApi from '@/api/badge'
import { onMounted, ref } from 'vue'
import { toValueWithout } from '@/lang/utils'
const page = ref(1)
const loading = ref(false)
const finished = ref(false)
@ -61,15 +62,15 @@ function OrderDetail(id: number) { @@ -61,15 +62,15 @@ function OrderDetail(id: number) {
}
function getStatus(status: number) {
if(status == 1) {
return '待支付'
return toValueWithout('待支付')
} else if(status == 2) {
return '已取消'
return toValueWithout('已取消')
} else if(status == 100) {
return '生产中'
return toValueWithout('生产中')
} else if(status == 200) {
return '待收货'
return toValueWithout('待收货')
} else if(status == 300) {
return '已完成'
return toValueWithout('已完成')
}
}
</script>

47
src/views/badge/orderDetail.vue

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<template>
<div class="my-order">
<div class="header" @click="goBack">
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> 订单详情</span>
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> {{ toValueWithout("订单详情") }}</span>
</div>
<div class="order-status">
<div class="avatar-wrapper">
@ -14,21 +14,21 @@ @@ -14,21 +14,21 @@
<div class="status-info">
<div class="status-title">{{ getStatus(order.status) }}</div>
<div class="status-desc">
下单后预计需要10天完成生产发货如对产品有疑问可以联系客服咨询
{{ toValueWithout("下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。") }}
</div>
</div>
<div style="padding: 0 16px;">
<van-divider />
</div>
<div class="product-info" v-if="order.use_type == 2">
<div class="product-title">收货信息</div>
<div class="product-title">{{ toValueWithout("收货信息") }}</div>
<div class="product-details">
<div class="product-row">
<span class="product-label">收货人信息</span>
<span class="product-label">{{ toValueWithout("收货人信息") }}</span>
<span class="product-value">{{order.contact_name}} {{order.contact_mobile}}</span>
</div>
<div class="product-row">
<span class="product-label">收货地址</span>
<span class="product-label">{{ toValueWithout("收货地址") }}</span>
<span class="product-value">{{order.province_name}} {{order.city_name}} {{order.county_name}} {{order.address}}</span>
</div>
</div>
@ -37,25 +37,25 @@ @@ -37,25 +37,25 @@
<van-divider />
</div>
<div class="product-info">
<div class="product-title">产品信息</div>
<div class="product-title">{{ toValueWithout("产品信息") }}</div>
<div class="product-details">
<div class="product-row">
<span class="product-label">产品名称</span>
<span class="product-value" v-if="order.type_id == 1">{{ order.prod_id == 7 ? '人物立体徽章' : '宠物立体徽章' }}</span>
<span class="product-value" v-if="order.type_id == 2">{{ order.prod_id == 7 ? '人物浮雕相框' : '宠物浮雕相框' }}</span>
<span class="product-value" v-if="order.type_id == 3">{{ order.prod_id == 7 ? '人物冰箱贴' : '宠物冰箱贴' }}</span>
<span class="product-value" v-if="order.type_id == 4">{{ order.prod_id == 1 ? '人物卡通手办' : '宠物卡通手办' }}</span>
<span class="product-label">{{ toValueWithout("产品名称") }}</span>
<span class="product-value" v-if="order.type_id == 1">{{ order.prod_id == 7 ? toValueWithout('人物立体徽章') : toValueWithout('宠物立体徽章') }}</span>
<span class="product-value" v-if="order.type_id == 2">{{ order.prod_id == 7 ? toValueWithout('人物浮雕相框') : toValueWithout('宠物浮雕相框') }}</span>
<span class="product-value" v-if="order.type_id == 3">{{ order.prod_id == 7 ? toValueWithout('人物冰箱贴') : toValueWithout('宠物冰箱贴') }}</span>
<span class="product-value" v-if="order.type_id == 4">{{ order.prod_id == 1 ? toValueWithout('人物卡通手办') : toValueWithout('宠物卡通手办') }}</span>
</div>
<div class="product-row">
<span class="product-label">尺寸</span>
<span class="product-label">{{ toValueWithout("尺寸") }}</span>
<span class="product-value">{{order.model_size}}</span>
</div>
<div class="product-row" v-if="shape_name">
<span class="product-label">形状</span>
<span class="product-value">{{shape_name}}</span>
<span class="product-label">{{ toValueWithout("形状") }}</span>
<span class="product-value">{{ toValueWithout(shape_name) }}</span>
</div>
<div class="product-row">
<span class="product-label">购买数量</span>
<span class="product-label">{{ toValueWithout("购买数量") }}</span>
<span class="product-value">{{order.count}}</span>
</div>
</div>
@ -78,14 +78,14 @@ @@ -78,14 +78,14 @@
<van-divider />
</div>
<div class="product-info">
<div class="product-title">订单信息</div>
<div class="product-title">{{ toValueWithout("订单信息") }}</div>
<div class="product-details">
<div class="product-row">
<span class="product-label">购买订单id</span>
<span class="product-label">{{ toValueWithout("购买订单id") }}</span>
<span class="product-value">{{order.sw_oid}}</span>
</div>
<div class="product-row">
<span class="product-label">购买时间</span>
<span class="product-label">{{ toValueWithout("购买时间") }}</span>
<span class="product-value">{{order.pay_at}}</span>
</div>
</div>
@ -98,6 +98,7 @@ import { useRouter } from 'vue-router'; @@ -98,6 +98,7 @@ import { useRouter } from 'vue-router';
import * as badgeApi from '@/api/badge';
import { onMounted, ref } from 'vue';
import { useRoute } from 'vue-router';
import { toValueWithout } from '@/lang/utils';
const route = useRoute();
const order = ref({})
const id = ref(0)
@ -147,15 +148,15 @@ function goBack() { @@ -147,15 +148,15 @@ function goBack() {
}
function getStatus(status: number) {
if(status == 1) {
return '待支付'
return toValueWithout('待支付')
} else if(status == 2) {
return '已取消'
return toValueWithout('已取消')
} else if(status == 100) {
return '生产中'
return toValueWithout('生产中')
} else if(status == 200) {
return '待收货'
return toValueWithout('待收货')
} else if(status == 300) {
return '已完成'
return toValueWithout('已完成')
}
}
</script>

110
src/views/badge/preview.vue

@ -3,20 +3,20 @@ @@ -3,20 +3,20 @@
<view class="backstyle_1"></view>
<view class="backstyle_2"></view>
<div class="header" @click="goBack">
<span class="back-icon"><van-icon name="arrow-left" size="16px" /> 效果预览</span>
<span class="back-icon"><van-icon name="arrow-left" size="16px" /> {{ toValueWithout("效果预览") }}</span>
</div>
<div class="step-container">
<div class="step-item">
<div class="step-content">
<div class="step-title">正面照片</div>
<div class="step-desc">清晰的正面照片</div>
<div class="step-title">{{ toValueWithout("正面照片") }}</div>
<div class="step-desc">{{ toValueWithout("清晰的正面照片") }}</div>
</div>
</div>
<div class="step-item active">
<div class="step-num">2</div>
<div class="step-content">
<div class="step-title">确认下单</div>
<div class="step-desc">选择一个你喜欢的效果图下单</div>
<div class="step-title">{{ toValueWithout("确认下单") }}</div>
<div class="step-desc">{{ toValueWithout("选择一个你喜欢的效果图下单") }}</div>
</div>
</div>
</div>
@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
<div class="progress-bar-fg" :style="{ width: progress + '%' }"></div>
</div>
<div class="progress-text">{{progressText}} {{progress}}%</div>
<div class="progress-desc">总计大约需要90秒请耐心等待...</div>
<div class="progress-desc">{{ toValueWithout("总计大约需要90秒,请耐心等待...") }}</div>
</div>
<div v-else class="progress-section-picture" style="width: 320px;height: 320px;">
<div class="progress-section-img" style="width: 320px;height: 320px;">
@ -41,24 +41,24 @@ @@ -41,24 +41,24 @@
<div class="image-list-item" v-for="item in imageList" :key="item.key">
<img v-if="item.status == 1" class="image-list-item-img" :class="{ imgActive: item.key == imgKey }" :src="item.origin_url" alt="" @click="changeImage(item)">
<div v-else-if="item.status == 0" class="image-list-item-loading">
设计中
{{ toValueWithout("设计中") }}
</div>
<div v-else-if="item.status == 2" class="image-list-item-loading">
设计失败
{{ toValueWithout("设计失败") }}
</div>
</div>
</div>
<div class="info-section">
<div class="info-item">
<div class="info-title" v-if="typeId == 1">{{ prodId == 7 ? '人物立体徽章' : '宠物立体徽章' }}</div>
<div class="info-title" v-if="typeId == 2">{{ prodId == 7 ? '人物浮雕相框' : '宠物浮雕相框' }}</div>
<div class="info-title" v-if="typeId == 3">{{ prodId == 7 ? '人物3D冰箱贴' : '宠物3D冰箱贴' }}</div>
<div class="info-title" v-if="typeId == 4">{{ prodId == 1 ? '人物卡通手办' : '宠物卡通手办' }}</div>
<div class="info-content">产品类型</div>
<div class="info-title" v-if="typeId == 1">{{ prodId == 7 ? toValueWithout('人物立体徽章') : toValueWithout('宠物立体徽章') }}</div>
<div class="info-title" v-if="typeId == 2">{{ prodId == 7 ? toValueWithout('人物浮雕相框') : toValueWithout('宠物浮雕相框') }}</div>
<div class="info-title" v-if="typeId == 3">{{ prodId == 7 ? toValueWithout('人物3D冰箱贴') : toValueWithout('宠物3D冰箱贴') }}</div>
<div class="info-title" v-if="typeId == 4">{{ prodId == 1 ? toValueWithout('人物卡通手办') : toValueWithout('宠物卡通手办') }}</div>
<div class="info-content">{{ toValueWithout("产品类型") }}</div>
</div>
<div class="info-item">
<div class="info-title">3D全彩打印</div>
<div class="info-content">工艺</div>
<div class="info-title">{{ toValueWithout("3D全彩打印") }}</div>
<div class="info-content">{{ toValueWithout("工艺") }}</div>
</div>
<div class="info-item">
<div class="info-title">ID</div>
@ -76,12 +76,12 @@ @@ -76,12 +76,12 @@
<img class="shape-item-image" :class="{ 'shape-item-image-round': item.id == 1 || item.id == 2 }" :src="item.cover_path || imageUrl"/>
<van-icon v-if="item.id == shapeId" class="shape-icon" color="#15CF5F" name="checked" size="18px" />
</div>
<div class="shape-item-text">{{item.name}}</div>
<div class="shape-item-text">{{ toValueWithout(item.name) }}</div>
</div>
</block>
</div>
<div class="shape-box-input" v-if="imageUrl && custom_switch == 1">
<input class="shape-box-input-text" type="text" placeholder="请输入文字" v-model="shapeText" @change="changeShapeText" @input="changeShapeText" @onBlur="changeShapeText" />
<input class="shape-box-input-text" type="text" :placeholder="toValueWithout('请输入文字')" v-model="shapeText" @change="changeShapeText" @input="changeShapeText" @onBlur="changeShapeText" />
</div>
</div>
<!-- <div class="info-desc">
@ -92,12 +92,12 @@ @@ -92,12 +92,12 @@
<van-divider />
</div>
<div class="order-section" v-if="trialCode == false && imageUrl">
<div class="order-title">订购数量</div>
<div class="order-title">{{ toValueWithout("订购数量") }}</div>
<block v-for="item in sizeList" :key="item.id">
<block>
<div class="order-item">
<span class="order-size">{{ item.size }}</span>
<span class="order-free">(剩余兑换{{ item.remaining }})</span>
<span class="order-free">({{ toValueWithout("剩余兑换") }}{{ item.remaining }})</span>
<div class="order-ctrl">
<van-stepper v-model="item.count" :min="0" :max="item.remaining" @change="changeValue" />
</div>
@ -106,7 +106,7 @@ @@ -106,7 +106,7 @@
<!-- <block v-if="orderStat.use_type == 2">
<div class="order-item">
<span class="order-size">{{ item.size }}</span>
<span class="order-free">(剩余兑换{{ item.remaining }})</span>
<span class="order-free">({{ toValueWithout("剩余兑换") }}{{ item.remaining }})</span>
<div class="order-ctrl">
<van-stepper v-model="item.count" :min="0" :max="item.remaining" @change="changeValue" />
</div>
@ -115,29 +115,29 @@ @@ -115,29 +115,29 @@
</block>
</div>
<div class="address-box" v-if="orderStat.use_type == 2 && imageUrl && code == 'ACAYOAAC3PFCPO3CD6DVM1'">
<div class="order-title" style="padding: 0 16px;">地址识别</div>
<div class="order-title" style="padding: 0 16px;">{{ toValueWithout("地址识别") }}</div>
<div class="address-item">
<van-field
v-model="addressInput"
label=""
placeholder="请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)"
:placeholder="toValueWithout('请输入姓名、手机号、详细地址(如:张三 13800138000 广东省深圳市南山区科技园1号)')"
clearable
right-icon="search"
>
<template #button>
<van-button size="small" type="primary" @click="handleAddressInput" style="margin-left: 8px;">自动识别</van-button>
<van-button size="small" type="primary" @click="handleAddressInput" style="margin-left: 8px;">{{ toValueWithout("自动识别") }}</van-button>
</template>
</van-field>
</div>
<div class="address-item" style="padding: 0px 16px 16px 16px;" v-if="contact_name && contact_mobile && province_name && city_name && county_name && address">
<div style="font-size: 16px;color: #387aff;text-align: left;margin-bottom: 8px;">识别结果</div>
<div style="font-size: 16px;color: #387aff;text-align: left;margin-bottom: 8px;">{{ toValueWithout("识别结果") }}</div>
<div style="font-size: 14px;text-align: left;">
{{ contact_name }} {{ contact_mobile }} {{ province_name }} {{ city_name }} {{ county_name }} {{ address }}
</div>
</div>
</div>
<div class="address-box" v-if="orderStat.use_type == 2 && imageUrl">
<div class="order-title" style="padding: 0 16px;">收货地址</div>
<div class="order-title" style="padding: 0 16px;">{{ toValueWithout("收货地址") }}</div>
<div class="address-item">
<van-address-edit
:area-list="areaList"
@ -146,7 +146,7 @@ @@ -146,7 +146,7 @@
show-delete
show-search-result
:search-result="searchResult"
:area-columns-placeholder="['请选择', '请选择', '请选择']"
:area-columns-placeholder="[toValueWithout('请选择'), toValueWithout('请选择'), toValueWithout('请选择')]"
@change="nameTelChange"
@change-area="changeArea"
@change-detail="onChangeDetail"
@ -156,41 +156,39 @@ @@ -156,41 +156,39 @@
<div style="height: 130px;"></div>
<div class="confirm-box">
<div class="action-section">
<button v-if="trialCode == false" @click="sureReload" :disabled="flag < 1" class="action-btn"><img class="action-img" src="@/assets/badge/reload.png" alt=""> 再次生成</button>
<button @click="compare" :disabled="flag < 1" class="action-btn"><img class="action-img" src="@/assets/badge/duibi.png" alt=""> 前后对比</button>
<button @click="save" :disabled="flag < 1" class="action-btn"><img class="action-img" src="@/assets/badge/down.png" alt=""> 保存图片</button>
<button v-if="trialCode == false" @click="sureReload" :disabled="flag < 1" class="action-btn"><img class="action-img" src="@/assets/badge/reload.png" alt=""> {{ toValueWithout("再次生成") }}</button>
<button @click="compare" :disabled="flag < 1" class="action-btn"><img class="action-img" src="@/assets/badge/duibi.png" alt=""> {{ toValueWithout("前后对比") }}</button>
<button @click="save" :disabled="flag < 1" class="action-btn"><img class="action-img" src="@/assets/badge/down.png" alt=""> {{ toValueWithout("保存图片") }}</button>
</div>
<div class="btn-box" v-if="trialCode == false">
<button @click="confirm" :disabled="flag < 1" class="confirm-btn">确认选择</button>
<button @click="confirm" :disabled="flag < 1" class="confirm-btn">{{ toValueWithout("确认选择") }}</button>
</div>
</div>
</div>
<van-action-sheet v-model:show="showCompare" title="前后对比" :close-on-click-overlay="true" closeable>
<van-action-sheet v-model:show="showCompare" :title="toValueWithout('前后对比')" :close-on-click-overlay="true" closeable>
<div style="padding: 16px;">
<div style="display: flex; align-items: center; justify-content: center; gap: 20px;">
<div style="text-align: center;">
<img :src="compareList.origin_path" alt="原图" style="max-width: 120px; max-height: 120px; border-radius: 8px;">
<img :src="compareList.origin_path" :alt="toValueWithout('原图')" style="max-width: 120px; max-height: 120px; border-radius: 8px;">
</div>
<div style="font-size: 24px; color: #333;">
<van-icon name="arrow" size="20px" />
</div>
<div style="text-align: center;">
<img :src="imageUrl" alt="效果图" style="width: 120px; height: 120px; border-radius: 8px;">
<img :src="imageUrl" :alt="toValueWithout('效果图')" style="width: 120px; height: 120px; border-radius: 8px;">
</div>
</div>
<div style="text-align: center; margin-top: 16px; color: #999; font-size: 12px;">
温馨提示<br/>
AI设计的徽章效果图是根据用户提供的照片机器学习生成的<br/>
多试几次就能找到你满意的徽章~
{{ toValueWithout("温馨提示:AI设计的徽章效果图是根据用户提供的照片机器学习生成的,多试几次就能找到你满意的徽章~") }}
</div>
</div>
</van-action-sheet>
<div v-if="showPreview">
<div class="preview-mask" @click="showPreview = false">
<img :src="imageWater" alt="徽章预览" />
<p>长按图片 保存到相册</p>
<img :src="imageWater" :alt="toValueWithout('徽章预览')" />
<p>{{ toValueWithout("长按图片 → 保存到相册") }}</p>
</div>
</div>
</template>
@ -201,6 +199,7 @@ import { showSuccessToast, showToast, showNotify, showConfirmDialog, AddressEdit @@ -201,6 +199,7 @@ import { showSuccessToast, showToast, showNotify, showConfirmDialog, AddressEdit
import { localStorage } from '@/utils/local-storage'
import * as badgeApi from '@/api/badge'
import { areaList } from '@/utils/area'
import { toValueWithout } from '@/lang/utils'
const router = useRouter();
const value = ref(0);
const showReload = ref(false)
@ -219,14 +218,14 @@ function compare() { @@ -219,14 +218,14 @@ function compare() {
function sureReload() {
console.log('orderStat', orderStat.value)
if (orderStat.value.remain_count <= 0) {
showToast('当前次数已用完,请重新购买')
showToast(toValueWithout('当前次数已用完,请重新购买'))
return
}
isPreview.value = false
showConfirmDialog({
title: '再次生成',
title: toValueWithout('再次生成'),
message:
'请确认是否重新生成。',
toValueWithout('请确认是否重新生成。'),
})
.then(() => {
group.value = newGroup.value
@ -464,31 +463,31 @@ const confirm = () => { @@ -464,31 +463,31 @@ const confirm = () => {
if (loading.value) return
console.log('confirm')
if (payAmount.value <= 0) {
showToast('请先选择下单数量')
showToast(toValueWithout('请先选择下单数量'))
return
}
if (orderStat.value.use_type == 2 && !contact_name.value) {
showToast('请先填写收货人信息')
showToast(toValueWithout('请先填写收货人信息'))
return
}
if (orderStat.value.use_type == 2 && !contact_mobile.value) {
showToast('请先填写收货人手机号')
showToast(toValueWithout('请先填写收货人手机号'))
return
}
if (orderStat.value.use_type == 2 && !province_id.value) {
showToast('请先选择地区')
showToast(toValueWithout('请先选择地区'))
return
}
if (orderStat.value.use_type == 2 && !address.value) {
showToast('请先填写详细地址')
showToast(toValueWithout('请先填写详细地址'))
return
}
getPosition()
loading.value = true
showConfirmDialog({
title: '确认下单',
title: toValueWithout('确认下单'),
message:
'请再次确认是否选择这个模型下单,下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。',
toValueWithout('请再次确认是否选择这个模型下单,下单后预计需要10天完成生产发货。如对产品有疑问,可以联系客服咨询。'),
})
.then(() => {
const parms = {
@ -517,7 +516,7 @@ const confirm = () => { @@ -517,7 +516,7 @@ const confirm = () => {
badgeApi.creatOrder(parms).then((res: any) => {
console.log('creatOrder', res)
showSuccessToast({
message: '下单成功',
message: toValueWithout('下单成功'),
duration: 2000,
})
router.push({
@ -574,13 +573,13 @@ const progressList = () => { @@ -574,13 +573,13 @@ const progressList = () => {
if (progress.value < 90) {
progress.value += 1
if (progress.value < 25) {
progressText.value = '照片数据分析中'
progressText.value = toValueWithout('照片数据分析中')
} else if (progress.value < 50) {
progressText.value = '提炼图像关键词'
progressText.value = toValueWithout('提炼图像关键词')
} else if (progress.value < 75) {
progressText.value = '图像生成中'
progressText.value = toValueWithout('图像生成中')
} else {
progressText.value = '图像后处理与优化'
progressText.value = toValueWithout('图像后处理与优化')
}
}
}, 300)
@ -1382,7 +1381,7 @@ onUnmounted(() => { @@ -1382,7 +1381,7 @@ onUnmounted(() => {
}
.shape-box {
display: flex;
align-items: center;
align-items: flex-start;
flex-wrap: wrap;
justify-content: flex-start;
}
@ -1412,11 +1411,12 @@ onUnmounted(() => { @@ -1412,11 +1411,12 @@ onUnmounted(() => {
.shape-icon {
position: absolute;
right: 6px;
bottom: 24px;
top: 14vw;
}
.shape-item-text {
font-size: 12px;
text-align: center;
max-width: 20vw;
}
.shape-type {
display: -webkit-box;

17
src/views/badge/record.vue

@ -1,15 +1,15 @@ @@ -1,15 +1,15 @@
<template>
<div>
<div class="header" @click="goBack" style="text-align: center;">
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> 设计记录</span>
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> {{ toValueWithout("设计记录") }}</span>
</div>
<div class="record-container">
<div class="record-note">可点击效果图进行下单打印</div>
<div class="record-note">{{ toValueWithout("注:可点击效果图进行下单打印") }}</div>
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
:finished-text="toValueWithout('没有更多了')"
@load="onLoad"
>
<div class="record-images" v-if="images.length > 0">
@ -20,19 +20,19 @@ @@ -20,19 +20,19 @@
</block>
<div v-else-if="item.status == 0 || item.reason" class="record-image-item-loading">
<div style="font-size: 12px;color: #999;text-align: center;">ID: {{ item.sw_pid }}</div>
<div style="width: 70%;font-size: 12px;">{{ item.reason || '设计中' }}</div>
<div style="width: 70%;font-size: 12px;">{{ item.reason || toValueWithout('设计中') }}</div>
</div>
<div v-else-if="item.status == 2 || item.reason" class="record-image-item-loading">
<div style="font-size: 12px;color: #999;text-align: center;">ID: {{ item.sw_pid }}</div>
<div style="width: 70%;font-size: 12px;">{{ item.reason || '设计失败' }}</div>
<div style="width: 70%;font-size: 12px;">{{ item.reason || toValueWithout('设计失败') }}</div>
</div>
</div>
</div>
<div v-else-if="loading && page.value === 1" class="record-image-item-loading">
加载中...
{{ toValueWithout("加载中...") }}
</div>
<div v-else class="record-image-item-null">
<img src="@/assets/badge/null-data.png" alt="暂无数据">
<img src="@/assets/badge/null-data.png" :alt="toValueWithout('暂无数据')">
</div>
</van-list>
</van-pull-refresh>
@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
import { useRouter } from 'vue-router';
import * as badgeApi from '@/api/badge';
import { onMounted, ref, onUnmounted } from 'vue';
import { toValueWithout } from '@/lang/utils';
const router = useRouter();
const images = ref([]);
const page = ref(1);
@ -81,7 +82,7 @@ async function getList() { @@ -81,7 +82,7 @@ async function getList() {
page.value++;
}
} catch (err: any) {
error.value = err.message || '获取数据失败';
error.value = err.message || toValueWithout('获取数据失败');
console.error('获取设计记录失败', err);
} finally {
loading.value = false;

Loading…
Cancel
Save