Lokalizované vlastnosti entit

Lokalizované vlastnosti entit

Entity jako jsou produkt, značka, kategorie a další mohou mít buď základní vlastnosti nebo tzv. lokalizovatelné vlastnosti. Lokalizovatelné vlastnosti se ukládají do bundlu localizedLabels, který zpřístupňuje rozhraní WithLocalization.

Zároveň není nutné a nesmí se na úrovni projektové implementace definovat těla metod, které tyto lokalizované vlastnosti zpřístupňují nebo nastavují. EdeeShop obsahuje logiku automatické implementace vlastností, které jsou anotované pomocí @LocalizedLabel anotace.

Pokud budou dodržena následující pravidla bude u nové lokalizovatelné vlastnosti automaticky a správně fungovat:

  • lokalizace vlastnosti přes API
  • lokalizace vlastnosti pomocí administračního GUI
  • správná dědičnost popisků z master produktu na variantu
  • správná dědičnost popisku z originu na alias
  • možnost přetěžovat popisky na úrovni aliasu
  • automatické zpracování lokalizovaných popisků při exportu/importu
  • automatická publikace lokalizovaných popisků do EvitaDB

Zkopírovat odkaz na sekciPřístup k lokalizovaným textům entity

Pokud entita implementuje rozhraní WithLocalization, je možné na ní volat všechny metody pro získání lokalizovaných popisků dle kontraktu rozhraní. Entita bude mít ve výchozím stavu nakonfigurovaný jazyk pro popisky dle výchozího jazyka katalogu. Tj. popisky pro výchozí jazyk katalogu lze číst podle zkrácených metod:

java
1 entity.getShortDescription();2entity.getDescription();3entity.getLabel("kodPopisku");

Pro přístup k popiskům jiných jazyků je možné použít přetížené metody, které mají jazyk přímo v argumentu:

java
1 entity.getShortDescription("en");2entity.getDescription("en");3entity.getLabel("en", "kodPopisku");

Alternativně je možné využít blokového nastavení jazyka, které jazyk nastaví jen pro určitý omezený blok kódu - viz. ukázka:

java
1 WithLocalization.doWithLanguage("en", () -> {2    entity.getShortDescription();3    entity.getDescription();4    entity.getLabel("kodPopisku");5});

Při nastavování popisků platí úplně stejná logika.

Zkopírovat odkaz na sekciDefinování nové lokalizovatelné vlastnosti

Základem projektového rozšíření EdeeShop entity je tzv. @Trait. Jednoduchý trait obsahující lokalizovatelnou vlastnost disclaimer by mohl vypadat například takto:

java
1 @Trait2public interface WithDisclaimer {3
4	@LocalizedLabel5	String getDisclaimer();6	String getDisclaimer(String language);7	void setDisclaimer(String disclaimer);8	void setDisclaimer(String disclaimer, String language);9	void removeDisclaimer();10	void removeDisclaimer(String language);11	12}

Pozor: při definování názvů metod je nutné dodržovat standard pro pojmenování Java properties. U metod, které umožňují nastavovat popisek v konkrétním jazyce je nutné jazyk předávat v argumentu pojmenovaném language.

Pokud budeme chtít aplikačně nastavovat příznaky přetížení popisku na úrovni aliasu je třeba přidat další rozhraní. Tento krok není podmínkou - pokud bude stačit aby se přetížení popisků definovalo pomocí administračního GUI, tak toto rozhraní není potřeba:

java
1 @Trait2public interface WithDisclaimerAlias extends WithDisclaimer {3
4	boolean isDisclaimerOverridden();5	boolean isDisclaimerOverridden(String language);6	void setDisclaimerOverridden(boolean overridden);7	void setDisclaimerOverridden(boolean overridden, String language);8	9}

Pozor: při definování názvů metod je nutné dodržovat standard pro pojmenování Java properties a odkazovat se na stejně pojmenovaný popisek, který je anotovaný @LocalizedLabel - vyjma použití klíčového slova overridden či override.

Zkopírovat odkaz na sekciRegistrace nových traitů do modelu EdeeShop

Tyto traity je nutné zaregistrovat k deskriptorům EdeeShop entity modelů. Pokud budeme chtít aby trait byl dostupný na úrovni entity Product je nutné provést ve feature projektového rozšíření následující volání:

java
1 @Override2public void beforeSpringInitialization() {3    super.beforeSpringInitialization();4
5    if (isFeatureEnabled()) {       6        entityModel.addTrait(WithDisclaimer.class);7
8        if (isFeaturesEnabled(ProductAliasFeature.class)) {9            entityModel.registerLazyTrait(10                CatalogEntityType.PRODUCT, 11                ProductAliasWrapper.class,12                WithDisclaimerAlias.class, 13                true14            );15        }16        if (isFeaturesEnabled(ProductVariantFeature.class)) {17            entityModel.registerLazyTrait(18                CatalogEntityType.PRODUCT, 19                ProductVariantWrapper.class,20                WithDisclaimer.class, 21                true22            );23        }24    }25}