| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- <template>
- <header>
- <div class="header--wrap" :class="{ white: isScrolled || isMobileMenuOpen }">
- <div class="header--container">
- <NuxtLink class="logo--wrap" to="/">그린웨일글로벌</NuxtLink>
- <ul class="menu--wrap">
- <li class="menu--item">
- <NuxtLink to="/company/intro">Company</NuxtLink>
- <ul class="gnb--wrap">
- <li><NuxtLink to="/company/intro">회사소개</NuxtLink></li>
- <li><NuxtLink to="/company/history">회사연혁</NuxtLink></li>
- <li><NuxtLink to="/company/partners">협력업체</NuxtLink></li>
- <li><NuxtLink to="/company/catalog">회사소개자료</NuxtLink></li>
- </ul>
- </li>
- <li class="menu--item">
- <NuxtLink to="/products/materials">Products</NuxtLink>
- <ul class="gnb--wrap">
- <li><NuxtLink to="/products/materials">Materials</NuxtLink></li>
- <li><NuxtLink to="/products/solutions">Solutions</NuxtLink></li>
- </ul>
- </li>
- <li class="menu--item">
- <NuxtLink to="/technology/facilities">Technology</NuxtLink>
- <ul class="gnb--wrap">
- <li><NuxtLink to="/technology/facilities">시설</NuxtLink></li>
- <li><NuxtLink to="/technology/patents">특허 / 인증</NuxtLink></li>
- </ul>
- </li>
- <li class="menu--item">
- <NuxtLink to="/media/news">Media</NuxtLink>
- <ul class="gnb--wrap">
- <li><NuxtLink to="/media/news">환경뉴스</NuxtLink></li>
- <li><NuxtLink to="/media/press">보도자료</NuxtLink></li>
- </ul>
- </li>
- <li class="menu--item">
- <NuxtLink to="/contact/notice">Contact</NuxtLink>
- <ul class="gnb--wrap">
- <li><NuxtLink to="/contact/notice">공지사항</NuxtLink></li>
- <li><NuxtLink to="/contact/faq">FAQ</NuxtLink></li>
- <li><NuxtLink to="/contact/support">고객센터</NuxtLink></li>
- <li><NuxtLink to="/contact/location">오시는길</NuxtLink></li>
- </ul>
- </li>
- </ul>
- <div class="lang--wrap" :class="{ active: isLangOpen }" ref="langWrap" @click="toggleLang">
- <div class="ico"></div>
- <p>{{ currentLang }}</p>
- <ul class="select--wrap" :class="{ active: isLangOpen }">
- <li @click.stop="changeLang('ko')">한국어</li>
- <li @click.stop="changeLang('en')">English</li>
- <li @click.stop="changeLang('zh-CN')">中文(简体)</li>
- <li @click.stop="changeLang('zh-TW')">中文(繁體)</li>
- <li @click.stop="changeLang('ja')">日本語</li>
- <li @click.stop="changeLang('es')">Español</li>
- <li @click.stop="changeLang('fr')">Français</li>
- <li @click.stop="changeLang('de')">Deutsch</li>
- <li @click.stop="changeLang('ru')">Русский</li>
- <li @click.stop="changeLang('ar')">العربية</li>
- <li @click.stop="changeLang('el')">Ελληνικά</li>
- <li @click.stop="changeLang('la')">Latina</li>
- <li @click.stop="changeLang('ms')">Bahasa Melayu</li>
- <li @click.stop="changeLang('vi')">Tiếng Việt</li>
- <li @click.stop="changeLang('eo')">Esperanto</li>
- <li @click.stop="changeLang('it')">Italiano</li>
- <li @click.stop="changeLang('id')">Bahasa Indonesia</li>
- <li @click.stop="changeLang('km')">ភាសាខ្មែរ</li>
- <li @click.stop="changeLang('th')">ไทย</li>
- <li @click.stop="changeLang('tr')">Türkçe</li>
- <li @click.stop="changeLang('pt')">Português (Brasil)</li>
- <li @click.stop="changeLang('hu')">Magyar</li>
- <li @click.stop="changeLang('el')">Ελληνικά</li>
- <li @click.stop="changeLang('la')">Latina</li>
- <li @click.stop="changeLang('ms')">Bahasa Melayu</li>
- <li @click.stop="changeLang('vi')">Tiếng Việt</li>
- <li @click.stop="changeLang('eo')">Esperanto</li>
- <li @click.stop="changeLang('it')">Italiano</li>
- <li @click.stop="changeLang('id')">Bahasa Indonesia</li>
- <li @click.stop="changeLang('km')">ភាសាខ្មែរ</li>
- <li @click.stop="changeLang('th')">ไทย</li>
- <li @click.stop="changeLang('tr')">Türkçe</li>
- <li @click.stop="changeLang('pt')">Português (Brasil)</li>
- <li @click.stop="changeLang('hu')">Magyar</li>
- </ul>
- </div>
- <div class="ham--wrap" :class="{ active: isMobileMenuOpen }">
- <UButton @click="toggleMobileMenu"></UButton>
- </div>
- </div>
- </div>
- <div class="mobile--header--wrap" :class="{ active: isMobileMenuOpen }">
- <div class="mobile--menu--wrap">
- <ul>
- <li>
- <div
- @click="toggleAccordion('company')"
- :class="{ active: activeAccordion === 'company' }"
- >
- Company<i class="ico"></i>
- </div>
- <ul :class="{ active: activeAccordion === 'company' }">
- <li>
- <NuxtLink @click="closeMobileMenu" to="/company/intro">회사소개</NuxtLink>
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/company/history"
- >회사연혁</NuxtLink
- >
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/company/partners"
- >협력업체</NuxtLink
- >
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/company/catalog"
- >회사소개자료</NuxtLink
- >
- </li>
- </ul>
- </li>
- <li>
- <div
- @click="toggleAccordion('products')"
- :class="{ active: activeAccordion === 'products' }"
- >
- Products<i class="ico"></i>
- </div>
- <ul :class="{ active: activeAccordion === 'products' }">
- <li>
- <NuxtLink @click="closeMobileMenu" to="/products/materials"
- >Materials</NuxtLink
- >
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/products/solutions"
- >Solutions</NuxtLink
- >
- </li>
- </ul>
- </li>
- <li>
- <div
- @click="toggleAccordion('technology')"
- :class="{ active: activeAccordion === 'technology' }"
- >
- Technology<i class="ico"></i>
- </div>
- <ul :class="{ active: activeAccordion === 'technology' }">
- <li>
- <NuxtLink @click="closeMobileMenu" to="/technology/facilities"
- >시설</NuxtLink
- >
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/technology/patents"
- >특허 / 인증</NuxtLink
- >
- </li>
- </ul>
- </li>
- <li>
- <div
- @click="toggleAccordion('media')"
- :class="{ active: activeAccordion === 'media' }"
- >
- Media<i class="ico"></i>
- </div>
- <ul :class="{ active: activeAccordion === 'media' }">
- <li>
- <NuxtLink @click="closeMobileMenu" to="/media/news">환경뉴스</NuxtLink>
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/media/press">보도자료</NuxtLink>
- </li>
- </ul>
- </li>
- <li>
- <div
- @click="toggleAccordion('contact')"
- :class="{ active: activeAccordion === 'contact' }"
- >
- Contact<i class="ico"></i>
- </div>
- <ul :class="{ active: activeAccordion === 'contact' }">
- <li>
- <NuxtLink @click="closeMobileMenu" to="/contact/notice"
- >공지사항</NuxtLink
- >
- </li>
- <li><NuxtLink @click="closeMobileMenu" to="/contact/faq">FAQ</NuxtLink></li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/contact/support"
- >고객센터</NuxtLink
- >
- </li>
- <li>
- <NuxtLink @click="closeMobileMenu" to="/contact/location"
- >오시는길</NuxtLink
- >
- </li>
- </ul>
- </li>
- </ul>
- </div>
- <div class="mobile--lang--wrap">
- <div class="lang--wrap" :class="{ active: isLangOpen2 }" ref="langWrap2" @click="toggleLang2">
- <div class="ico"></div>
- <p>{{ currentLang }}</p>
- <ul class="select--wrap" :class="{ active: isLangOpen2 }">
- <li @click.stop="changeLang('ko')">한국어</li>
- <li @click.stop="changeLang('en')">English</li>
- <li @click.stop="changeLang('zh-CN')">中文(简体)</li>
- <li @click.stop="changeLang('zh-TW')">中文(繁體)</li>
- <li @click.stop="changeLang('ja')">日본語</li>
- <li @click.stop="changeLang('es')">Español</li>
- <li @click.stop="changeLang('fr')">Français</li>
- <li @click.stop="changeLang('de')">Deutsch</li>
- <li @click.stop="changeLang('ru')">Русский</li>
- <li @click.stop="changeLang('ar')">العربية</li>
- <li @click.stop="changeLang('el')">Ελληνικά</li>
- <li @click.stop="changeLang('la')">Latina</li>
- <li @click.stop="changeLang('ms')">Bahasa Melayu</li>
- <li @click.stop="changeLang('vi')">Tiếng Việt</li>
- <li @click.stop="changeLang('eo')">Esperanto</li>
- <li @click.stop="changeLang('it')">Italiano</li>
- <li @click.stop="changeLang('id')">Bahasa Indonesia</li>
- <li @click.stop="changeLang('km')">ភាសាខ្មែរ</li>
- <li @click.stop="changeLang('th')">ไทย</li>
- <li @click.stop="changeLang('tr')">Türkçe</li>
- <li @click.stop="changeLang('pt')">Português (Brasil)</li>
- <li @click.stop="changeLang('hu')">Magyar</li>
- </ul>
- </div>
- </div>
- </div>
- <!-- Hidden Google Translate component for functionality -->
- <ClientOnly>
- <GoogleTranslate />
- </ClientOnly>
- </header>
- </template>
- <script setup>
- import { ref, onMounted, onUnmounted } from "vue";
- import { useGoogleTranslate } from '#imports';
- const isScrolled = ref(false);
- const isMobileMenuOpen = ref(false);
- const activeAccordion = ref(null);
- const isLangOpen = ref(false);
- const isLangOpen2 = ref(false);
- const currentLang = ref('한국어');
- const langWrap = ref(null);
- const langWrap2 = ref(null);
-
- // Google Translate 기능 사용
- let setLanguage;
- try {
- const googleTranslate = useGoogleTranslate();
- setLanguage = googleTranslate.setLanguage;
- } catch (error) {
- console.warn('Google Translate not available:', error);
- setLanguage = (lang) => console.log('Would translate to:', lang);
- }
-
- // 언어 매핑
- const langMap = {
- 'ko': '한국어',
- 'en': 'English',
- 'zh-CN': '中文(简体)',
- 'zh-TW': '中文(繁體)',
- 'ja': '日本語',
- 'es': 'Español',
- 'fr': 'Français',
- 'de': 'Deutsch',
- 'ru': 'Русский',
- 'ar': 'العربية',
- 'el': 'Ελληνικά', // 그리스어
- 'la': 'Latina', // 라틴어
- 'ms': 'Bahasa Melayu', // 말레이어
- 'vi': 'Tiếng Việt', // 베트남어
- 'eo': 'Esperanto', // 에스페란토어
- 'it': 'Italiano', // 이탈리아어
- 'id': 'Bahasa Indonesia', // 인도네시아어
- 'km': 'ភាសាខ្មែរ', // 크메르어
- 'th': 'ไทย', // 태국어
- 'tr': 'Türkçe', // 튀르키예어
- 'pt': 'Português (Brasil)', // 포르투갈어(브라질)
- 'hu': 'Magyar' // 헝가리어
- };
- const handleScroll = () => {
- // 모바일 메뉴가 열려있으면 스크롤 위치와 상관없이 white 클래스 유지
- if (isMobileMenuOpen.value) {
- isScrolled.value = true;
- } else {
- isScrolled.value = window.scrollY > 0;
- }
- };
- const toggleMobileMenu = () => {
- isMobileMenuOpen.value = !isMobileMenuOpen.value;
- };
-
- const toggleLang = () => {
- isLangOpen.value = !isLangOpen.value;
- };
- const toggleLang2 = () => {
- isLangOpen2.value = !isLangOpen2.value;
- };
-
- const changeLang = (langCode) => {
- // 먼저 드롭다운을 닫음
- isLangOpen.value = false;
- isLangOpen2.value = false;
-
- // UI 업데이트
- currentLang.value = langMap[langCode] || langCode.toUpperCase();
-
- // Google Translate 모듈 사용하여 언어 변경
- setLanguage(langCode);
-
- // localStorage에 선택된 언어 저장
- if (typeof window !== 'undefined') {
- localStorage.setItem('selectedLanguage', langCode);
- }
-
- console.log(`Language changed to: ${langCode}`);
- };
-
- // 페이지 로드 시 저장된 언어 복원
- const restoreLanguage = () => {
- if (typeof window !== 'undefined') {
- const savedLang = localStorage.getItem('selectedLanguage');
- if (savedLang && savedLang !== 'ko') {
- currentLang.value = langMap[savedLang] || savedLang.toUpperCase();
- }
- }
- };
- const toggleAccordion = (section) => {
- if (activeAccordion.value === section) {
- activeAccordion.value = null;
- } else {
- activeAccordion.value = section;
- }
- };
- const closeMobileMenu = () => {
- isMobileMenuOpen.value = false;
- activeAccordion.value = null;
- };
-
- const handleClickOutside = (event) => {
- if (langWrap.value && !langWrap.value.contains(event.target)) {
- isLangOpen.value = false;
- }
- };
- const handleClickOutside2 = (event) => {
- if (langWrap2.value && !langWrap2.value.contains(event.target)) {
- isLangOpen2.value = false;
- }
- };
-
- onMounted(() => {
- window.addEventListener("scroll", handleScroll);
- document.addEventListener('click', handleClickOutside);
- document.addEventListener('click', handleClickOutside2);
-
- // 저장된 언어 설정 복원
- restoreLanguage();
- });
- onUnmounted(() => {
- window.removeEventListener("scroll", handleScroll);
- document.removeEventListener('click', handleClickOutside);
- document.removeEventListener('click', handleClickOutside2);
- });
- </script>
- <style scoped>
- /* 드롭다운 애니메이션 및 상태 관리 */
- .lang--wrap .select--wrap {
- opacity: 0;
- pointer-events: none;
- transition: all 0.3s ease;
- }
- .lang--wrap.active .select--wrap {
- opacity: 1;
- pointer-events: all;
- }
- /* 모바일 드롭다운 */
- .mobile--lang--wrap .lang--wrap .select--wrap {
- opacity: 0;
- pointer-events: none;
- transition: all 0.3s ease;
- max-height: 300px; /* 높이 조정 */
- }
- .mobile--lang--wrap .lang--wrap.active .select--wrap {
- opacity: 1;
- pointer-events: all;
- }
- /* 데스크톱 드롭다운 높이 조정 */
- .lang--wrap .select--wrap {
- max-height: 300px; /* 높이 조정 */
- }
- </style>
|