์ž‘๊ฐ€:
    ์ƒ์„ฑ:2026-01-22๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:2026-01-22

    ๋ฌธ์„œ: intlayer์˜ getCanonicalPath ํ•จ์ˆ˜

    ์„ค๋ช…

    getCanonicalPath ํ•จ์ˆ˜๋Š” ๋กœ์ปฌ๋ผ์ด์ฆˆ๋œ URL ๊ฒฝ๋กœ(์˜ˆ: /a-propos)๋ฅผ ๋‚ด๋ถ€์˜ ํ‘œ์ค€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒฝ๋กœ(์˜ˆ: /about)๋กœ ์—ญํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” URL ์–ธ์–ด์— ๊ด€๊ณ„์—†์ด ๋ผ์šฐํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋‚ด๋ถ€ ๋ผ์šฐํŠธ๋ฅผ ๋งค์นญํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

    ์ฃผ์š” ๊ธฐ๋Šฅ:

    • [param] ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋™์  ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋กœ์ ํŠธ ์„ค์ •์— ์ •์˜๋œ ์ปค์Šคํ…€ ๋ฆฌ๋ผ์ดํŠธ ๊ทœ์น™๊ณผ ๋กœ์ปฌ๋ผ์ด์ฆˆ๋œ ๊ฒฝ๋กœ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค.
    • ์ผ์น˜ํ•˜๋Š” ๋ฆฌ๋ผ์ดํŠธ ๊ทœ์น™์ด ์—†์œผ๋ฉด ์›๋ž˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜

    typescript
    getCanonicalPath(
      localizedPath: string,         // ํ•„์ˆ˜
      locale: Locales,               // ํ•„์ˆ˜
      rewriteRules?: RoutingConfig['rewrite'] // ์„ ํƒ์ 
    ): string
    

    ๋งค๊ฐœ๋ณ€์ˆ˜

    ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜

    • localizedPath: string

      • ์„ค๋ช…: ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด์ด๋Š” ๋กœ์ปฌ๋ผ์ด์ฆˆ๋œ ๊ฒฝ๋กœ(์˜ˆ: /a-propos).
      • ์œ ํ˜•: string
      • ํ•„์ˆ˜: ์˜ˆ
    • locale: Locales

      • ์„ค๋ช…: ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฒฝ๋กœ์— ์‚ฌ์šฉ๋˜๋Š” ๋กœ์ผ€์ผ.
      • ์œ ํ˜•: Locales
      • ํ•„์ˆ˜: ์˜ˆ

    ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜

    • rewriteRules?: RoutingConfig['rewrite']
      • ์„ค๋ช…: ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ๋ผ์ดํŠธ ๊ทœ์น™์„ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์˜ routing.rewrite ์†์„ฑ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ์œ ํ˜•: RoutingConfig['rewrite']
      • ๊ธฐ๋ณธ๊ฐ’: configuration.routing.rewrite

    ๋ฐ˜ํ™˜๊ฐ’

    • ์œ ํ˜•: string
    • ์„ค๋ช…: ๋‚ด๋ถ€ canonical ๊ฒฝ๋กœ.

    ์˜ˆ์ œ ์‚ฌ์šฉ๋ฒ•

    ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (๊ตฌ์„ฑ ์‚ฌ์šฉ)

    ๋งŒ์•ฝ intlayer.config.ts์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ๋ผ์ดํŠธ ๊ทœ์น™์„ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ:

    typescript
    import { getCanonicalPath, Locales } from "intlayer";
    
    // ๊ตฌ์„ฑ: { '/about': { en: '/about', fr: '/a-propos' } }
    getCanonicalPath("/a-propos", Locales.FRENCH);
    // Output: "/about"
    
    getCanonicalPath("/about", Locales.ENGLISH);
    // Output: "/about"
    

    ๋™์  ๋ผ์šฐํŠธ์—์„œ์˜ ์‚ฌ์šฉ

    typescript
    import { getCanonicalPath, Locales } from "intlayer";
    
    // ๊ตฌ์„ฑ: { '/product/[id]': { en: '/product/[id]', fr: '/produit/[id]' } }
    getCanonicalPath("/produit/123", Locales.FRENCH);
    // Output: "/product/123"
    

    ์ˆ˜๋™ rewrite ๊ทœ์น™

    ํ•จ์ˆ˜์— ์ˆ˜๋™ rewrite ๊ทœ์น™์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

    typescript
    import { getCanonicalPath, Locales } from "intlayer";
    
    const manualRules = {
      "/contact": {
        en: "/contact-us",
        fr: "/contactez-nous",
      },
    };
    
    getCanonicalPath("/contactez-nous", Locales.FRENCH, manualRules);
    // ์ถœ๋ ฅ: "/contact"
    

    ๊ด€๋ จ ํ•จ์ˆ˜

    • getLocalizedPath: ์ •๊ทœํ™”๋œ ๊ฒฝ๋กœ(canonical path)๋ฅผ ํ•ด๋‹น ๋กœ์ผ€์ผ์˜ ๋“ฑ๊ฐ€ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • getLocalizedUrl: ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ ๋ฐ ๋กœ์ผ€์ผ ์ ‘๋‘์‚ฌ๋ฅผ ํฌํ•จํ•œ ์™„์ „ํ•œ ๋กœ์ปฌ๋ผ์ด์ฆˆ๋œ URL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.