@intlayer/docs 7.3.5 → 7.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/en/compiler_vs_declarative_i18n.md +2 -0
- package/docs/ar/intlayer_with_tanstack.md +39 -40
- package/docs/de/intlayer_with_tanstack.md +39 -40
- package/docs/en/intlayer_with_tanstack.md +43 -43
- package/docs/en-GB/intlayer_with_tanstack.md +39 -40
- package/docs/es/intlayer_with_tanstack.md +39 -40
- package/docs/fr/intlayer_with_tanstack.md +39 -40
- package/docs/hi/intlayer_with_tanstack.md +39 -40
- package/docs/id/intlayer_with_tanstack.md +39 -40
- package/docs/it/intlayer_with_tanstack.md +39 -40
- package/docs/ja/intlayer_with_tanstack.md +39 -40
- package/docs/ko/intlayer_with_tanstack.md +39 -40
- package/docs/pl/intlayer_with_tanstack.md +39 -40
- package/docs/pt/intlayer_with_tanstack.md +39 -40
- package/docs/ru/intlayer_with_tanstack.md +39 -40
- package/docs/tr/intlayer_with_tanstack.md +40 -41
- package/docs/vi/intlayer_with_tanstack.md +39 -40
- package/docs/zh/intlayer_with_tanstack.md +42 -43
- package/package.json +6 -6
|
@@ -134,7 +134,7 @@ Configure seu layout raiz e layouts específicos para cada localidade:
|
|
|
134
134
|
#### Layout Raiz
|
|
135
135
|
|
|
136
136
|
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
137
|
-
import { createFileRoute,
|
|
137
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
138
138
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
139
139
|
|
|
140
140
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -391,16 +391,16 @@ import {
|
|
|
391
391
|
getLocaleName,
|
|
392
392
|
getPathWithoutLocale,
|
|
393
393
|
getPrefix,
|
|
394
|
+
Locales,
|
|
394
395
|
} from "intlayer";
|
|
395
|
-
import {
|
|
396
|
+
import { useLocale } from "react-intlayer";
|
|
396
397
|
|
|
397
398
|
import { LocalizedLink, To } from "./localized-link";
|
|
398
399
|
|
|
399
400
|
export const LocaleSwitcher: FC = () => {
|
|
400
|
-
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
401
401
|
const { pathname } = useLocation();
|
|
402
402
|
|
|
403
|
-
const { availableLocales, locale } = useLocale();
|
|
403
|
+
const { availableLocales, locale, setLocale } = useLocale();
|
|
404
404
|
|
|
405
405
|
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
406
406
|
|
|
@@ -410,25 +410,24 @@ export const LocaleSwitcher: FC = () => {
|
|
|
410
410
|
<li key={localeEl}>
|
|
411
411
|
<LocalizedLink
|
|
412
412
|
aria-current={localeEl === locale ? "page" : undefined}
|
|
413
|
-
|
|
414
|
-
onClick={() => setLocaleInStorage(localeEl)}
|
|
413
|
+
onClick={() => setLocale(localeEl)}
|
|
415
414
|
params={{ locale: getPrefix(localeEl).localePrefix }}
|
|
416
415
|
>
|
|
417
416
|
<span>
|
|
418
417
|
{/* Local - ex. FR */}
|
|
419
|
-
{
|
|
418
|
+
{localeEl}
|
|
420
419
|
</span>
|
|
421
420
|
<span>
|
|
422
421
|
{/* Idioma na sua própria Localização - ex. Français */}
|
|
423
|
-
{getLocaleName(
|
|
422
|
+
{getLocaleName(localeEl, locale)}
|
|
424
423
|
</span>
|
|
425
|
-
<span dir={getHTMLTextDir(
|
|
424
|
+
<span dir={getHTMLTextDir(localeEl)} lang={localeEl}>
|
|
426
425
|
{/* Idioma na Localização atual - ex. Francés com a localização atual definida para Locales.SPANISH */}
|
|
427
|
-
{getLocaleName(
|
|
426
|
+
{getLocaleName(localeEl)}
|
|
428
427
|
</span>
|
|
429
428
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
430
429
|
{/* Idioma em Inglês - ex. French */}
|
|
431
|
-
{getLocaleName(
|
|
430
|
+
{getLocaleName(localeEl, Locales.ENGLISH)}
|
|
432
431
|
</span>
|
|
433
432
|
</LocalizedLink>
|
|
434
433
|
</li>
|
|
@@ -463,7 +462,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
463
462
|
Então use-o no seu componente raiz:
|
|
464
463
|
|
|
465
464
|
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
466
|
-
import { createFileRoute,
|
|
465
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
467
466
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
468
467
|
|
|
469
468
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // importar o hook
|
|
@@ -503,18 +502,44 @@ import tsconfigPaths from "vite-tsconfig-paths";
|
|
|
503
502
|
|
|
504
503
|
export default defineConfig({
|
|
505
504
|
plugins: [
|
|
505
|
+
intlayerProxy(), // O proxy deve ser colocado antes do servidor se você usar Nitro
|
|
506
506
|
tailwindcss(),
|
|
507
507
|
reactRouter(),
|
|
508
508
|
tsconfigPaths(),
|
|
509
509
|
intlayer(),
|
|
510
|
-
intlayerProxy(),
|
|
511
510
|
],
|
|
512
511
|
});
|
|
513
512
|
```
|
|
514
513
|
|
|
515
514
|
---
|
|
516
515
|
|
|
517
|
-
### Passo 12:
|
|
516
|
+
### Passo 12: Internacionalizar seus Metadados (Opcional)
|
|
517
|
+
|
|
518
|
+
Você também pode usar o hook `getIntlayer` para acessar seus dicionários de conteúdo em toda a sua aplicação:
|
|
519
|
+
|
|
520
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
521
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
522
|
+
import { getIntlayer } from "intlayer";
|
|
523
|
+
|
|
524
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
525
|
+
component: RouteComponent,
|
|
526
|
+
head: ({ params }) => {
|
|
527
|
+
const { locale } = params;
|
|
528
|
+
const metaContent = getIntlayer("page-metadata", locale);
|
|
529
|
+
|
|
530
|
+
return {
|
|
531
|
+
meta: [
|
|
532
|
+
{ title: metaContent.title },
|
|
533
|
+
{ content: metaContent.description, name: "description" },
|
|
534
|
+
],
|
|
535
|
+
};
|
|
536
|
+
},
|
|
537
|
+
});
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
### Passo 13: Configurar o TypeScript (Opcional)
|
|
518
543
|
|
|
519
544
|
O Intlayer utiliza a ampliação de módulos para aproveitar os benefícios do TypeScript e fortalecer sua base de código.
|
|
520
545
|
|
|
@@ -532,32 +557,6 @@ Certifique-se de que sua configuração do TypeScript inclua os tipos gerados au
|
|
|
532
557
|
|
|
533
558
|
---
|
|
534
559
|
|
|
535
|
-
### Passo 13: Adaptar Nitro (Opcional)
|
|
536
|
-
|
|
537
|
-
Se você estiver usando Nitro para sua saída de produção, o nitro não incluirá o diretório `.intlayer` no diretório de saída. Você precisa copiá-lo manualmente.
|
|
538
|
-
|
|
539
|
-
Exemplo usando script de build:
|
|
540
|
-
|
|
541
|
-
```json5 fileName="package.json"
|
|
542
|
-
{
|
|
543
|
-
"scripts": {
|
|
544
|
-
"dev": "vite dev --port 3000",
|
|
545
|
-
"build": "vite build && cpr .intlayer .output/.intlayer", // Copiar pasta .intlayer
|
|
546
|
-
"serve": "vite preview",
|
|
547
|
-
},
|
|
548
|
-
}
|
|
549
|
-
```
|
|
550
|
-
|
|
551
|
-
> cpr é usado para adaptar o comando para fazê-lo funcionar no Windows.
|
|
552
|
-
> Você terá que instalar o utilitário `cpr` para usar este comando.
|
|
553
|
-
>
|
|
554
|
-
> - `npm install --save-dev cpr`
|
|
555
|
-
> - `yarn add --dev cpr`
|
|
556
|
-
> - `pnpm add --save-dev cpr`
|
|
557
|
-
> - `bun add --save-dev cpr`
|
|
558
|
-
|
|
559
|
-
---
|
|
560
|
-
|
|
561
560
|
### Configuração do Git
|
|
562
561
|
|
|
563
562
|
É recomendado ignorar os arquivos gerados pelo Intlayer. Isso permite evitar que eles sejam comitados no seu repositório Git.
|
|
@@ -134,7 +134,7 @@ export default config;
|
|
|
134
134
|
#### Корневой макет
|
|
135
135
|
|
|
136
136
|
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
137
|
-
import { createFileRoute,
|
|
137
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
138
138
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
139
139
|
|
|
140
140
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -381,16 +381,16 @@ import {
|
|
|
381
381
|
getLocaleName,
|
|
382
382
|
getPathWithoutLocale,
|
|
383
383
|
getPrefix,
|
|
384
|
+
Locales,
|
|
384
385
|
} from "intlayer";
|
|
385
|
-
import {
|
|
386
|
+
import { useLocale } from "react-intlayer";
|
|
386
387
|
|
|
387
388
|
import { LocalizedLink, To } from "./localized-link";
|
|
388
389
|
|
|
389
390
|
export const LocaleSwitcher: FC = () => {
|
|
390
|
-
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
391
391
|
const { pathname } = useLocation();
|
|
392
392
|
|
|
393
|
-
const { availableLocales, locale } = useLocale();
|
|
393
|
+
const { availableLocales, locale, setLocale } = useLocale();
|
|
394
394
|
|
|
395
395
|
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
396
396
|
|
|
@@ -400,25 +400,24 @@ export const LocaleSwitcher: FC = () => {
|
|
|
400
400
|
<li key={localeEl}>
|
|
401
401
|
<LocalizedLink
|
|
402
402
|
aria-current={localeEl === locale ? "page" : undefined}
|
|
403
|
-
|
|
404
|
-
onClick={() => setLocaleInStorage(localeEl)}
|
|
403
|
+
onClick={() => setLocale(localeEl)}
|
|
405
404
|
params={{ locale: getPrefix(localeEl).localePrefix }}
|
|
406
405
|
>
|
|
407
406
|
<span>
|
|
408
407
|
{/* Локаль - например, FR */}
|
|
409
|
-
{
|
|
408
|
+
{localeEl}
|
|
410
409
|
</span>
|
|
411
410
|
<span>
|
|
412
411
|
{/* Язык на его собственной локали - например, Français */}
|
|
413
|
-
{getLocaleName(
|
|
412
|
+
{getLocaleName(localeEl, locale)}
|
|
414
413
|
</span>
|
|
415
|
-
<span dir={getHTMLTextDir(
|
|
414
|
+
<span dir={getHTMLTextDir(localeEl)} lang={localeEl}>
|
|
416
415
|
{/* Язык на текущей локали - например, Francés при установленной локали Locales.SPANISH */}
|
|
417
|
-
{getLocaleName(
|
|
416
|
+
{getLocaleName(localeEl)}
|
|
418
417
|
</span>
|
|
419
418
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
420
419
|
{/* Язык на английском - например, French */}
|
|
421
|
-
{getLocaleName(
|
|
420
|
+
{getLocaleName(localeEl, Locales.ENGLISH)}
|
|
422
421
|
</span>
|
|
423
422
|
</LocalizedLink>
|
|
424
423
|
</li>
|
|
@@ -453,7 +452,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
453
452
|
Затем используйте его в вашем корневом компоненте:
|
|
454
453
|
|
|
455
454
|
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
456
|
-
import { createFileRoute,
|
|
455
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
457
456
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
458
457
|
|
|
459
458
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // импортируем хук
|
|
@@ -493,18 +492,44 @@ import tsconfigPaths from "vite-tsconfig-paths";
|
|
|
493
492
|
|
|
494
493
|
export default defineConfig({
|
|
495
494
|
plugins: [
|
|
495
|
+
intlayerProxy(), // Прокси должен быть размещен перед сервером, если вы используете Nitro
|
|
496
496
|
tailwindcss(),
|
|
497
497
|
reactRouter(),
|
|
498
498
|
tsconfigPaths(),
|
|
499
499
|
intlayer(),
|
|
500
|
-
intlayerProxy(),
|
|
501
500
|
],
|
|
502
501
|
});
|
|
503
502
|
```
|
|
504
503
|
|
|
505
504
|
---
|
|
506
505
|
|
|
507
|
-
### Шаг 12:
|
|
506
|
+
### Шаг 12: Интернационализация метаданных (необязательно)
|
|
507
|
+
|
|
508
|
+
Вы также можете использовать хук `getIntlayer` для доступа к вашим словарям контента во всем приложении:
|
|
509
|
+
|
|
510
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
511
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
512
|
+
import { getIntlayer } from "intlayer";
|
|
513
|
+
|
|
514
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
515
|
+
component: RouteComponent,
|
|
516
|
+
head: ({ params }) => {
|
|
517
|
+
const { locale } = params;
|
|
518
|
+
const metaContent = getIntlayer("page-metadata", locale);
|
|
519
|
+
|
|
520
|
+
return {
|
|
521
|
+
meta: [
|
|
522
|
+
{ title: metaContent.title },
|
|
523
|
+
{ content: metaContent.description, name: "description" },
|
|
524
|
+
],
|
|
525
|
+
};
|
|
526
|
+
},
|
|
527
|
+
});
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
### Шаг 13: Настройка TypeScript (необязательно)
|
|
508
533
|
|
|
509
534
|
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать вашу кодовую базу более надежной.
|
|
510
535
|
|
|
@@ -522,32 +547,6 @@ Intlayer использует расширение модулей (module augmen
|
|
|
522
547
|
|
|
523
548
|
---
|
|
524
549
|
|
|
525
|
-
### Шаг 13: Адаптация Nitro (необязательно)
|
|
526
|
-
|
|
527
|
-
Если вы используете Nitro для вашего производственного вывода, nitro не будет включать директорию `.intlayer` в выходную директорию. Вам нужно скопировать её вручную.
|
|
528
|
-
|
|
529
|
-
Пример с использованием скрипта сборки:
|
|
530
|
-
|
|
531
|
-
```json5 fileName="package.json"
|
|
532
|
-
{
|
|
533
|
-
"scripts": {
|
|
534
|
-
"dev": "vite dev --port 3000",
|
|
535
|
-
"build": "vite build && cpr .intlayer .output/.intlayer", // Копировать папку .intlayer
|
|
536
|
-
"serve": "vite preview",
|
|
537
|
-
},
|
|
538
|
-
}
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
> cpr используется для адаптации команды, чтобы она работала в Windows.
|
|
542
|
-
> Вам потребуется установить утилиту `cpr` для использования этой команды.
|
|
543
|
-
>
|
|
544
|
-
> - `npm install --save-dev cpr`
|
|
545
|
-
> - `yarn add --dev cpr`
|
|
546
|
-
> - `pnpm add --save-dev cpr`
|
|
547
|
-
> - `bun add --save-dev cpr`
|
|
548
|
-
|
|
549
|
-
---
|
|
550
|
-
|
|
551
550
|
### Конфигурация Git
|
|
552
551
|
|
|
553
552
|
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш Git-репозиторий.
|
|
@@ -137,7 +137,7 @@ Kök düzeninizi ve yerel dile özgü düzenlerinizi ayarlayın:
|
|
|
137
137
|
#### Kök Düzen
|
|
138
138
|
|
|
139
139
|
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
140
|
-
import { createFileRoute,
|
|
140
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
141
141
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
142
142
|
|
|
143
143
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -394,16 +394,16 @@ import {
|
|
|
394
394
|
getLocaleName,
|
|
395
395
|
getPathWithoutLocale,
|
|
396
396
|
getPrefix,
|
|
397
|
+
Locales,
|
|
397
398
|
} from "intlayer";
|
|
398
|
-
import {
|
|
399
|
+
import { useLocale } from "react-intlayer";
|
|
399
400
|
|
|
400
401
|
import { LocalizedLink, To } from "./localized-link";
|
|
401
402
|
|
|
402
403
|
export const LocaleSwitcher: FC = () => {
|
|
403
|
-
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
404
404
|
const { pathname } = useLocation();
|
|
405
405
|
|
|
406
|
-
const { availableLocales, locale } = useLocale();
|
|
406
|
+
const { availableLocales, locale, setLocale } = useLocale();
|
|
407
407
|
|
|
408
408
|
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
409
409
|
|
|
@@ -412,26 +412,25 @@ export const LocaleSwitcher: FC = () => {
|
|
|
412
412
|
{availableLocales.map((localeEl) => (
|
|
413
413
|
<li key={localeEl}>
|
|
414
414
|
<LocalizedLink
|
|
415
|
-
aria-current={localeEl === locale ? "
|
|
416
|
-
|
|
417
|
-
onClick={() => setLocaleInStorage(localeEl)}
|
|
415
|
+
aria-current={localeEl === locale ? "page" : undefined}
|
|
416
|
+
onClick={() => setLocale(localeEl)}
|
|
418
417
|
params={{ locale: getPrefix(localeEl).localePrefix }}
|
|
419
418
|
>
|
|
420
419
|
<span>
|
|
421
420
|
{/* Dil Kodu - örn. FR */}
|
|
422
|
-
{
|
|
421
|
+
{localeEl}
|
|
423
422
|
</span>
|
|
424
423
|
<span>
|
|
425
424
|
{/* Dil kendi yerelinde - örn. Français */}
|
|
426
|
-
{getLocaleName(
|
|
425
|
+
{getLocaleName(localeEl, locale)}
|
|
427
426
|
</span>
|
|
428
|
-
<span dir={getHTMLTextDir(
|
|
427
|
+
<span dir={getHTMLTextDir(localeEl)} lang={localeEl}>
|
|
429
428
|
{/* Dil mevcut yerelde - örn. Francés, mevcut yerel Locales.SPANISH olarak ayarlanmış */}
|
|
430
|
-
{getLocaleName(
|
|
429
|
+
{getLocaleName(localeEl)}
|
|
431
430
|
</span>
|
|
432
431
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
433
432
|
{/* Dil İngilizce olarak - örn. French */}
|
|
434
|
-
{getLocaleName(
|
|
433
|
+
{getLocaleName(localeEl, Locales.ENGLISH)}
|
|
435
434
|
</span>
|
|
436
435
|
</LocalizedLink>
|
|
437
436
|
</li>
|
|
@@ -466,7 +465,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
466
465
|
Sonra bunu kök bileşeninizde kullanın:
|
|
467
466
|
|
|
468
467
|
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
469
|
-
import { createFileRoute,
|
|
468
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
470
469
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
471
470
|
|
|
472
471
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // hook'u içe aktar
|
|
@@ -506,18 +505,44 @@ import tsconfigPaths from "vite-tsconfig-paths";
|
|
|
506
505
|
|
|
507
506
|
export default defineConfig({
|
|
508
507
|
plugins: [
|
|
508
|
+
intlayerProxy(), // Nitro kullanıyorsanız, proxy sunucudan önce yerleştirilmelidir
|
|
509
509
|
tailwindcss(),
|
|
510
510
|
reactRouter(),
|
|
511
511
|
tsconfigPaths(),
|
|
512
512
|
intlayer(),
|
|
513
|
-
intlayerProxy(),
|
|
514
513
|
],
|
|
515
514
|
});
|
|
516
515
|
```
|
|
517
516
|
|
|
518
517
|
---
|
|
519
518
|
|
|
520
|
-
### Adım 12:
|
|
519
|
+
### Adım 12: Meta Verilerinizi Uluslararasılaştırın (İsteğe Bağlı)
|
|
520
|
+
|
|
521
|
+
Uygulamanız genelinde içerik sözlüklerinize erişmek için `getIntlayer` hook'unu da kullanabilirsiniz:
|
|
522
|
+
|
|
523
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
524
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
525
|
+
import { getIntlayer } from "intlayer";
|
|
526
|
+
|
|
527
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
528
|
+
component: RouteComponent,
|
|
529
|
+
head: ({ params }) => {
|
|
530
|
+
const { locale } = params;
|
|
531
|
+
const metaContent = getIntlayer("page-metadata", locale);
|
|
532
|
+
|
|
533
|
+
return {
|
|
534
|
+
meta: [
|
|
535
|
+
{ title: metaContent.title },
|
|
536
|
+
{ content: metaContent.description, name: "description" },
|
|
537
|
+
],
|
|
538
|
+
};
|
|
539
|
+
},
|
|
540
|
+
});
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
### Adım 13: TypeScript Yapılandırması (İsteğe Bağlı)
|
|
521
546
|
|
|
522
547
|
Intlayer, TypeScript'in avantajlarından yararlanmak ve kod tabanınızı daha güçlü hale getirmek için modül genişletme (module augmentation) kullanır.
|
|
523
548
|
|
|
@@ -535,32 +560,6 @@ TypeScript yapılandırmanızın otomatik oluşturulan türleri içerdiğinden e
|
|
|
535
560
|
|
|
536
561
|
---
|
|
537
562
|
|
|
538
|
-
### Adım 13: Nitro'yu Uyarlama (İsteğe Bağlı)
|
|
539
|
-
|
|
540
|
-
Üretim çıktınız için Nitro kullanıyorsanız, nitro çıktı dizinine `.intlayer` dizinini dahil etmeyecektir. Manuel olarak kopyalamanız gerekir.
|
|
541
|
-
|
|
542
|
-
Build script kullanarak örnek:
|
|
543
|
-
|
|
544
|
-
```json5 fileName="package.json"
|
|
545
|
-
{
|
|
546
|
-
"scripts": {
|
|
547
|
-
"dev": "vite dev --port 3000",
|
|
548
|
-
"build": "vite build && cpr .intlayer .output/.intlayer", // .intlayer klasörünü kopyala
|
|
549
|
-
"serve": "vite preview",
|
|
550
|
-
},
|
|
551
|
-
}
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
> cpr, komutu Windows'ta çalışır hale getirmek için kullanılır.
|
|
555
|
-
> Bu komutu kullanmak için `cpr` yardımcı programını yüklemeniz gerekir.
|
|
556
|
-
>
|
|
557
|
-
> - `npm install --save-dev cpr`
|
|
558
|
-
> - `yarn add --dev cpr`
|
|
559
|
-
> - `pnpm add --save-dev cpr`
|
|
560
|
-
> - `bun add --save-dev cpr`
|
|
561
|
-
|
|
562
|
-
---
|
|
563
|
-
|
|
564
563
|
### Git Yapılandırması
|
|
565
564
|
|
|
566
565
|
Intlayer tarafından oluşturulan dosyaların göz ardı edilmesi önerilir. Bu, bu dosyaların Git deposuna eklenmesini önlemenizi sağlar.
|
|
@@ -145,7 +145,7 @@ Thiết lập layout gốc của bạn và các layout theo ngôn ngữ cụ th
|
|
|
145
145
|
#### Layout Gốc
|
|
146
146
|
|
|
147
147
|
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
148
|
-
import { createFileRoute,
|
|
148
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
149
149
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
150
150
|
|
|
151
151
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -400,16 +400,16 @@ import {
|
|
|
400
400
|
getLocaleName,
|
|
401
401
|
getPathWithoutLocale,
|
|
402
402
|
getPrefix,
|
|
403
|
+
Locales,
|
|
403
404
|
} from "intlayer";
|
|
404
|
-
import {
|
|
405
|
+
import { useLocale } from "react-intlayer";
|
|
405
406
|
|
|
406
407
|
import { LocalizedLink, To } from "./localized-link";
|
|
407
408
|
|
|
408
409
|
export const LocaleSwitcher: FC = () => {
|
|
409
|
-
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
410
410
|
const { pathname } = useLocation();
|
|
411
411
|
|
|
412
|
-
const { availableLocales, locale } = useLocale();
|
|
412
|
+
const { availableLocales, locale, setLocale } = useLocale();
|
|
413
413
|
|
|
414
414
|
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
415
415
|
|
|
@@ -419,25 +419,24 @@ export const LocaleSwitcher: FC = () => {
|
|
|
419
419
|
<li key={localeEl}>
|
|
420
420
|
<LocalizedLink
|
|
421
421
|
aria-current={localeEl === locale ? "page" : undefined}
|
|
422
|
-
|
|
423
|
-
onClick={() => setLocaleInStorage(localeEl)}
|
|
422
|
+
onClick={() => setLocale(localeEl)}
|
|
424
423
|
params={{ locale: getPrefix(localeEl).localePrefix }}
|
|
425
424
|
>
|
|
426
425
|
<span>
|
|
427
426
|
{/* Mã ngôn ngữ - ví dụ: FR */}
|
|
428
|
-
{
|
|
427
|
+
{localeEl}
|
|
429
428
|
</span>
|
|
430
429
|
<span>
|
|
431
430
|
{/* Ngôn ngữ theo mã ngôn ngữ của chính nó - ví dụ: Français */}
|
|
432
|
-
{getLocaleName(
|
|
431
|
+
{getLocaleName(localeEl, locale)}
|
|
433
432
|
</span>
|
|
434
|
-
<span dir={getHTMLTextDir(
|
|
433
|
+
<span dir={getHTMLTextDir(localeEl)} lang={localeEl}>
|
|
435
434
|
{/* Ngôn ngữ theo mã ngôn ngữ hiện tại - ví dụ: Francés khi mã ngôn ngữ hiện tại là Locales.SPANISH */}
|
|
436
|
-
{getLocaleName(
|
|
435
|
+
{getLocaleName(localeEl)}
|
|
437
436
|
</span>
|
|
438
437
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
439
438
|
{/* Ngôn ngữ bằng tiếng Anh - ví dụ: French */}
|
|
440
|
-
{getLocaleName(
|
|
439
|
+
{getLocaleName(localeEl, Locales.ENGLISH)}
|
|
441
440
|
</span>
|
|
442
441
|
</LocalizedLink>
|
|
443
442
|
</li>
|
|
@@ -472,7 +471,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
472
471
|
Sau đó sử dụng nó trong component gốc của bạn:
|
|
473
472
|
|
|
474
473
|
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
475
|
-
import { createFileRoute,
|
|
474
|
+
import { createFileRoute, Outlet } from "@tanstack/react-router";
|
|
476
475
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
477
476
|
|
|
478
477
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // nhập hook
|
|
@@ -512,18 +511,44 @@ import tsconfigPaths from "vite-tsconfig-paths";
|
|
|
512
511
|
|
|
513
512
|
export default defineConfig({
|
|
514
513
|
plugins: [
|
|
514
|
+
intlayerProxy(), // Proxy nên được đặt trước server nếu bạn sử dụng Nitro
|
|
515
515
|
tailwindcss(),
|
|
516
516
|
reactRouter(),
|
|
517
517
|
tsconfigPaths(),
|
|
518
518
|
intlayer(),
|
|
519
|
-
intlayerProxy(),
|
|
520
519
|
],
|
|
521
520
|
});
|
|
522
521
|
```
|
|
523
522
|
|
|
524
523
|
---
|
|
525
524
|
|
|
526
|
-
### Bước 12:
|
|
525
|
+
### Bước 12: Quốc tế hóa siêu dữ liệu của bạn (Tùy chọn)
|
|
526
|
+
|
|
527
|
+
Bạn cũng có thể sử dụng hook `getIntlayer` để truy cập các từ điển nội dung của bạn trong toàn bộ ứng dụng:
|
|
528
|
+
|
|
529
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
530
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
531
|
+
import { getIntlayer } from "intlayer";
|
|
532
|
+
|
|
533
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
534
|
+
component: RouteComponent,
|
|
535
|
+
head: ({ params }) => {
|
|
536
|
+
const { locale } = params;
|
|
537
|
+
const metaContent = getIntlayer("page-metadata", locale);
|
|
538
|
+
|
|
539
|
+
return {
|
|
540
|
+
meta: [
|
|
541
|
+
{ title: metaContent.title },
|
|
542
|
+
{ content: metaContent.description, name: "description" },
|
|
543
|
+
],
|
|
544
|
+
};
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
### Bước 13: Cấu hình TypeScript (Tùy chọn)
|
|
527
552
|
|
|
528
553
|
Intlayer sử dụng module augmentation để tận dụng các lợi ích của TypeScript và làm cho codebase của bạn mạnh mẽ hơn.
|
|
529
554
|
|
|
@@ -541,32 +566,6 @@ Intlayer sử dụng module augmentation để tận dụng các lợi ích củ
|
|
|
541
566
|
|
|
542
567
|
---
|
|
543
568
|
|
|
544
|
-
### Bước 13: Điều chỉnh Nitro (Tùy chọn)
|
|
545
|
-
|
|
546
|
-
Nếu bạn đang sử dụng Nitro cho đầu ra sản xuất của mình, nitro sẽ không bao gồm thư mục `.intlayer` trong thư mục đầu ra. Bạn cần sao chép nó thủ công.
|
|
547
|
-
|
|
548
|
-
Ví dụ sử dụng script build:
|
|
549
|
-
|
|
550
|
-
```json5 fileName="package.json"
|
|
551
|
-
{
|
|
552
|
-
"scripts": {
|
|
553
|
-
"dev": "vite dev --port 3000",
|
|
554
|
-
"build": "vite build && cpr .intlayer .output/.intlayer", // Sao chép thư mục .intlayer
|
|
555
|
-
"serve": "vite preview",
|
|
556
|
-
},
|
|
557
|
-
}
|
|
558
|
-
```
|
|
559
|
-
|
|
560
|
-
> cpr được sử dụng để điều chỉnh lệnh để làm cho nó hoạt động trên Windows.
|
|
561
|
-
> Bạn sẽ phải cài đặt tiện ích `cpr` để sử dụng lệnh này.
|
|
562
|
-
>
|
|
563
|
-
> - `npm install --save-dev cpr`
|
|
564
|
-
> - `yarn add --dev cpr`
|
|
565
|
-
> - `pnpm add --save-dev cpr`
|
|
566
|
-
> - `bun add --save-dev cpr`
|
|
567
|
-
|
|
568
|
-
---
|
|
569
|
-
|
|
570
569
|
### Cấu hình Git
|
|
571
570
|
|
|
572
571
|
Khuyến nghị bạn nên bỏ qua các file được tạo bởi Intlayer. Điều này giúp bạn tránh việc commit chúng vào kho Git của mình.
|