Added support for single localization
This commit is contained in:
+95
-1
@@ -154,4 +154,98 @@ Zmiana języka (URL `/en` różny od cookie) → zapis nowego wyboru (za zgodą)
|
||||
|
||||
> **Migracja ze starej nazwy:** wcześniej cookie nazywało się `ipal-locale`.
|
||||
> Po zmianie na `NEXT_LOCALE` użytkownicy ze starą cookie przejdą raz ponowną
|
||||
> negocjację (stara cookie ignorowana). Jednorazowe, bez wpływu na nowe projekty.
|
||||
> negocjację (stara cookie ignorowana). Jednorazowe, bez wpływu na nowe projekty.
|
||||
|
||||
## Strona jednojęzyczna (bez prefiksu /pl)
|
||||
|
||||
Gdy projekt ma JEDEN język, adresy nie mają prefiksu locale: `/o-nas`, nie
|
||||
`/pl/o-nas`. Plugin wykrywa to automatycznie — **jeden locale w config = tryb
|
||||
jednojęzyczny**. Helpery (buildLocalizedPath, hreflang, middleware) dostosowują
|
||||
się same:
|
||||
|
||||
- **buildLocalizedPath** → `/o-nas` (bez `/pl`), home → `/`
|
||||
- **buildHreflangAlternates** → pusto (jeden język = brak alternatyw językowych)
|
||||
- **localeMiddleware** → pass-through (brak przekierowania `/` → `/pl`, brak negocjacji)
|
||||
- **canonical** → `https://klient.pl/o-nas` (bez prefiksu)
|
||||
|
||||
### Config — jeden locale
|
||||
|
||||
```ts
|
||||
// i18n.config.ts
|
||||
export const i18nConfig = {
|
||||
locales: [{ code: 'pl', label: 'Polski' }], // JEDEN locale
|
||||
defaultLocale: 'pl',
|
||||
}
|
||||
```
|
||||
|
||||
### Struktura katalogów — BEZ [locale]
|
||||
|
||||
To kluczowa różnica. Projekt jednojęzyczny NIE ma folderu `[locale]`:
|
||||
|
||||
```
|
||||
# JEDNOJĘZYCZNY (bez [locale])
|
||||
app/(frontend)/
|
||||
layout.tsx # locale stałe z config, nie z params
|
||||
not-found.tsx
|
||||
[[...slug]]/page.tsx # /o-nas, /kontakt
|
||||
|
||||
# WIELOJĘZYCZNY (z [locale]) — dla porównania
|
||||
app/(frontend)/[locale]/
|
||||
layout.tsx # locale z params
|
||||
[[...slug]]/page.tsx # /pl/o-nas, /en/about
|
||||
```
|
||||
|
||||
### Layout jednojęzyczny — locale z config
|
||||
|
||||
```tsx
|
||||
// app/(frontend)/layout.tsx (bez [locale])
|
||||
import { i18nConfig } from '@/i18n.config'
|
||||
|
||||
export default async function Layout({ children }: { children: React.ReactNode }) {
|
||||
const locale = i18nConfig.defaultLocale // stałe, nie z params
|
||||
const settings = await getSettings(locale)
|
||||
// ...reszta jak zwykle, ale locale jest stałe
|
||||
return <html lang={locale}>...</html>
|
||||
}
|
||||
```
|
||||
|
||||
### Strony jednojęzyczne — locale z config
|
||||
|
||||
```tsx
|
||||
// app/(frontend)/[[...slug]]/page.tsx (bez [locale])
|
||||
import { i18nConfig } from '@/i18n.config'
|
||||
|
||||
export async function generateMetadata({ params }) {
|
||||
const { slug } = await params // TYLKO slug, nie locale
|
||||
const locale = i18nConfig.defaultLocale // stałe
|
||||
return pageMetadata({ payload: await getCachedPayload(), locale, slug })
|
||||
}
|
||||
|
||||
export default async function Page({ params }) {
|
||||
const { slug } = await params
|
||||
const locale = i18nConfig.defaultLocale // stałe
|
||||
const route = await resolveRoute(locale, slug ?? [], pageNum)
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
resolveRoute i inne helpery działają bez zmian — dostają stałe locale z config
|
||||
zamiast z URL. Cała różnica to: brak `[locale]` w strukturze, locale z config.
|
||||
|
||||
### Middleware/proxy — jednojęzyczny prawie go nie potrzebuje
|
||||
|
||||
Dla jednego locale middleware jest pass-through (nic nie przekierowuje). Możesz
|
||||
go pominąć albo zostawić — plugin i tak wykryje 1 locale i przepuści. Bez
|
||||
przełącznika języka (jeden język), bez cookie NEXT_LOCALE (nie ma co pamiętać).
|
||||
|
||||
### Przejście jedno- → wielojęzyczny (later)
|
||||
|
||||
Jeśli klient później doda drugi język, to PRZEBUDOWA, nie przełącznik:
|
||||
- dodaj locale do config
|
||||
- przenieś strukturę do `[locale]/`
|
||||
- layout/strony czytają locale z params
|
||||
- wróci prefiks `/pl`, `/en` + hreflang
|
||||
|
||||
Warto to przewidzieć na starcie: jeśli jest szansa na drugi język, rozważ od razu
|
||||
strukturę wielojęzyczną (z [locale]), nawet dla jednego locale — wtedy prefiks
|
||||
`/pl` jest, ale dodanie języka to tylko config, nie przebudowa struktury.
|
||||
Reference in New Issue
Block a user