Author:
    Creation:2024-08-11Last update:2026-01-26

    Next.js рдПрдХреАрдХрд░рдг: next-intlayer рдХреЗ рд▓рд┐рдП useLocale рд╣реБрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг

    рдпрд╣ рдЕрдиреБрднрд╛рдЧ next-intlayer рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рднреАрддрд░ Next.js рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд useLocale рд╣реБрдХ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

    Next.js рдореЗрдВ useLocale рдХреЛ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рдирд╛

    рдЕрдкрдиреЗ Next.js рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ useLocale рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░реЗрдВ:

    javascript
    import { useLocale } from "next-intlayer"; // Next.js рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
    

    рдЙрдкрдпреЛрдЧ

    рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Next.js рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдХреЗ рднреАрддрд░ useLocale рд╣реБрдХ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

    src/components/LocaleSwitcher.tsx
    "use client";
    
    import type { FC } from "react";
    import { Locales } from "intlayer";
    import { useLocale } from "next-intlayer";
    
    const LocaleSwitcher: FC = () => {
      const { locale, defaultLocale, availableLocales, setLocale } = useLocale();
    
      return (
        <div>
          <h1>рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп: {locale}</h1>
          <p>рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд╛рдиреАрдп: {defaultLocale}</p>
          <select value={locale} onChange={(e) => setLocale(e.target.value)}>
            {availableLocales.map((loc) => (
              <option key={loc} value={loc}>
                {loc}
              </option>
            ))}
          </select>
        </div>
      );
    };
    

    рдкреИрд░рд╛рдореАрдЯрд░

    useLocale рд╣реБрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

    • onLocaleChange: рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ URL рдХреЛ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ "replace", "push" рдпрд╛ "none" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

      рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВ:

      1. рдЖрдк /fr/home рдкрд░ рд╣реИрдВ
      2. рдЖрдк /fr/about рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ
      3. рдЖрдк рд╕реНрдерд╛рдиреАрдп рдХреЛ /es/about рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ
      4. рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ "рдкреАрдЫреЗ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ

      onLocaleChange рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рднрд┐рдиреНрди рд╣реЛрдЧрд╛:

      • "replace" (рдбрд┐рдлрд╝реЙрд▓реНрдЯ): рд╡рд░реНрддрдорд╛рди URL рдХреЛ рдирдП рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреБрдХреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред -> "рдкреАрдЫреЗ" рдмрдЯрди /es/home рдкрд░ рдЬрд╛рдПрдЧрд╛
      • "push": рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдирдпрд╛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдХреБрдХреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред -> "рдкреАрдЫреЗ" рдмрдЯрди /fr/about рдкрд░ рдЬрд╛рдПрдЧрд╛
      • "none": рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ URL рдмрджрд▓реЗ рдмрд┐рдирд╛ рдХреБрдХреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред -> "рдкреАрдЫреЗ" рдмрдЯрди /fr/home рдкрд░ рдЬрд╛рдПрдЧрд╛
      • (locale) => void: рдХреБрдХреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

        undefined рд╡рд┐рдХрд▓реНрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирдП рд╕реНрдерд╛рдиреАрдп рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Link рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг:

        tsx
        <Link href="/es/about" replace>
          рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ
        </Link>
        

    рд░рд┐рдЯрд░реНрди рдорд╛рди

    рдЬрдм рдЖрдк useLocale hook рдХреЛ invoke рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд properties рд╡рд╛рд▓реА рдПрдХ object return рдХрд░рддрд╛ рд╣реИ:

    • locale: рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп рдЬреЛ React рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
    • defaultLocale: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рд╛рдердорд┐рдХ рд╕реНрдерд╛рдиреАрдпред
    • availableLocales: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕реНрдерд╛рдиреАрдпрдпреЛрдВ рдХреА рд╕реВрдЪреАред
    • setLocale: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд╛рдиреАрдп рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ URL рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдирд┐рдпрдореЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ, рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдХреЛ рдкрде рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреИрд╕реЗ push рдФрд░ refresh рдХреЗ рд▓рд┐рдП next/navigation рд╕реЗ useRouter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
    • pathWithoutLocale: рдПрдХ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рдХреЗ рдмрд┐рдирд╛ рдкрде рд▓реМрдЯрд╛рддреА рд╣реИред рдпрд╣ URL рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп fr рд╣реИ, рдФрд░ URL fr/my_path рд╣реИ, рддреЛ рд╕реНрдерд╛рдиреАрдп рдХреЗ рдмрд┐рдирд╛ рдкрде /my_path рд╣реЛрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП next/navigation рд╕реЗ usePathname рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

    рдирд┐рд╖реНрдХрд░реНрд╖

    next-intlayer рд╕реЗ useLocale рд╣реБрдХ Next.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдХрд░рдг рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреАрдпрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреАрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдЧреНрд░рд╣рдг, рд╕реНрдерд┐рддрд┐ рдкреНрд░рдмрдВрдзрди, рдФрд░ URL рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рд╕рд╣рдЬрддрд╛ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред