SMALL

입력받은 문자열을 가져오는 부분(antd 이용)

// components/translate/LanguageSelector.tsx

import { Select } from 'antd';

interface LanguageOption {
  label: string;
  value: string;
  src: string;
}

interface LanguageSelectorProps {
  onChange: (value: string) => void;
  value: string | undefined;
}

const languages: LanguageOption[] = [
  { label: "Korea", value: "ko", src: "https://flagcdn.com/h60/kr.png" },
  { label: "English", value: "en", src: "https://flagcdn.com/h60/us.png" },
  { label: "Russia", value: "ru", src: "https://flagcdn.com/h60/ru.png" },
];

const { Option } = Select;

export default function LanguageSelector({ onChange, value }: LanguageSelectorProps) {
  return (
    <Select
      className='w-[70px] py-0.5'
      onChange={onChange}
      value={value}
    >
      {languages.map(lang => (
        <Option key={lang.value} value={lang.value}>
          <p className='flex flex-row items-center'>
            <img src={lang.src} alt={lang.label} className="w-6 h-4" />
          </p>
        </Option>
      ))}
    </Select>
  );
}

 

 

구글 번역 적용부분

// components/translate/GoogleTranslate.tsx

import { useState, useEffect } from 'react';
import Script from 'next/script';
import LanguageSelector from './LanguageSelector';

interface GoogleTranslateProps {
  prefLangCookie: string;
}

const languages = [
  { label: "Korea", value: "ko", src: "https://flagcdn.com/h60/kr.png" },
  { label: "English", value: "en", src: "https://flagcdn.com/h60/us.png" },
  { label: "Russia", value: "ru", src: "https://flagcdn.com/h60/ru.png" },
];

declare global {
  interface Window {
    googleTranslateElementInit: () => void;
    google: any;
  }
}


//languages에서 value값 추출
const includedLanguages = languages.map(lang => lang.value).join(",");


// 초기 로딩을 위한 함수
function googleTranslateElementInit() {
  new window.google.translate.TranslateElement({
    pageLanguage: "auto", includedLanguages
  }, "google_translate_element");
}

// 원래 언어설정으로 돌아오기 위한 함수
function resetGoogleTranslate() {
  const div = document.querySelector<HTMLDivElement>('.skiptranslate');

  if (div) {
    const iframe = document.querySelector<HTMLIFrameElement>('iframe[id="\\:1\\.container"]');
    
    if (iframe) {
      const innerDoc = iframe.contentDocument || iframe.contentWindow?.document;

      if (innerDoc) {
        const closeTranslate = innerDoc.querySelector<HTMLAnchorElement>('a[id="\\:1\\.close"]');

        if (closeTranslate) {
          const event = new MouseEvent('click', {
            view: window,
            bubbles: true,
            cancelable: true,
          });
          closeTranslate.dispatchEvent(event);
        }
      }
    }
  }
}




export default function GoogleTranslate({ prefLangCookie }: GoogleTranslateProps) {
  const [langCookie, setLangCookie] = useState(prefLangCookie);

  //useEffect를 이용한 초기 함수 설정
  useEffect(() => {
    window.googleTranslateElementInit = googleTranslateElementInit;
  }, []);

  //언어설정값에 따라 useState 변경
  const handleChange = (value: string) => {
    setLangCookie(value);
  };

  //langCookie값 변화에 따라 실행시키는 이벤트 (언어감지)
  useEffect(() => {
    if (langCookie === "ko") {
      resetGoogleTranslate();
    } else {
      const element = document.querySelector<HTMLSelectElement>(".goog-te-combo");
      if (element) {
        element.value = langCookie;
        element.dispatchEvent(new Event("change"));
      }
    }
  }, [langCookie]);

  const selectedOption = languages.find(lang => lang.value === langCookie);

  return (
    <div>
      <div id="google_translate_element" style={{ visibility: "hidden", width: "1px", height: "1px" }}></div>
      <LanguageSelector onChange={handleChange} value={selectedOption?.value} />
      {langCookie !== 'ko' && <Script
        src="https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"
        strategy="afterInteractive"
      />}
    </div>
  );
}

 

 

 

필요한 부분에 컴포넌트 호출

   import GoogleTranslate from '@/components/translate/GoogleTranslate';
            <GoogleTranslate prefLangCookie={'ko'} />

 

 

css 덮어쓰기 

body { 
  position: static !important; 
  top: 0px !important; 
}
.skiptranslate{ 
  display: none !important; 
}
.VIpgJd-ZVi9od-aZ2wEe-wOHMyf{
  display: none !important; 
}

 

 

 

실행안되거나 에러날 시 설정파일 만들기

//lib.dom.d.ts (루트경로)
declare global {
  interface Window {
    google: any;
    googleTranslateElementInit: any;
  }
}

 

 

 

 

 

 

 

 

 

 

 

 

참고: https://dev.to/kstulgys/translate-website-with-google-translate-kll

 

Integrating Google Translate into Your Next.js Website

In the global digital landscape, offering your website in multiple languages is not just an...

dev.to

 

LIST

'일반' 카테고리의 다른 글

CMAN BUILD  (0) 2024.09.02
Next.js 구글번역을 이용한 웹페이지 번역  (0) 2024.08.05
다국어 지원 관련 방법 2  (0) 2024.07.25
국제화 관련 사이트  (0) 2024.07.25
next.js URL 쿼리 매개변수  (0) 2024.07.24
SMALL

https://hotsunchip.tistory.com/13

 

[Next.js 14] App router 기반 Localization / Internationalization [i18next]

다국어를 지원하는 웹에 들어가보면 드롭다운으로 언어를 바꾸고, 그에 맞게 텍스트가 휙휙 바뀌는 것을 본 적이 있을 것이다. 이번 포스팅에서는 i18next 모듈을 이용해서 앱 라우터 기반의 Next.j

hotsunchip.tistory.com

 

https://hotsunchip.tistory.com/27

 

[Next.js 14] Google SpreadSheets를 이용한 다국어 지원 서비스 자동화 및 발생한 오류 해결 방법 정리 [i1

얼마 전(?)에 작성한 App router 기반 Localization 기능을 자동화하기로 했다. [Next.js 14] App router 기반 Localization / Internationalization [i18next] 다국어를 지원하는 웹에 들어가보면 드롭다운으로 언어를 바꾸

hotsunchip.tistory.com

https://velog.io/@calvinsnax/getting-i18n-with-google-spreadsheet

 

구글스프레드시트를 200% 활용한 국제화(i18n) 자동화 사례

비개발자와의 협업이 유독 중요했던 국제화 프로젝트. 구글스프레드시트를 활용하여 비개발자와의 협업을 멋지게 완성해낸 국제화(i18n) 자동화 사례를 소개합니다.

velog.io

https://ui.toast.com/weekly-pick/ko_20210303

 

국제화(i18n) 자동화 가이드

국제화 과정에서 "복붙"이나 반복적인 수작업으로 인해 고통받는 모든 프런트엔드 개발자를 위하여 작성하였다. 이 자동화 가이드를 따른다면 여러분은 단 한 줄의 스크립트 실행만으로 고통에

ui.toast.com

 

LIST

'일반' 카테고리의 다른 글

Next.js 구글번역을 이용한 웹페이지 번역  (0) 2024.08.05
next.js에 구글 번역 적용하기  (0) 2024.07.26
국제화 관련 사이트  (0) 2024.07.25
next.js URL 쿼리 매개변수  (0) 2024.07.24
next.js build error (winston module)  (0) 2024.07.17
SMALL

https://m.blog.naver.com/s0215hc/222392725370

 

[script] 구글 번역을 이용한 간단한 다국어 페이지 만들기

구글 번역을 이용한 간단한 다국어 페이지 적용 방법입니다. 복잡한 문장이거나 정확한 번역이 필요한 사이...

blog.naver.com

 

 

https://www.w3schools.com/howto/howto_google_translate.asp

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

 

https://stackoverflow.com/questions/12243818/adding-google-translate-to-a-web-site

 

Adding Google Translate to a web site

Looking here Google Translate I get the following code. <meta name="google-translate-customization" content="9f841e7780177523-3214ceb76f765f38-gc38c6fe6f9d06436-c"></me...

stackoverflow.com

 

https://letsplaycoding.tistory.com/82

 

[javascript] 웹사이트 무료 구글 번역 api 사용법

Google의 사이트 번역 기능을 이용하면 손쉽게 내 사이트를 다국어 사이트로 변신시킬 수 있다. 기존에는 API 키를 발급해 사용이 가능 하였으나 현재는 더 이상 제공 되지 않는다. 그래서 우리는

letsplaycoding.tistory.com

 

 

https://nextjs.org/docs/app/api-reference/components/script#props

 

Components: <Script> | Next.js

Optimize third-party scripts in your Next.js application using the built-in `next/script` Component.

nextjs.org

 

 

 

LIST
SMALL

next.js공식 문서

https://nextjs.org/docs/app/building-your-application/routing/route-handlers#url-query-parameters

 

Routing: Route Handlers | Next.js

Create custom request handlers for a given route using the Web's Request and Response APIs.

nextjs.org

 

 

적용예시

https://dev.to/lakshmananarumugam/advanced-nextjs-url-handling-with-urlsearchparams-2gp3?utm_source=oneoneone

 

Advanced Next.js URL handling with URLSearchParams

Video Tutorial ...

dev.to

 

LIST

'일반' 카테고리의 다른 글

다국어 지원 관련 방법 2  (0) 2024.07.25
국제화 관련 사이트  (0) 2024.07.25
next.js build error (winston module)  (0) 2024.07.17
node 프로그램 내부 MQTT reconnect관련 문제  (0) 2024.07.11
sync 배포 시 문제  (0) 2024.07.04
SMALL

현재 root경로에서 logger.js 내부에서 winston모듈 사용중

 

tsconfing.json내부에서 에러로 표시되길래 확인

tsconfig파일 수정

{
  "compilerOptions": {
    "types": ["kakao.maps.d.ts"],
    "lib": ["WebWorker", "dom", "dom.iterable", "esnext", ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": false,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "baseUrl": ".",
    "target": "es2017",
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "public/mqttWorker.js"],
 // "exclude": ["node_modules"]
   "exclude": ["node_modules", "logger.js"]
}

exclude에 logger.js추가 및 .next폴더 전체삭제 후 build하기

 

정상동작★

LIST

'일반' 카테고리의 다른 글

국제화 관련 사이트  (0) 2024.07.25
next.js URL 쿼리 매개변수  (0) 2024.07.24
node 프로그램 내부 MQTT reconnect관련 문제  (0) 2024.07.11
sync 배포 시 문제  (0) 2024.07.04
HeidiSQL sql로 내보내기  (0) 2024.07.03
SMALL
  • MQTT connect가 지속적으로 발생하는 문제

->  connect를 유발하는 함수나 스케줄이 있을것으로 추정(로그 추가로 탐색 ->아니었음)

 

  •  reconnect가 유발되는지 확인하기위해 reconnect관련 코드 추가

-> reconnect가 유발되는것 확인 

->자동 reconnect가 유발되지 않게 설정한 뒤 수동으로 reconnect하도록 설정

->reconnect가 정상적으로 이루어지지 않음-> MQTT수신이 이루어지지않음 

 

  • AWS측에서 네트워크 신호를 조절하는 지 확인하기 위한 ping테스트 진행중

-> 이상없음

  • 중복문자를 처리하지않는 방식으로 진행

 

LIST

'일반' 카테고리의 다른 글

next.js URL 쿼리 매개변수  (0) 2024.07.24
next.js build error (winston module)  (0) 2024.07.17
sync 배포 시 문제  (0) 2024.07.04
HeidiSQL sql로 내보내기  (0) 2024.07.03
NEXT.js fetch관련 자료  (0) 2024.06.18

+ Recent posts