SyuanYu 7 달 전
부모
커밋
5f2abef287
8개의 변경된 파일209개의 추가작업 그리고 101개의 파일을 삭제
  1. BIN
      src/assets/img/banner-3.jpg
  2. BIN
      src/assets/img/banner.jpg
  3. BIN
      src/assets/img/icon/素材-17.png
  4. 119 23
      src/components/Chat.vue
  5. 4 1
      src/language/en.json
  6. 4 1
      src/language/ja.json
  7. 78 75
      src/language/ko.json
  8. 4 1
      src/language/zh.json

BIN
src/assets/img/banner-3.jpg


BIN
src/assets/img/banner.jpg


BIN
src/assets/img/icon/素材-17.png


+ 119 - 23
src/components/Chat.vue

@@ -137,7 +137,14 @@ let messages = ref([]);
 
 watch(messages.value, (val) => {
   console.log("messages", val);
-  scrollToBottom();
+  // scrollToBottom();
+  // 判斷最後一個值是否為文字訊息
+  if (
+    messages.value.length > 0 &&
+    messages.value[messages.value.length - 1].label !== "brand"
+  ) {
+    scrollToBottom();
+  }
   updateMenuHeight();
 });
 
@@ -328,6 +335,9 @@ function getLang() {
     case "ja-jp":
       langVal = "jp";
       break;
+    case "ko-kr":
+      langVal = "ko";
+      break;
 
     default:
       break;
@@ -358,6 +368,12 @@ async function setAd() {
 let video = ref(null);
 
 function videoPlay() {
+  if (videoSrc.value !== videoMuteSources.value) {
+    video.value.loop = false;
+  } else {
+    video.value.loop = true; // 設置循環播放
+  }
+
   video.value.load();
   video.value.play();
 }
@@ -375,6 +391,7 @@ const onVideoEnded = () => {
 
   // 播放點頭影片
   videoSrc.value = videoMuteSources.value;
+  // video.value.loop = true; // 設置循環播放
   videoPlay();
   isVideoPause.value = true;
 };
@@ -420,6 +437,8 @@ function onLanguageChange(lang) {
     chooseLang("en-us");
   } else if (lang === "日本語") {
     chooseLang("ja-jp");
+  } else if (lang === "한국어") {
+    chooseLang("ko-kr");
   }
 
   // 清空音訊
@@ -1484,22 +1503,20 @@ const loadVideoSources = async () => {
 
   videoSources.value = [
     // "https://cmm.ai/101-ai-chatbot-new/video/start_1.mp4",
-    "https://cmm.ai/101-ai-chatbot-new/video/start_2.mp4",
+    "https://cmm.ai/101-video/start_2.mp4",
   ];
   videoSourcesEn.value = [
     // "https://cmm.ai/101-ai-chatbot-new/video/start_en_1.mp4",
-    "https://cmm.ai/101-ai-chatbot-new/video/start_en_2.mp4",
-  ];
-  videoSourcesJp.value = [
-    "https://cmm.ai:9101/static/video_cache/others/final-tmp_2024-08-27_12:33:13.mp4",
+    "https://cmm.ai/101-video/start_en_2.mp4",
   ];
+  videoSourcesJp.value = ["https://cmm.ai/101-video/start_jp_2.mp4"];
   videoMuteSources.value = [
     // "https://cmm.ai/101-ai-chatbot-new/video/mute_1.mp4",
-    "https://cmm.ai/101-ai-chatbot-new/video/mute_2.mp4",
+    "https://cmm.ai/101-video/mute_2.mp4",
   ];
   videoSpeakSources.value = [
     // "https://cmm.ai/101-ai-chatbot-new/video/speak_1.mp4",
-    "https://cmm.ai/101-ai-chatbot-new/video/speak_2.mp4",
+    "https://cmm.ai/101-video/speak_2.mp4",
   ];
 };
 
@@ -1507,6 +1524,8 @@ let videoSrc = ref("");
 let hideAnchorPrologue = ref(false); // 顯示開場白 or 點頭影片
 let videoIndex = ref(null); // 影片編號
 
+let funFilterDialog = ref(false); // 創意濾鏡視窗
+
 // 選擇類別
 async function selectCategory(value, index) {
   assignCategory.value = value;
@@ -1568,6 +1587,19 @@ async function selectCategory(value, index) {
   // }
   else if (value === "附近有什麼") {
     window.open("https://cmm.ai/101-aiv2/#/brand-search", "_blank"); // 另開頁面
+  } else if (value === "趣味濾鏡") {
+    // messages.value.push({
+    //   label: "text",
+    //   author: "user",
+    //   body: t("fun_filter"),
+    // });
+
+    // messages.value.push({
+    //   label: "text",
+    //   author: "ai",
+    //   body: t("system_under_construction"),
+    // });
+    funFilterDialog.value = true;
   } else if (value === "秘境花園觀景台") {
     messages.value.push({
       label: "text",
@@ -1735,10 +1767,10 @@ let langList = reactive([
     lang: "日本語",
     value: "ja-jp",
   },
-  // {
-  //   lang: "한국어",
-  //   value: "ko-kr",
-  // },
+  {
+    lang: "한국어",
+    value: "ko-kr",
+  },
 ]);
 
 const btnList = reactive([
@@ -1788,7 +1820,8 @@ const menuList = reactive([
   [
     { imgSrc: "素材-09.png", text: "food_souvenirs", value: "美食/伴手禮" },
     { imgSrc: "素材-10.png", text: "location_guide", value: "位置導引" },
-    { imgSrc: "素材-11.png", text: "what_around", value: "附近有什麼" },
+    { imgSrc: "素材-17.png", text: "fun_filter", value: "趣味濾鏡" },
+    // { imgSrc: "素材-11.png", text: "what_around", value: "附近有什麼" },
   ],
 ]);
 
@@ -1815,6 +1848,8 @@ async function findBrand(value) {
 
     assignCategoryIndex.value = null;
     assignCategory.value = "";
+
+    scrollToLastMessage();
   } catch (error) {
     console.log("error", error);
   }
@@ -2100,6 +2135,7 @@ let isAudioPlaying = ref(false); // 音訊播放狀態
 // 取得語音回覆 mp4
 async function cutVideo() {
   videoSrc.value = videoSpeakSources.value[videoIndex.value - 1];
+  video.value.loop = false;
   video.value.load(); // 重新讀取影片
 
   // 影片和音訊加載完成後播放
@@ -2134,6 +2170,7 @@ const onAudioEnded = () => {
 
   // 播放點頭影片
   videoSrc.value = videoMuteSources.value;
+  // video.value.loop = true; // 設置循環播放
   videoPlay();
 };
 
@@ -2419,6 +2456,7 @@ function handleVideoCache() {
 
   // 播放 Cache 影片
   videoSrc.value = `https://cmm.ai:9101${videoCacheData.value.video_url}`;
+  video.value.loop = false;
   video.value.load();
 
   // 清空音訊
@@ -2468,6 +2506,7 @@ function togglePause(val) {
     if (video.value) {
       video.value.play();
     }
+
     if (currentAudio.value) {
       currentAudio.value.play(); // 播放音訊
       currentAudio.value.addEventListener("ended", onAudioEnded);
@@ -2501,6 +2540,38 @@ async function messageNotInCache(question, answer) {
     console.log("error", error);
   }
 }
+
+const scrollToLastMessage = () => {
+  nextTick(() => {
+    console.log(">>>");
+
+    const lastMessage = chatArea.value?.querySelector(
+      ".message-content:last-child"
+    );
+
+    console.log("lastMessage", lastMessage);
+
+    if (lastMessage) {
+      const scrollTop = lastMessage.offsetTop;
+      console.log("捲軸高度:", scrollTop);
+      setTimeout(() => {
+        chatArea.value.scrollTop = lastMessage.offsetTop - 45;
+      }, 500);
+      console.log("chatArea.value.scrollTop", chatArea.value.scrollTop);
+    }
+  });
+};
+
+// 判斷輸入框狀態
+let inputFocus = ref(false);
+
+const handleFocus = () => {
+  inputFocus.value = true;
+};
+
+const handleBlur = () => {
+  inputFocus.value = false;
+};
 </script>
 
 <template>
@@ -2524,7 +2595,7 @@ async function messageNotInCache(question, answer) {
         <v-select
           density="compact"
           :label="`${t('select_language')}`"
-          :items="['中文', 'English', '日本語']"
+          :items="['中文', 'English', '日本語', '한국어']"
           variant="solo"
           @update:modelValue="onLanguageChange"
         ></v-select>
@@ -2784,7 +2855,7 @@ async function messageNotInCache(question, answer) {
           <div v-else-if="message.label === 'location'">
             <!-- 定位點 & 平面圖下拉選單 -->
             <div class="d-flex">
-              <v-menu location="top">
+              <!-- <v-menu location="top">
                 <template v-slot:activator="{ props }">
                   <v-btn class="mt-5 py-2" color="primary" dark v-bind="props">
                     <p class="me-2">
@@ -2819,16 +2890,11 @@ async function messageNotInCache(question, answer) {
                     </v-list-item-title>
                   </v-list-item>
                 </v-list>
-              </v-menu>
+              </v-menu> -->
 
               <v-menu location="top">
                 <template v-slot:activator="{ props }">
-                  <v-btn
-                    class="ms-5 mt-5 py-2"
-                    color="primary"
-                    dark
-                    v-bind="props"
-                  >
+                  <v-btn class="mt-5 py-2" color="primary" dark v-bind="props">
                     <p class="me-2">{{ t("view_floor_plan") }}</p>
                     <svg
                       xmlns="http://www.w3.org/2000/svg"
@@ -3503,6 +3569,9 @@ async function messageNotInCache(question, answer) {
 
       <!-- 底部選單 -->
       <div ref="menu" class="menu">
+        <p v-if="inputFocus" class="Keyboard-tips">
+          {{ t("close_keyboard") }}
+        </p>
         <!-- 對話輸入框 -->
         <form
           @submit.prevent="sendMessage()"
@@ -3518,6 +3587,8 @@ async function messageNotInCache(question, answer) {
             v-model="userMessage"
             type="text"
             :placeholder="t('type_message')"
+            @focus="handleFocus"
+            @blur="handleBlur"
           />
           <button type="submit" class="submit">
             <img width="20" src="../assets/img/paper-plane-solid.svg" alt="" />
@@ -3751,6 +3822,23 @@ async function messageNotInCache(question, answer) {
       </v-card-text>
     </v-card>
   </v-dialog>
+
+  <!-- 創意濾鏡視窗 -->
+  <v-dialog v-model="funFilterDialog" width="300">
+    <v-card class="pa-5">
+      <v-card-title class="pa-0">
+        <button @click="funFilterDialog = false" class="d-flex ml-auto">
+          <v-icon size="small" icon="mdi-close"></v-icon>
+        </button>
+      </v-card-title>
+
+      <v-card-text>
+        <p class="text-h5 text-center mb-5" style="font-weight: 600">
+          {{ t("system_under_construction") }}
+        </p>
+      </v-card-text>
+    </v-card>
+  </v-dialog>
 </template>
 
 <style lang="scss">
@@ -3777,7 +3865,7 @@ async function messageNotInCache(question, answer) {
   display: flex;
   align-items: center;
   justify-content: center;
-  background-color: rgba(0, 0, 0, 0.6);
+  background-color: rgba(0, 0, 0, 0.3);
   background-blend-mode: multiply;
   background-image: url("@/assets/img/banner.jpg");
   background-size: cover;
@@ -4633,4 +4721,12 @@ async function messageNotInCache(question, answer) {
     width: 130px;
   }
 }
+
+.Keyboard-tips {
+  position: absolute;
+  top: -35px;
+  left: 50%;
+  color: #fff;
+  transform: translate(-50%, 0px);
+}
 </style>

+ 4 - 1
src/language/en.json

@@ -9,11 +9,13 @@
   "customer_show": "AI Customer Service",
   "customer_hide": "AI Customer Service",
   "observation_deck": "Observatory",
-  "location_guide": "Location Guide",
+  "location_guide": "Floor Plan",
   "food_souvenirs": "Food & Souvenirs",
   "shopping_discounts": "Shopping and Discounts",
   "service_information": "Service Information",
   "what_around": "What is around?",
+  "system_under_construction": "System Under Construction",
+  "fun_filter": "Fun Filter",
   "type_message": "Type a message",
   "ar_tour": "AR navigation",
   "select_location": "Please select you location for AR navigation",
@@ -36,6 +38,7 @@
   "speech_error": "Speech recognition error. Please re-record.",
   "return_to_ai_support": "Back to AI Support",
   "search_brand": "Search Brand",
+  "close_keyboard": "Tap the screen to close the keyboard",
   "service_info": {
     "title": "Service information",
     "inquiry_prompt": "What are you searching for?<br>Or please enter your question",

+ 4 - 1
src/language/ja.json

@@ -9,11 +9,13 @@
   "customer_show": "AIインテリジェントカスタマーサービス",
   "customer_hide": "AIインテリジェントカスタマーサービス",
   "observation_deck": "秘境の庭園展望台",
-  "location_guide": "位置ガイド",
+  "location_guide": "フロアプラン",
   "food_souvenirs": "グルメ/お土産",
   "shopping_discounts": "ショッピングと特典",
   "service_information": "サービス情報",
   "what_around": "近くのお店は?",
+  "system_under_construction": "システム構築中",
+  "fun_filter": "面白いフィルター",
   "type_message": "メッセージを入力してください",
   "ar_tour": "ARナビを利用",
   "select_location": "あなたの現在地を選んで、ARナビを利用します。",
@@ -36,6 +38,7 @@
   "speech_error": "音声認識に誤りがあります。もう一度録音してください。",
   "return_to_ai_support": "AI サポートに戻る",
   "search_brand": "ブランドを検索",
+  "close_keyboard": "画面をタップしてキーボードを閉じてください",
   "service_info": {
     "title": "サービス情報",
     "inquiry_prompt": "サービス情報を選択<br>下のメッセージボックスにご質問を入力してください。",

+ 78 - 75
src/language/ko.json

@@ -9,11 +9,13 @@
   "customer_show": "실제 고객 상담원",
   "customer_hide": "실제 고객 상담원",
   "observation_deck": "비경 정원 전망대",
-  "location_guide": "위치 안내",
+  "location_guide": "층별 평면도",
   "food_souvenirs": "맛집/기념품",
   "shopping_discounts": "쇼핑 및 혜택",
   "service_information": "서비스 정보",
   "what_around": "주변에 뭐가 있나요?",
+  "system_under_construction": "시스템 구축 중",
+  "fun_filter": "재미있는 필터",
   "type_message": "메시지를 입력하세요",
   "ar_tour": "AR 투어 시작",
   "select_location": "AR 투어를 위해 위치를 선택하세요",
@@ -36,100 +38,101 @@
   "speech_error": "음성 인식 오류가 발생했습니다. 다시 녹음해주세요.",
   "return_to_ai_support": "AI 고객 지원으로 돌아가기",
   "search_brand": "브랜드 검색",
+  "close_keyboard": "화면을 터치하여 키보드를 닫으세요",
   "service_info": {
-    "title": "服務資訊",
-    "inquiry_prompt": "請問您想查詢?",
-    "business_hours": "營業時間",
-    "business_hours_1": "購物中心<br>周日至周四 11:00-21:30<br>周五、周六及國定假日前一天 11:00-22:00<br><br>觀景台<br>周一至周日及國定假日<br>10:00-21:00",
-    "tax_refund": "退稅",
-    "tax_refund_1": "★請持今日於館內累積購買超過新台幣 2,000 元以上可退稅商品之台北101發票及外籍護照(入台證)正本及購買商品至地下一樓退稅中心辦理。",
-    "toilets": "廁所/親子廁所",
-    "toilets_1": "洗手間所在位置於<br>地下一樓:信義環、中環、松智環<br>一樓至三樓:中環<br>四樓:松智環(維修中暫停使用)<br>五樓:松智環(靠近觀景台售票處)<br><br>台北101 購物中心親子廁所,位於地下一樓中環、松智環、信義環之男女廁所內,以及 3 樓中環男女廁旁。3 樓中環之獨立親子廁所,除一般洗手間功能外,另設有尿布檯、兒童安全座椅及兒童專用馬桶,空間寬敞且設施更加完善,方便家長及小朋友使用!",
-    "charge": "充電",
-    "charge_1": "請至B1中環顧客服務中心旁租借行動電源。"
+    "title": "서비스 정보",
+    "inquiry_prompt": "무엇을 조회하시겠습니까?",
+    "business_hours": "영업 시간",
+    "business_hours_1": "쇼핑몰<br>일요일부터 목요일 11:00-21:30<br>금요일, 토요일 및 공휴일 전날 11:00-22:00<br><br>전망대<br>월요일부터 일요일 및 공휴일<br>10:00-21:00",
+    "tax_refund": "세금 환급",
+    "tax_refund_1": "★오늘 본관 내에서 2,000 NTD 이상 구매한 세금 환급 가능한 상품의 타이베이 101 영수증과 외국인 여권(입국증) 원본 및 구매한 상품을 지하 1층의 세금 환급 센터로 가져와 처리하세요.",
+    "toilets": "화장실/유아 화장실",
+    "toilets_1": "화장실 위치는 다음과 같습니다<br>지하 1층: 신이환, 중환, 송지환<br>1층부터 3층: 중환<br>4층: 송지환(수리 중, 사용 중지)<br>5층: 송지환(전망대 매표소 근처)<br><br>타이베이 101 쇼핑몰의 유아 화장실은 지하 1층 중환, 송지환, 신이환의 남녀 화장실 내에 있으며, 3층 중환 남녀 화장실 옆에 독립된 유아 화장실이 있습니다. 이 화장실은 일반 화장실 기능 외에 기저귀 교환대, 아동용 안전 의자, 아동용 전용 변기가 있으며, 공간이 넓고 시설이 잘 갖춰져 있어 부모님과 아이들이 사용하기 편리합니다!",
+    "charge": "충전",
+    "charge_1": "지하 1층 중환 고객 서비스 센터 옆에서 보조 배터리를 대여하세요."
   },
   "food_souvenirs_info": {
-    "searching": "請問您想查詢哪一種美食?",
-    "signature": "特色/高空餐廳",
-    "light": "輕食/CAFÉ",
-    "courts": "美食街",
-    "souvenir": "伴手禮"
+    "searching": "어떤 음식을 조회하시겠습니까?",
+    "signature": "특색/고공 레스토랑",
+    "light": "가벼운 식사/CAFÉ",
+    "courts": "푸드코트",
+    "souvenir": "기념품"
   },
   "observatory_info": {
     "tickets": {
-      "title": "線上購票",
-      "purchase": "請問您需要線上購票嗎?",
-      "id_card": "請問您是否持有中華民國身分證?",
-      "yes": "",
-      "no": "沒有",
-      "ticket_type": "請問您要購買哪種門票?"
+      "title": "온라인 티켓 구매",
+      "purchase": "온라인 티켓을 구매하시겠습니까?",
+      "id_card": "중화민국 신분증을 소지하고 계십니까?",
+      "yes": "",
+      "no": "아니오",
+      "ticket_type": "어떤 종류의 티켓을 구매하시겠습니까?"
     },
     "visitor": {
-      "title": "參觀資訊",
-      "question": "請於下方文字框輸入您的問題:",
-      "faq": "常見問題提示:",
-      "events_q": "特色活動",
-      "events_a": "台北101觀景台是全台灣最高的觀景台,在382公尺的360度全視野高空俯瞰,高度不僅是象山的兩倍多,更是唯一可以眺望基隆河谷景觀的景點。目前台北101在89F觀景台打造夢幻打卡點,無論是「雲端上的秘境花園」、「天使之翼」、「雲中星月」等,無論是大人還是小孩,都能置身在仙境般的場景,令人陶醉其中。",
-      "ball_q": "風阻尼球",
-      "ball_a": "台北101風阻尼球的完整正式名稱:調諧質量阻尼器TMD (Tuned Mass Damper),是針對本大樓需求量身定做的被動阻尼系統,位置設置於87F~92F的樓層中央位置,主要目的為減低大樓受強風吹襲時之擺動,減少在大樓工作之人員感到不舒適之程度。有別於一般傳統隱藏式阻尼系統,台北101-風阻尼球的設計特別兼顧了功能及外觀,在觀景台將可一窺阻尼系統的整體運作。",
-      "accessible_q": "無障礙設施",
-      "accessible_a": "觀景台設有無障礙廁所,上下樓如果不方便用樓梯行動,也可請服務人員協助。"
+      "title": "관람 정보",
+      "question": "아래 텍스트 상자에 질문을 입력하세요:",
+      "faq": "자주 묻는 질문:",
+      "events_q": "특색 행사",
+      "events_a": "타이베이 101 전망대는 대만에서 가장 높은 전망대로, 382m의 360도 전방위 고공에서 기륭강 계곡을 조망할 수 있는 유일한 명소입니다. 현재 타이베이 101 89층 전망대에서 꿈의 인증샷을 찍을 수 있는 명소가 마련되어 있으며, '구름 위의 비밀 정원', '천사의 날개', '구름 속의 별과 달' 등은 어린이부터 어른까지 모두를 동화 같은 풍경에 빠져들게 합니다.",
+      "ball_q": "풍조(風阻) 댐퍼",
+      "ball_a": "타이베이 101 풍조(風阻) 댐퍼의 정식 명칭은 조율질량댐퍼(Tuned Mass Damper)이며, 이 빌딩의 요구에 맞춰 제작된 수동 댐핑 시스템입니다. 위치는 87층에서 92층 중앙에 위치해 있으며, 주요 목적은 강한 바람에 의한 빌딩의 흔들림을 줄여 빌딩에서 일하는 사람들이 불편함을 느끼지 않도록 하는 것입니다. 일반적인 전통적인 숨겨진 댐퍼 시스템과 달리, 타이베이 101 풍조(風阻) 댐퍼는 기능과 외관을 모두 고려하여 디자인되었으며, 전망대에서는 댐퍼 시스템의 전체 작동을 볼 수 있습니다.",
+      "accessible_q": "장애인 시설",
+      "accessible_a": "전망대에는 장애인 화장실이 마련되어 있으며, 계단 이용이 불편할 경우 직원의 도움을 요청할 수 있습니다."
     },
-    "view": "實境景色",
-    "garden": "前往秘境花園觀景台"
+    "view": "실시간 경치",
+    "garden": "비밀 정원 전망대로 이동"
   },
   "shopping_discounts_info": {
     "brands": {
-      "title": "購物品牌查詢",
-      "choose": "請選擇品牌類別",
-      "jewely": "國際珠寶腕錶",
-      "boutique": "國際精品",
-      "skincare": "美妝保養品",
-      "apparel": "流行服飾",
-      "lifestyle": "生活居家/3C",
-      "cultural": "文化創意",
-      "signature": "特色品牌",
-      "outside": "館外店家"
+      "title": "쇼핑 브랜드 조회",
+      "choose": "브랜드 카테고리를 선택하세요",
+      "jewely": "국제 주얼리 시계",
+      "boutique": "국제 부티크",
+      "skincare": "화장품 및 스킨케어",
+      "apparel": "패션 의류",
+      "lifestyle": "생활 가전/3C",
+      "cultural": "문화 창작",
+      "signature": "특색 브랜드",
+      "outside": "관 외 상점"
     },
     "tourist_card": {
-      "title": "國際貴賓卡專屬禮遇",
-      "content": "即日起來台北101,提供2024年特別禮遇-申辦台北101國際貴賓卡,可享用國際旅客限定專屬三重好禮:<br>‧購物-品牌9折起特別優惠<br>‧禮遇-Welcome Pack+ NTD300現金折抵券<br>‧退稅-消費2000元以上可至B1退稅,並提供5%快速辦理服務<br><br>歡迎至購物中心B1客服中心填寫申請書,即可享有專屬優惠<br><br><a href='https://stage.taipei101mall.com.tw/?lang=zh&utm_source=101TTE_PH&utm_medium=Travel_Fair&utm_campaign=Stage' class='ar-link mb-3' target='_blank'>立即線上申辦</a>",
-      "apply": "立即線上申辦"
+      "title": "국제 VIP 카드 전용 혜택",
+      "content": "지금부터 타이베이 101에 오시면 2024년 특별 혜택을 제공해 드립니다-타이베이 101 국제 VIP 카드를 신청하시면, 국제 여행객 전용 3중 혜택을 누리실 수 있습니다:<br>‧쇼핑-브랜드 10% 할인 혜택<br>‧혜택-Welcome Pack+ NTD300 현금 할인 쿠폰<br>‧세금 환급-2,000 NTD 이상 구매 시 B1에서 세금 환급 가능하며, 5% 신속 처리 서비스를 제공합니다.<br><br>쇼핑몰 B1 고객 서비스 센터에서 신청서를 작성하시면 전용 혜택을 누리실 수 있습니다.<br><br><a href='https://stage.taipei101mall.com.tw/?lang=zh&utm_source=101TTE_PH&utm_medium=Travel_Fair&utm_campaign=Stage' class='ar-link mb-3' target='_blank'>지금 온라인 신청</a>",
+      "apply": "지금 온라인 신청"
     }
   },
   "location": {
-    "b1_din_tai_fung": "B1 鼎泰豐",
-    "b1_centre": "B1 中環",
-    "b1_elevator_no_2": "B1 2號電梯",
-    "b1_elevator_no_4": "B1 4號電梯",
-    "b1_elevator_no_3": "B1 3號電梯",
-    "1f_south_xinyi": "1F 信義環",
-    "1f_elevator_no_3": "1F 3號電梯",
-    "2f_elevator_no_3": "2F 3號電梯",
-    "88f_observatory": "88F 觀景台",
-    "89f_observatory": "89F 觀景台"
+    "b1_din_tai_fung": "B1 딘타이펑",
+    "b1_centre": "B1 중환",
+    "b1_elevator_no_2": "B1 2호 엘리베이터",
+    "b1_elevator_no_4": "B1 4호 엘리베이터",
+    "b1_elevator_no_3": "B1 3호 엘리베이터",
+    "1f_south_xinyi": "1F 신이환",
+    "1f_elevator_no_3": "1F 3호 엘리베이터",
+    "2f_elevator_no_3": "2F 3호 엘리베이터",
+    "88f_observatory": "88F 전망대",
+    "89f_observatory": "89F 전망대"
   },
   "navigation": {
-    "observatory_ticket_office": "觀景台售票處",
+    "observatory_ticket_office": "전망대 매표소",
     "atm": "ATM",
-    "items_and_luggage_storage": "置物櫃",
-    "metro_station": "捷運",
-    "taxi_station": "計程車乘車處",
-    "101f_queue": "101F 排隊處",
-    "91f_outdoor_area": "91F 戶外區",
-    "ice_warmed_water_dispenser": "飲水機",
-    "snackable_souvenirs": "伴手禮區",
-    "high_rise_restaurant_reception": "景觀餐廳櫃台",
-    "accessible_facilities": "無障礙廁所",
-    "tax_refund_currency_exchange": "退稅/外幣兌換櫃台",
-    "service_counter": "客服",
-    "service_counter_parking_discount": "客服(停車折抵)",
-    "restroom": "廁所",
-    "nursing_room": "哺乳室",
-    "food_court": "美食街",
-    "supermarket": "超市",
-    "din_tai_fung": "鼎泰豐",
-    "all_brands": "全館品牌"
+    "items_and_luggage_storage": "물품 보관함",
+    "metro_station": "지하철역",
+    "taxi_station": "택시 승차장",
+    "101f_queue": "101F 줄 서기 장소",
+    "91f_outdoor_area": "91F 야외 구역",
+    "ice_warmed_water_dispenser": "정수기",
+    "snackable_souvenirs": "기념품 구역",
+    "high_rise_restaurant_reception": "고층 레스토랑 안내 데스크",
+    "accessible_facilities": "장애인 화장실",
+    "tax_refund_currency_exchange": "세금 환급/외화 환전 창구",
+    "service_counter": "고객 서비스",
+    "service_counter_parking_discount": "고객 서비스(주차 할인)",
+    "restroom": "화장실",
+    "nursing_room": "수유실",
+    "food_court": "푸드코트",
+    "supermarket": "슈퍼마켓",
+    "din_tai_fung": "딘타이펑",
+    "all_brands": "전관 브랜드"
   },
   "external": {
     "all": "전체",

+ 4 - 1
src/language/zh.json

@@ -9,11 +9,13 @@
   "customer_show": "叫出真人客服",
   "customer_hide": "隱藏真人客服",
   "observation_deck": "秘境花園觀景台",
-  "location_guide": "位置導引",
+  "location_guide": "樓層平面圖",
   "food_souvenirs": "美食/伴手禮",
   "shopping_discounts": "購物及優惠",
   "service_information": "服務資訊",
   "what_around": "101附近有什麼?",
+  "system_under_construction": "系統建置中",
+  "fun_filter": "趣味濾鏡",
   "type_message": "請輸入訊息",
   "ar_tour": "進行 AR 導覽",
   "select_location": "請選擇您的位置",
@@ -36,6 +38,7 @@
   "speech_error": "語音辨識有誤,請重新錄製。",
   "return_to_ai_support": "返回 AI 客服",
   "search_brand": "搜尋品牌",
+  "close_keyboard": "輕觸螢幕可以關閉鍵盤",
   "service_info": {
     "title": "服務資訊",
     "inquiry_prompt": "請問您想查詢?<br>或於下方文字框輸入您的問題",