Praktický návod
Jak navrhnout e-shop pro více zemí a měn
Země, jazyk a měna jsou tři různé rozměry. Modeluj je samostatně a spoj je až v konkrétním prodejním trhu.
Nejdřív stručně
Jedna lokalizace není jeden stát
Jeden stát může mít více jazyků a jeden jazyk se používá v různých zemích. Stejně tak zvolená měna nemusí být automaticky měnou doručení nebo účetní měnou firmy.
Prodejní trh proto definuj jako explicitní konfiguraci: země, povolené locale, ceníky, měny, daně, dopravy, platby a domény. Objednávka si z ní uloží neměnný snapshot.
Připrav si
Co musíš zjistit před návrhem
Nezačínej přepínačem vlajek. Sepiš skutečné obchodní rozdíly mezi trhy a vlastníka každé konfigurace.
- Seznam trhů, jazyků, domén, měn, skladů, doprav, plateb a právních entit, které prodávají.
- Pravidlo tvorby ceny: samostatný ceník, přepočet kurzem, psychologické zaokrouhlení a období platnosti.
- Obsah, který se překládá, a obsah, který se liší obchodně: sortiment, dostupnost, název, popis nebo podmínky.
- Pravidla daní a dokladů ověřená s účetními a právními odborníky pro konkrétní země; neukládej je jako nezdokumentované ify.
Kroky 1 až 3
Odděl globální produkt od prodejního trhu
Sdílej stabilní identitu produktu, ale dostupnost, cenu a prezentaci váž na konkrétní channel nebo market.
1. Vytvoř explicitní model trhu
- Globální produkt drží SKU a společná technická data. Market listing určuje, zda se produkt prodává, za jakých podmínek a s jakou prezentací.
- Locale zapisuj jako jazyk a region, například cs-CZ nebo de-AT. Nepoužívej samotnou vlajku jako jazyk ani jako obchodní pravidlo.
- Market vybírej z ověřené domény, uživatelské volby a doručovacího kontextu. GeoIP může nabídnout výchozí hodnotu, ne autoritativně měnit košík.
- Všechny background joby, cache klíče a vyhledávací dokumenty nesou market ID. Jinak se data jednoho trhu snadno objeví v jiném.
market = country + allowed_locales + domains + price_lists + tax_profile Unicode CLDR data pro jazyky a území 2. Ukládej ceny po měnách přesně
- Cenu modeluj jako přesnou částku a kód měny. Float nepoužívej a počet desetinných míst nehardcoduj na dvě pro všechny měny.
- Pro každou měnu může existovat samostatný ceník s valid_from a valid_to. Automatický kurz je vstup do návrhu ceny, ne důvod přepisovat historickou objednávku.
- Pokud zobrazuješ orientační druhou měnu, jasně ji označ. Checkout a platba musí mít jednu závaznou měnu a přesný konečný součet.
- Objednávka uloží ceny řádků, slevy, dopravu, daně, měnu a případný použitý kurz jako snapshot v okamžiku potvrzení.
price_list(market_id, currency, product_id, amount, valid_from, valid_to) Oficiální PHP dokumentace k lokalizaci čísel a měn 3. Lokalizuj obsah, URL a procesy
- Překlady ukládej pod locale se zřetelným fallbackem. Chybějící překlad nesmí tiše publikovat obsah v nesprávném jazyce bez rozhodnutí.
- Lokalizuj formát částek, data, jednotky, adresy a validaci telefonu. Interně uchovávej strukturované hodnoty, ne jejich zobrazený řetězec.
- Pro každou jazykovou URL nastav canonical a hreflang podle skutečně dostupných variant. Přepínač má vést na odpovídající obsah, ne vždy na homepage.
- Dopravu, platbu, e-maily a doklady vybírej podle marketu a snapshotuj do objednávky. Změna konfigurace nesmí přepsat starý doklad.
product_translation(product_id, locale, name, slug, description) W3C Internationalization resources Krok 4
Otestuj kombinace, ne jen každý trh zvlášť
Chyby vznikají při přechodu mezi měnou, jazykem a trhem uprostřed košíku nebo checkoutu.
-
Vytvoř matici trhu, locale a měny
Ověř povolené i zakázané kombinace, ceny, dostupnost, dopravu, platbu a adresní formát.
php bin/phpunit --filter MarketCheckout -
Změň ceník po vytvoření objednávky
Historická objednávka a doklad musí zachovat původní částky, měnu, kurz i daňový snapshot.
-
Přepni jazyk v rozpracovaném košíku
Položky zůstanou stejné a názvy se přeloží; změna trhu se naopak provede jen s výslovným přepočtem a kontrolou dostupnosti.
Když to zlobí
Nejčastější chyby
Změna jazyka přepne také cenu a sklad
Jazyk je chybně použit jako market. Odděl locale od prodejního trhu a změnu marketu prováděj jako samostatnou validovanou operaci.
Objednávka se po změně kurzu přepočítala
Historie odkazuje na živý ceník. Ulož do objednávky přesný snapshot částek, měny a použitého kurzu.
Produkt z jednoho trhu uniká do druhého
Chybí market scope v repository, cache, indexu nebo background jobu. Market ID musí být povinný na každé hranici.
Formátovaná cena nejde znovu spočítat
Do domény se dostal lokalizovaný řetězec. Uchovávej amount + currency a NumberFormatter používej pouze pro vstupní nebo výstupní hranici.
Hotovo
Každý trh má jasná pravidla bez kopie celého e-shopu.
Produkty mohou sdílet identitu, zatímco market řídí lokalizaci, ceníky, dostupnost a proces objednávky. Historická objednávka zůstává neměnným snapshotem.