์ฟ ํ‚ค / ํ—ค๋”์—์„œ ๋กœ์ผ€์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•

    ํ›… ์‚ฌ์šฉํ•˜๊ธฐ (๊ถŒ์žฅ)

    ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ํ˜„์žฌ ๋กœ์ผ€์ผ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ useLocale ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ํ›…์€ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Vue.js์˜ useLocale ์ปดํฌ์ €๋ธ”๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    ts
    import { useLocale } from "next-intlayer";
    // ๋˜๋Š” import { useLocale } from "react-intlayer";
    // ๋˜๋Š” import { useLocale } from "vue-intlayer";
    
    ts;
    // ํด๋ผ์ด์–ธํŠธ ์ธก ์‚ฌ์šฉ๋ฒ•
    const { locale } = useLocale();
    

    ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ, ๋‹ค์Œ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    tsx
    import { useLocale } from "next-intlayer/server";
    
    const Test = () => {
      const { locale } = useLocale();
      return <>{locale}</>;
    };
    
    const Page = async ({ params }) => {
      const { locale } = await params;
    
      return (
        <IntlayerServerProvider locale={locale}>
          <Test />
        </IntlayerServerProvider>
      );
    };
    

    ์ฟ ํ‚ค ๊ฐ’๋งŒ ํ•ด๊ฒฐํ•˜๋Š” useLocaleCookie ํ›…๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ˆ˜๋™ ์ฟ ํ‚ค ์„ค์ •

    ์‚ฌ์šฉ์ž ์ •์˜ ์ฟ ํ‚ค ์ด๋ฆ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    ts
    import { type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      middleware: {
        cookieName: "myCustomLocaleCookie", // ๊ธฐ๋ณธ๊ฐ’์€ 'intlayer-locale' ์ž…๋‹ˆ๋‹ค
      },
    };
    
    export default config;
    

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

    ํด๋ผ์ด์–ธํŠธ ์ธก

    ts
    // ๊ธฐ๋ณธ ์ฟ ํ‚ค ์ด๋ฆ„ ์‚ฌ์šฉ
    const locale = document.cookie
      .split("; ")
      .find((row) => row.startsWith("intlayer-locale="))
      ?.split("=")[1];
    
    // ์‚ฌ์šฉ์ž ์ •์˜ ์ฟ ํ‚ค ์ด๋ฆ„ ์‚ฌ์šฉ
    const locale = document.cookie
      .split("; ")
      .find((row) => row.startsWith("myCustomLocaleCookie="))
      ?.split("=")[1];
    

    ์„œ๋ฒ„ ์ธก (Next.js)

    ts
    import { cookies } from "next/headers";
    
    // ๊ธฐ๋ณธ ์ฟ ํ‚ค ์ด๋ฆ„ ์‚ฌ์šฉ
    const locale = cookies().get("intlayer-locale")?.value;
    
    // ์‚ฌ์šฉ์ž ์ •์˜ ์ฟ ํ‚ค ์ด๋ฆ„ ์‚ฌ์šฉ
    const locale = cookies().get("myCustomLocaleCookie")?.value;
    

    ์•„์ง locale์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

    locale์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ locale์„ ์„ ํƒํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ ๋ฐฉ๋ฌธ์ž์˜ ๊ฒฝ์šฐ locale์€ ํ—ค๋” ํ•„๋“œ์—์„œ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ์ž์˜ ์„ ํ˜ธ locale์€ ์š”์ฒญ ํ—ค๋”์—์„œ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค:

    ts
    /**
     * ์š”์ฒญ ํ—ค๋”์—์„œ locale์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค
     *
     * accept-language ํ—ค๋”๋Š” locale ๊ฐ์ง€์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ—ค๋”์ž…๋‹ˆ๋‹ค.
     * ์ด ํ—ค๋”๋Š” ํ’ˆ์งˆ ๊ฐ’(q-value)๊ณผ ํ•จ๊ป˜ ์–ธ์–ด ์ฝ”๋“œ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋ฉฐ,
     * ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด๋ฅผ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
     *
     * ์˜ˆ์‹œ: "en-US,en;q=0.9,fr;q=0.8,es;q=0.7"
     * - en-US๋Š” ๊ธฐ๋ณธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค (q=1.0์ด ์•”์‹œ๋จ)
     * - en์€ ๋‘ ๋ฒˆ์งธ ์„ ํƒ์ž…๋‹ˆ๋‹ค (q=0.9)
     * - fr์€ ์„ธ ๋ฒˆ์งธ ์„ ํƒ์ž…๋‹ˆ๋‹ค (q=0.8)
     * - es๋Š” ๋„ค ๋ฒˆ์งธ ์„ ํƒ์ž…๋‹ˆ๋‹ค (q=0.7)
     */
    import { localeDetector } from "@intlayer/core";
    
    /**
     * ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด๋‚ด๋Š” ํ˜‘์ƒ์ž(negotiator) ํ—ค๋” ์˜ˆ์‹œ
     * ์ด ํ—ค๋”๋“ค์€ ์‚ฌ์šฉ์ž์˜ ์„ ํ˜ธ ์–ธ์–ด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค
     */
    const exampleNegotiatorHeaders: Record<string, string> = {
      "accept-language": "en-US,en;q=0.9,fr;q=0.8,es;q=0.7",
      "accept":
        "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "user-agent":
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    };
    
    // ์‚ฌ์šฉ ์˜ˆ์‹œ:
    const detectedLocale = localeDetector(exampleNegotiatorHeaders);