Автор:
    БозданиС:2026-09-02ПослСднСС обновлСниС:2026-09-02

    Как Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π±Π΅Π· создания Ρ…Ρ€ΡƒΠΏΠΊΠΈΡ… тСстов

    Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π°Π±ΠΎΡ€ΠΎΠ² тСстов i18n Π»ΠΎΠΌΠ°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½. Π›ΠΈΠ±ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ любая смСна Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΠΏΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚ тСстов ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡ… удаляСт. Π›ΠΈΠ±ΠΎ ΠΎΠ½ΠΈ рСндСрят всё Π² Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ провСряя для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… сСмнадцати языков. Оба ΠΏΡƒΡ‚ΠΈ Π²Π΅Π΄ΡƒΡ‚ Π² ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π½Π°Π±ΠΎΡ€Ρƒ тСстов ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ.

    Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

    ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π½Π΅ зависят ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

    ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° любом стСкС i18n. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Π½Π° I18nextProvider, NextIntlClientProvider ΠΈΠ»ΠΈ IntlProvider, ΠΈ тСсты останутся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄, Π° Π½Π΅ API ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

    Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ покрытия Ρ‚Π°ΠΊΠΆΠ΅ пСрСносимы: с ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Sync JSON, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ Π½Π° ваши ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΈΠ»ΠΈ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠΌ совмСстимости, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΌ псСвдонимы для Π²Π°ΡˆΠΈΡ… Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° покрытия выполняСтся прямо ΠΏΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ JSON.

    ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ тСстируСтС

    ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π΅ провСряСтся тСстами ΠΊΠΎΠ΄Π°. Никакой ассСрт Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚, Π·Π²ΡƒΡ‡ΠΈΡ‚ Π»ΠΈ Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΈΠΉ язык СстСствСнно, ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это лишь Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ тСсты Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ строками.

    ΠœΠ΅Ρ…Π°Π½ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ стоит Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

    Π‘Ρ‚ΠΎΠΈΡ‚ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΠΠ΅ стоит Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
    КаТдая ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ локаль ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠšΡ€Π°ΡΠΎΡ‚Ρƒ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΎΠΊ
    ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ локаль пСрСдаСтся Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π’ΠΎΡ‡Π½Ρ‹ΠΉ тСкст ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π»Π΅ΠΉΠ±Π»Π°
    Π€ΠΎΡ€ΠΌΡ‹ мноТСствСнного числа для ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉΠΠ°ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ Π±Ρ‹Π» ΠΏΡ€ΠΈΠ»Π΅ΠΆΠ΅Π½
    RTL-Π»ΠΎΠΊΠ°Π»ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΠšΠ°ΠΆΠ΄ΡƒΡŽ строку Π²ΠΎ всСх языках
    Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Ρ‚Ρ‹ ΠΈ числа ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Intl

    ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° покрытия Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ тСстС Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹Ρ… тСстах. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΊΠ°ΠΊ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹; Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» посвящСн ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ аспСктам.

    Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° ΠΈ поиск ΠΏΠΎ ролям

    Основной ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ элСмСнты ΠΏΠΎ Ρ€ΠΎΠ»ΠΈ ΠΈΠ»ΠΈ test-id, Π° Π½Π΅ ΠΏΠΎ тСксту.

    CartSummary.test.tsx
    import { render, screen } from "@testing-library/react";
    import { IntlayerProvider } from "react-intlayer/client";
    import { CartSummary } from "./CartSummary";
    
    test("Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ сводки Π½Π° французском", () => {
      render(
        <IntlayerProvider locale="fr-FR">
          <CartSummary />
        </IntlayerProvider>
      );
    
      expect(screen.getByRole("heading")).toBeInTheDocument();
    });
    

    Поиск getByRole("heading") устойчив ΠΊ измСнСниям тСкста. getByText("RΓ©capitulatif") сломаСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΊΠ΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ тСкст Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° сама строка являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π΄ΠΊΠΎ.

    Для Ρ‚Π°ΠΊΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠ°ΠΊ aria-label, Π²Π°ΠΌ понадобится нСобработанная строка, Π° Π½Π΅ React-ΡƒΠ·Π΅Π». Π’ React записи useIntlayer ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΠΎΠ»Π΅ .value для этой Ρ†Π΅Π»ΠΈ.

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΡƒΠΉΡ‚Π΅ тСсты ΠΏΠΎ локалям

    Один ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ тСст, запускаСмый для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ, Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π΅Π΅ дСсятка ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… тСстов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка.

    direction.test.tsx
    import { getHTMLTextDir } from "intlayer";
    import { render } from "@testing-library/react";
    import { IntlayerProvider } from "react-intlayer/client";
    
    describe.each(["en", "fr", "ja", "ar"])("локаль %s", (locale) => {
      it("рСндСрится Π±Π΅Π· ΠΎΡ‚ΠΊΠ°Ρ‚Π° ΠΊ ΠΊΠ»ΡŽΡ‡Ρƒ", () => {
        const { container } = render(
          <IntlayerProvider locale={locale}>
            <CartSummary />
          </IntlayerProvider>
        );
    
        // Если отрСндСрился ΠΊΠ»ΡŽΡ‡, Π·Π½Π°Ρ‡ΠΈΡ‚ поиск Π½Π΅ удался.
        expect(container.textContent).not.toMatch(/^[a-z]+(\.[a-z]+)+$/);
      });
    
      it("устанавливаСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ тСкста", () => {
        expect(getHTMLTextDir(locale)).toBe(locale === "ar" ? "rtl" : "ltr");
      });
    });
    

    ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Ссли поиск значСния Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Ρ‹Π²Π΅Π»Π° ΠΊΠ»ΡŽΡ‡, Π² DOM окаТСтся строка Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° cart.summary.title. Π­Ρ‚ΠΎ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Ρ†Π΅Π»Ρ‹ΠΉ класс ошибок Π±Π΅Π· привязки ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ„Ρ€Π°Π·Π°ΠΌ.

    ΠŸΡΠ΅Π²Π΄ΠΎΠ»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ скрыто ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

    Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ локаль, которая видоизмСняСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прСвращая Checkout Π² [!!! Γ‡Δ₯éçķâũţ !!!]. Π—Π°Ρ‚Π΅ΠΌ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚Π΅ страницу Π½Π° этом языкС.

    Всё, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ английском, Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½ΠΎ Π² ΠΊΠΎΠ΄Π΅. Никакой Π°ΡƒΠ΄ΠΈΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² этого Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для инструмСнтов этой строки просто Π½Π΅ сущСствуСт. Π‘ΠΊΠΎΠ±ΠΊΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ: ΠΎΠ½ΠΈ ΡƒΠ΄Π»ΠΈΠ½ΡΡŽΡ‚ тСкст ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 30 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ², выявляя пСрСполнСния вСрстки Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ проявятся Π½Π° Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΎΠΌ.

    Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ end-to-end ΠΏΡ€ΠΎΠ³ΠΎΠ½Π°, Π° Π½Π΅ ΡŽΠ½ΠΈΡ‚-тСста, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π΅Ρ„Π΅ΠΊΡ‚Ρ‹ Π²ΠΈΠ΄Π½Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ.

    Для мноТСствСнных чисСл Π½ΡƒΠΆΠ΅Π½ тСст Π½Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ, Π° Π½Π΅ Π½Π° язык

    Ошибки ΠΏΠ»ΡŽΡ€Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ часто ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² английском языкС всСго Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ…. Π’ польском языкС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΠΎΡ€ΠΌΡ‹, Π² арабском ΡˆΠ΅ΡΡ‚ΡŒ.

    plural.test.ts
    // Арабский провСряСт zero, one, two, few, many, other.
    describe.each([0, 1, 2, 3, 11, 100])("число %i", (count) => {
      it("Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π½Π° арабском", () => {
        expect(formatItems(count, "ar")).not.toBe("");
      });
    });
    

    Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ значСния, ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΎ всС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ CLDR для самого слоТного языка, вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 ΠΈ 2. Intl.PluralRules сообщаСт, Π² ΠΊΠ°ΠΊΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ число, позволяя ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ Π±Π΅Π· угадывания. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ катСгориях Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ сообщСний ICU.

    Π›ΠΎΠ²ΡƒΡˆΠΊΠ° ΡΠ½ΡΠΏΡˆΠΎΡ‚-тСстов (Snapshots)

    Π‘Π½ΡΠΏΡˆΠΎΡ‚Ρ‹ ΠΈ i18n ΠΏΠ»ΠΎΡ…ΠΎ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ΡΡ. Π‘Π½ΡΠΏΡˆΠΎΡ‚ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° фиксируСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку: ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ исправляСт ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΡƒ Π² ΠΏΠΎΡ€Ρ‚ΡƒΠ³Π°Π»ΡŒΡΠΊΠΎΠΌ, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ тСст становится красным Π² Ρ„Π°ΠΉΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π²ΡŒΡŽΠ΅Ρ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ. ПослС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π»ΠΎΠΆΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π²ΠΎΠ³ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ запускаСт -u Π½Π΅ глядя, ΠΈ ΡΠ½ΡΠΏΡˆΠΎΡ‚Ρ‹ Ρ‚Π΅Ρ€ΡΡŽΡ‚ всякий смысл.

    Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ½ΡΠΏΡˆΠΎΡ‚Ρ‹, Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈ воспринимайтС ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½ΡƒΡŽ, Π° Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ. Всё языкозависимоС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ явными ассСртами.

    ВСстируйтС согласованиС Π»ΠΎΠΊΠ°Π»ΠΈ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³

    Бамая частая ошибка i18n Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅, Π½Π΅ отсутствиС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки. Π­Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ: URL ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° /fr/, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ считываСт navigator.language, ΠΈ ΠΎΠ½ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚.

    ВСстируйтС порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊΠ°ΠΊ Ρ‡ΠΈΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

    locale-resolution.test.ts
    it("ΠΎΡ‚Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ URL ΠΏΠ΅Ρ€Π΅Π΄ сохранСнными настройками", () => {
      expect(resolveLocale({ url: "/fr/about", stored: "de", header: "ja" })).toBe(
        "fr"
      );
    });
    
    it("откатываСтся ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° Π² URL Π½Π΅Ρ‚ прСфикса", () => {
      expect(resolveLocale({ url: "/about", stored: null, header: "ja" })).toBe(
        "ja"
      );
    });
    

    Π­Ρ‚ΠΎ самый Ρ†Π΅Π½Π½Ρ‹ΠΉ i18n-тСст, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΈ Π΅ΠΌΡƒ Π½Π΅ трСбуСтся DOM.

    Π§Ρ‚ΠΎ ΠΈ Π³Π΄Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ

    • Unit: согласованиС Π»ΠΎΠΊΠ°Π»Π΅ΠΉ, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‚Π΅Ρ€Ρ‹, ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ мноТСствСнного числа. Быстро, Π±Π΅Π· DOM.
    • Component: ΠΎΠ΄ΠΈΠ½ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ с ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠΌ Π½Π° локаль с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ отсутствия сырых ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.
    • Coverage: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ отсутствиС пропусков Π² ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… локалях.
    • Visual ΠΈΠ»ΠΈ E2E: ΠΏΡ€ΠΎΠ³ΠΎΠ½ псСвдолокализации ΠΈ страницы с RTL, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅.

    ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ запускайтС Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚. ПослСдний экономичнСС Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² Π½ΠΎΡ‡Π½Ρ‹Ρ… сборках.

    РаспространСнныС ошибки

    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ тСкста Π²ΠΎ всСх тСстах. Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° тСстов Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ мСсяцСв.
    • Π‘Π½ΡΠΏΡˆΠΎΡ‚Ρ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΈ Π»ΠΎΠΌΠ°ΡŽΡ‚ Π±ΠΈΠ»Π΄, Π° Ρ€Π΅Π²ΡŒΡŽΠ΅Ρ€Ρ‹ ΠΎΠ΄ΠΎΠ±Ρ€ΡΡŽΡ‚ измСнСния Π²ΡΠ»Π΅ΠΏΡƒΡŽ.
    • ВСстированиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ЕдинствСнная локаль, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π΅ΡΡ‚ΡŒ.
    • ВСстированиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 ΠΈ 2 для мноТСствСнного числа. ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² английском.
    • ΠœΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ i18n. Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹ тСстируСтС лишь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ваш ΠΌΠΎΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строки.
    • Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСстов согласования. Π‘Π°ΠΌΡ‹ΠΉ частый сбой Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΠΈ самый Π»Π΅Π³ΠΊΠΈΠΉ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

    ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

    ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

    Пока Π½Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ подСлится своими мыслями.

    ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ сообщСния

    ПослСдниС сообщСния