OpportunitiesEntities
Docs
    Ring Platform

    Decentralized Self-building Future

    Sign In
    Entities
    Opportunities
    Store
    Docs
    Platform Concepts
    RING EconomySonoratek LLCGlobal ImpactAI Meets Web3
    Get Started
    Quick StartCalculatorRoadmap
    Privacy|Contact
    v1.104.26|Sonoratek LLC

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Credit Rewards
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    News Kingdom architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server
    OSS vs enterprise

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Credit Rewards
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    News Kingdom architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server
    OSS vs enterprise

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Credit Rewards
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    News Kingdom architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server
    OSS vs enterprise

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Localization

    Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.

    Ring Platform uses env-driven locale configuration and next-intl with localePrefix: 'as-needed'. Translation JSON lives under locales/{locale}/. Request-time merge then layers an optional pack file and an optional clone overlay on top of the cached Layer1 corpus.

    StageWhen it runsWho owns the strings
    Layer1 locale filesCached in buildCachedLocaleMessages ('use cache')Community ring/web/locales/
    locales/{locale}/pack.jsonPer request, only if presets.pack is setL2 pack overwrite at compose
    Clone overlayPer request, only if overlay.featureId is setappendOverlayMessages via lib/overlay/registry.ts

    Later leaf keys win. Nested objects merge (mergeJsonRecords in lib/i18n.ts). A clone can override one string without replacing the whole pack namespace.

    Canonical config

    Source of truth: lib/locale-config.ts — imported by routing, SEO, preferences, and static generation. Fallback locale list when env is empty: en, uk, ru, es, de.

    Why pack.json matters on your clone

    You do not paste vertical copy into Layer1 lib/i18n.ts. If the clone uses a vertical pack (presets.pack in ring-config.json), pack labels arrive from locales/{locale}/pack.json after compose. Brand-only tweaks stay in the clone overlay (registry plug), so platform upgrades keep shipping new Layer1 strings.

    Vertical presets

    Pack locale socket, overlay runtime, named catalogs

    Ringization playbook

    Where clone strings may live — and hard bans

    Loaders and merge

    ConcernVerified path
    Message builderlib/i18n.ts buildMessages(locale, scope)
    Cached L1 filesbuildCachedLocaleMessages + assembleMessages + LocaleFileId in lib/i18n/message-scopes.ts
    Pack filelocales/{locale}/pack.json — Layer1 ships {} for en/uk/ru/es/de
    Pack loaderloadPackMessages in lib/overlay/runtime.ts (no-op when getPresetPack() is null)
    Overlay loaderloadOverlayMessages in the same runtime (no-op when getOverlayFeature() is null)
    Request configi18n/request.ts
    Editor bundle

    Frequently asked questions

    Impact

    Will pack strings replace my whole navigation.json?

    No. Merge is nested. Only keys present in pack.json overlay matching Layer1 paths. Missing keys stay on Layer1.

    Do I need a pack file on a two-layer clone?

    No. When presets.pack is unset, loadPackMessages returns {} and webpack still resolves the empty Layer1 file.

    Migration

    Can I import pack JSON from assembleMessages?

    No. That would put pack bytes inside 'use cache'. Keep pack load in buildMessages next to loadOverlayMessages.

    Ops

    Who ships a new fallback locale’s empty pack.json?

    Layer1. Packs overwrite the file at compose; they must not be the only copy webpack can see on bare ring/web.

    Related documentation

    Related documentation

    Locale System

    Same-workflow: locale env, routing helpers, and message scopes.

    Vertical Presets (SSOT)

    Depends-on: pack socket, overlay runtime, and named catalogs.

    Whitelabel Navigation

    Next-step: nav labels and closed icon ids after copy merge.

    Proxy and internationalization

    See-also: proxy locale rewrite vs layout auth.

    1. Docs
    2. /Customization
    3. /Localization

    Updated Sep 9, 20264 min listen

    Localization

    Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.

    Ring Platform uses env-driven locale configuration and next-intl with localePrefix: 'as-needed'. Translation JSON lives under locales/{locale}/. Request-time merge then layers an optional pack file and an optional clone overlay on top of the cached Layer1 corpus.

    StageWhen it runsWho owns the strings
    Layer1 locale filesCached in buildCachedLocaleMessages ('use cache')Community ring/web/locales/
    locales/{locale}/pack.jsonPer request, only if presets.pack is setL2 pack overwrite at compose
    Clone overlayPer request, only if overlay.featureId is setappendOverlayMessages via lib/overlay/registry.ts

    Later leaf keys win. Nested objects merge (mergeJsonRecords in lib/i18n.ts). A clone can override one string without replacing the whole pack namespace.

    Canonical config

    Source of truth: lib/locale-config.ts — imported by routing, SEO, preferences, and static generation. Fallback locale list when env is empty: en, uk, ru, es, de.

    Why pack.json matters on your clone

    You do not paste vertical copy into Layer1 lib/i18n.ts. If the clone uses a vertical pack (presets.pack in ring-config.json), pack labels arrive from locales/{locale}/pack.json after compose. Brand-only tweaks stay in the clone overlay (registry plug), so platform upgrades keep shipping new Layer1 strings.

    Vertical presets

    Pack locale socket, overlay runtime, named catalogs

    Ringization playbook

    Where clone strings may live — and hard bans

    Loaders and merge

    ConcernVerified path
    Message builderlib/i18n.ts buildMessages(locale, scope)
    Cached L1 filesbuildCachedLocaleMessages + assembleMessages + LocaleFileId in lib/i18n/message-scopes.ts
    Pack filelocales/{locale}/pack.json — Layer1 ships {} for en/uk/ru/es/de
    Pack loaderloadPackMessages in lib/overlay/runtime.ts (no-op when getPresetPack() is null)
    Overlay loaderloadOverlayMessages in the same runtime (no-op when getOverlayFeature() is null)
    Request configi18n/request.ts
    Editor bundle

    Frequently asked questions

    Impact

    Will pack strings replace my whole navigation.json?

    No. Merge is nested. Only keys present in pack.json overlay matching Layer1 paths. Missing keys stay on Layer1.

    Do I need a pack file on a two-layer clone?

    No. When presets.pack is unset, loadPackMessages returns {} and webpack still resolves the empty Layer1 file.

    Migration

    Can I import pack JSON from assembleMessages?

    No. That would put pack bytes inside 'use cache'. Keep pack load in buildMessages next to loadOverlayMessages.

    Ops

    Who ships a new fallback locale’s empty pack.json?

    Layer1. Packs overwrite the file at compose; they must not be the only copy webpack can see on bare ring/web.

    Related documentation

    Related documentation

    Locale System

    Same-workflow: locale env, routing helpers, and message scopes.

    Vertical Presets (SSOT)

    Depends-on: pack socket, overlay runtime, and named catalogs.

    Whitelabel Navigation

    Next-step: nav labels and closed icon ids after copy merge.

    Proxy and internationalization

    See-also: proxy locale rewrite vs layout auth.

    1. Docs
    2. /Customization
    3. /Localization

    Updated Sep 9, 20264 min listen

    Localization

    Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.

    Ring Platform uses env-driven locale configuration and next-intl with localePrefix: 'as-needed'. Translation JSON lives under locales/{locale}/. Request-time merge then layers an optional pack file and an optional clone overlay on top of the cached Layer1 corpus.

    StageWhen it runsWho owns the strings
    Layer1 locale filesCached in buildCachedLocaleMessages ('use cache')Community ring/web/locales/
    locales/{locale}/pack.jsonPer request, only if presets.pack is setL2 pack overwrite at compose
    Clone overlayPer request, only if overlay.featureId is setappendOverlayMessages via lib/overlay/registry.ts

    Later leaf keys win. Nested objects merge (mergeJsonRecords in lib/i18n.ts). A clone can override one string without replacing the whole pack namespace.

    Canonical config

    Source of truth: lib/locale-config.ts — imported by routing, SEO, preferences, and static generation. Fallback locale list when env is empty: en, uk, ru, es, de.

    Why pack.json matters on your clone

    You do not paste vertical copy into Layer1 lib/i18n.ts. If the clone uses a vertical pack (presets.pack in ring-config.json), pack labels arrive from locales/{locale}/pack.json after compose. Brand-only tweaks stay in the clone overlay (registry plug), so platform upgrades keep shipping new Layer1 strings.

    Vertical presets

    Pack locale socket, overlay runtime, named catalogs

    Ringization playbook

    Where clone strings may live — and hard bans

    Loaders and merge

    ConcernVerified path
    Message builderlib/i18n.ts buildMessages(locale, scope)
    Cached L1 filesbuildCachedLocaleMessages + assembleMessages + LocaleFileId in lib/i18n/message-scopes.ts
    Pack filelocales/{locale}/pack.json — Layer1 ships {} for en/uk/ru/es/de
    Pack loaderloadPackMessages in lib/overlay/runtime.ts (no-op when getPresetPack() is null)
    Overlay loaderloadOverlayMessages in the same runtime (no-op when getOverlayFeature() is null)
    Request configi18n/request.ts
    Editor bundle

    Frequently asked questions

    Impact

    Will pack strings replace my whole navigation.json?

    No. Merge is nested. Only keys present in pack.json overlay matching Layer1 paths. Missing keys stay on Layer1.

    Do I need a pack file on a two-layer clone?

    No. When presets.pack is unset, loadPackMessages returns {} and webpack still resolves the empty Layer1 file.

    Migration

    Can I import pack JSON from assembleMessages?

    No. That would put pack bytes inside 'use cache'. Keep pack load in buildMessages next to loadOverlayMessages.

    Ops

    Who ships a new fallback locale’s empty pack.json?

    Layer1. Packs overwrite the file at compose; they must not be the only copy webpack can see on bare ring/web.

    Related documentation

    Related documentation

    Locale System

    Same-workflow: locale env, routing helpers, and message scopes.

    Vertical Presets (SSOT)

    Depends-on: pack socket, overlay runtime, and named catalogs.

    Whitelabel Navigation

    Next-step: nav labels and closed icon ids after copy merge.

    Proxy and internationalization

    See-also: proxy locale rewrite vs layout auth.

    1. Docs
    2. /Customization
    3. /Localization

    Updated Sep 9, 20264 min listen

    locales/{locale}/editor.json (scope must include editor)

    Do not add pack to LocaleFileId or assembleMessages. Pack JSON is merged after the cache, same as the overlay, so a pack or registry change is not frozen for hours.

    loadPackMessages maps unknown locale codes to en. Known codes match the fallback list: uk, ru, es, de, else en.

    In block comments, write locales/{locale}/pack.json. A glob locales/*/pack.json inside /* … */ terminates the comment at */.

    buildMessages merge

    Pack file shape

    Layer1 files are empty objects. A pack overwrites the file with nested namespaces (leaf-wins against L1 keys of the same path):

    Clone overlay still wins the same leaf after that merge.

    Client navigation rules

    1. Use Link, useRouter, usePathname from @/i18n/routing only.
    2. Do not regex-strip locale prefixes in client components.
    3. Switch locale: persistRingLocalePreference() + replaceLocalePath() from lib/locale-pref.ts.

    SEO

    • Hreflang: components/seo/hreflang-links.tsx
    • Metadata: lib/seo-metadata.ts with pathnameWithoutLocale() for raw URLs

    Adding a language

    1. 1

      Add the BCP-47 short code to NEXT_PUBLIC_SUPPORTED_LOCALES (must match a folder under locales/).

    2. 2

      Mirror the locales/{code}/ tree, including an empty pack.json if you extend the Layer1 fallback set so webpack still resolves the pack import.

    3. 3

      Keep docs locale trees in ringdom-clones/ring-platform-org/web/docs/{locale}/ in sync with lib/locale-config.ts. There is no scripts/LOCALE-GAPS.md.

    Ringization playbook

    Prerequisite: clone overlay bans — do not patch lib/i18n.ts per brand.

    bash
    
    # .env.local
    NEXT_PUBLIC_SUPPORTED_LOCALES=en,uk,ru,es,de
    NEXT_PUBLIC_DEFAULT_LOCALE=en
    locales/{locale}/editor.json (scope must include editor)

    Do not add pack to LocaleFileId or assembleMessages. Pack JSON is merged after the cache, same as the overlay, so a pack or registry change is not frozen for hours.

    loadPackMessages maps unknown locale codes to en. Known codes match the fallback list: uk, ru, es, de, else en.

    In block comments, write locales/{locale}/pack.json. A glob locales/*/pack.json inside /* … */ terminates the comment at */.

    buildMessages merge

    Pack file shape

    Layer1 files are empty objects. A pack overwrites the file with nested namespaces (leaf-wins against L1 keys of the same path):

    Clone overlay still wins the same leaf after that merge.

    Client navigation rules

    1. Use Link, useRouter, usePathname from @/i18n/routing only.
    2. Do not regex-strip locale prefixes in client components.
    3. Switch locale: persistRingLocalePreference() + replaceLocalePath() from lib/locale-pref.ts.

    SEO

    • Hreflang: components/seo/hreflang-links.tsx
    • Metadata: lib/seo-metadata.ts with pathnameWithoutLocale() for raw URLs

    Adding a language

    1. 1

      Add the BCP-47 short code to NEXT_PUBLIC_SUPPORTED_LOCALES (must match a folder under locales/).

    2. 2

      Mirror the locales/{code}/ tree, including an empty pack.json if you extend the Layer1 fallback set so webpack still resolves the pack import.

    3. 3

      Keep docs locale trees in ringdom-clones/ring-platform-org/web/docs/{locale}/ in sync with lib/locale-config.ts. There is no scripts/LOCALE-GAPS.md.

    Ringization playbook

    Prerequisite: clone overlay bans — do not patch lib/i18n.ts per brand.

    bash
    
    # .env.local
    NEXT_PUBLIC_SUPPORTED_LOCALES=en,uk,ru,es,de
    NEXT_PUBLIC_DEFAULT_LOCALE=en
    locales/{locale}/editor.json (scope must include editor)

    Do not add pack to LocaleFileId or assembleMessages. Pack JSON is merged after the cache, same as the overlay, so a pack or registry change is not frozen for hours.

    loadPackMessages maps unknown locale codes to en. Known codes match the fallback list: uk, ru, es, de, else en.

    In block comments, write locales/{locale}/pack.json. A glob locales/*/pack.json inside /* … */ terminates the comment at */.

    buildMessages merge

    Pack file shape

    Layer1 files are empty objects. A pack overwrites the file with nested namespaces (leaf-wins against L1 keys of the same path):

    Clone overlay still wins the same leaf after that merge.

    Client navigation rules

    1. Use Link, useRouter, usePathname from @/i18n/routing only.
    2. Do not regex-strip locale prefixes in client components.
    3. Switch locale: persistRingLocalePreference() + replaceLocalePath() from lib/locale-pref.ts.

    SEO

    • Hreflang: components/seo/hreflang-links.tsx
    • Metadata: lib/seo-metadata.ts with pathnameWithoutLocale() for raw URLs

    Adding a language

    1. 1

      Add the BCP-47 short code to NEXT_PUBLIC_SUPPORTED_LOCALES (must match a folder under locales/).

    2. 2

      Mirror the locales/{code}/ tree, including an empty pack.json if you extend the Layer1 fallback set so webpack still resolves the pack import.

    3. 3

      Keep docs locale trees in ringdom-clones/ring-platform-org/web/docs/{locale}/ in sync with lib/locale-config.ts. There is no scripts/LOCALE-GAPS.md.

    Ringization playbook

    Prerequisite: clone overlay bans — do not patch lib/i18n.ts per brand.

    bash
    
    # .env.local
    NEXT_PUBLIC_SUPPORTED_LOCALES=en,uk,ru,es,de
    NEXT_PUBLIC_DEFAULT_LOCALE=en