ํ์ฌ์ ๊ฒฝ์ฐ ์ฌ๋ฌ ํด์ธ ๋ฒ์ธ์ด ์กด์ฌํ๊ณ ์์ด, ๋ค๊ตญ์ด ์ง์์ด ํ์ํ๋ค.
์นํ์ด์ง์ ๊ฒฝ์ฐ chrome ๋ฑ ์ธํฐ๋ท ๋ธ๋ผ์ฐ์ ๋ด ๋ฒ์ญ์ผ๋ก๋ ์ง์์ด ๊ฐ๋ฅํ์ง๋ง,
ํ์ฌ์์๋ ์ฌ์ ์ ์ผ๋ก ๋ฒ์ญํ๊ธฐ ๋ณด๋ค๋, ๊ฐ ๋๋ผ์์ ์ดํดํ๊ธฐ ์ฌ์ด ๋จ์ด๋ก ๋ฒ์ญํ๋ ์ผ์ด์ค๊ฐ ํ์ํ๊ฒ ๋๋ค.
โ
์ด๋ ์ฌ์ฉ๋๋ ๊ฒ์ด i18next.
i18next๋?
Javascript๋ก ์์ฑ๋ ๊ตญ์ ํ ํ๋ ์์ํฌ๋ก ์ฌ๋ฌ ๊ตญ๊ฐ์ ์ธ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค.
๋ง์ด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ react-i18next, next-i18next, next-translation ์ด๋ ๊ฒ 3๊ฐ์ง.
๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ๋จ์ ๊ณผ ํน์ฑ์ด ์กด์ฌํ๋ฏ๋ก ์์๋ณด๊ณ ์ฑํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
โ
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ react-i18next ๋ฅผ ์ฑํํ๊ฒ ๋์๋๋ฐ.. ์ ํํ๋ ์ฑํ ๋นํ๋ค.
๊ณ ๋ก react-i18next ์ ๋ํ์ฌ ์ค๋ช ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
โ
์ฌ์ฉ.
Recoil ์ฒ๋ผ React ์์ ์ ๊ณตํ๋ Hook์ด ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฏ๋ก npm์ ํตํ์ฌ ์ค์น๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
npm install react-i18next i18next --save
์ดํ react ๋ด json ํ์ผ๋ก ๋ง๋ค์ด์ ๊บผ๋ด์ด ์ฐ๋ case ๋ ๋ง์ง๋ง,
ํ์ฌ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ DB์ ์๋ ๋ค๊ตญ์ด ํ ์ด๋ธ์ ์ฐธ์กฐํ์ฌ ๋ฐ๋ผ์ค์ผ ํ๋ฏ๋ก..
import i18next from "i18next";
import { initReactI18next } from "react-i18next";
import HttpBackend from 'i18next-http-backend';
i18next.use(initReactI18next).use(HttpBackend).init({
lng: localStorage.getItem("lng") || "en",
fallbackLng: "en", // fallback language
backend: {
loadPath: "์ฃผ์์ง๊ฐ/{{lng}}",
parse: (data) => {
return JSON.parse(data);
},
caching: false,
},
});
// ์ฌ๋ฌ ์ธ์ด๋ฅผ ํ ๋ฒ์ ๋ก๋
const supportedLanguages = ['kr', 'fr', 'en'];
supportedLanguages.forEach(lang => {
i18next.loadLanguages(lang);
});
export default i18next;
์ด๋ฐ ์์ผ๋ก ํ๋ฒ์ ๋ถ๋ฌ์์ ์ ์ฅํด๋๊ณ , ๊บผ๋ด์ด ์ฐ๋ ํ์์ผ๋ก ์ฌ์ฉํ๋ค.
@GetMapping("/์ฃผ์์ง/{language}")
public ResponseEntity<Object> getTranslations(@PathVariable String language) {
System.out.println("ํธ์ถ:::"+language);
if ("fr".equals(language)) {
// French translations
return ResponseEntity.status(HttpStatus.OK).body(
Map.of("welcome", "Bienvenue", "hello", "Bonjour")
);
} else if ("kr".equals(language)) {
// Korean translations
return ResponseEntity.status(HttpStatus.OK).body(
Map.of("welcome", "ํ์ํฉ๋๋ค", "hello", "์๋
ํ์ธ์")
);
} else {
return ResponseEntity.status(HttpStatus.OK).body(
Map.of("welcome", "welcome", "hello", "hello")
);
}
}
spring ์ธก ๊ตฌํ.
์ปจํธ๋กค๋ฌ์์ ๋ฐ๋ก ํด๋น ๋ชจ์์ผ๋ก body๋ฅผ sending ํ๋๋ก ํด๋์๋๋ฐ,
์ ์์ ์ผ๋ก DB์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๋ ค๋ฉด controller-service-mapper๋ก ์ฐ๊ฒฐํด์ฃผ๊ณ ,
mapper์์ ํด๋น ๋ชจ์๋๋ก sql์ ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
โ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๊ฑฐ๋ ๊ฐ๋ฐํ๋ฉฐ ๋๊ผ๋ ๋ํผ์
๋ก ์์ฑํ๊ณ ์์ผ๋,
๊ถ๊ธํ์ ์ ์ด๋ ์๋ชป๋ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.