diff --git a/.github/workflows/gh-jekyll-workflow.yml b/.github/workflows/gh-jekyll-workflow.yml
new file mode 100644
index 0000000..e45ab39
--- /dev/null
+++ b/.github/workflows/gh-jekyll-workflow.yml
@@ -0,0 +1,64 @@
+# Sample workflow for building and deploying a Jekyll site to GitHub Pages
+name: Deploy Jekyll with GitHub Pages dependencies preinstalled
+
+on:
+ # Runs on pushes targeting the default branch
+ push:
+ branches: ["main", "redesign"]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup Pages
+ uses: actions/configure-pages@v5
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.3'
+ bundler-cache: false
+ - name: Install dependencies
+ run: bundle install
+ - name: Build with Jekyll (with custom plugins)
+ run: bundle exec jekyll build --trace
+ env:
+ JEKYLL_ENV: production
+ - name: Check JavaScript
+ run: |
+ node --check assets/js/extra.js
+ node tests/shop-js-test.js
+ - name: Check generated HTML and internal links
+ run: bundle exec htmlproofer ./_site --disable-external
+ - name: Verify Shop output and source invariants
+ run: bundle exec ruby tools/verify-site.rb ./_site
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v5
diff --git a/.github/workflows/site-checks.yml b/.github/workflows/site-checks.yml
new file mode 100644
index 0000000..9bee0dd
--- /dev/null
+++ b/.github/workflows/site-checks.yml
@@ -0,0 +1,31 @@
+name: Site checks
+
+on:
+ pull_request:
+ push:
+ branches: [main]
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: ruby/setup-ruby@v1
+ with:
+ bundler-cache: false
+ ruby-version: "3.3"
+ - name: Install dependencies
+ run: bundle install
+ - name: Check JavaScript
+ run: |
+ node --check assets/js/extra.js
+ node tests/shop-js-test.js
+ - name: Build site
+ run: bundle exec jekyll build
+ - name: Check generated HTML and internal links
+ run: bundle exec htmlproofer ./_site --disable-external
+ - name: Verify Shop output and source invariants
+ run: bundle exec ruby tools/verify-site.rb ./_site
diff --git a/.gitignore b/.gitignore
index ce89292..ff744da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,418 +1,4 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
-
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-*.env
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Mono auto generated files
-mono_crash.*
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Ww][Ii][Nn]32/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-[Aa][Rr][Mm]64[Ee][Cc]/
-bld/
-[Oo]bj/
-[Oo]ut/
-[Ll]og/
-[Ll]ogs/
-
-# Build results on 'Bin' directories
-**/[Bb]in/*
-# Uncomment if you have tasks that rely on *.refresh files to move binaries
-# (https://github.com/github/gitignore/pull/3736)
-#!**/[Bb]in/*.refresh
-
-# Visual Studio 2015/2017 cache/options directory
.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# Visual Studio 2017 auto generated files
-Generated\ Files/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-*.trx
-
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
-
-# Approval Tests result files
-*.received.*
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-# ASP.NET Scaffolding
-ScaffoldingReadMe.txt
-
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
-*.obj
-*.idb
-*.iobj
-*.pch
-*.pdb
-*.ipdb
-*.pgc
-*.pgd
-*.rsp
-# but not Directory.Build.rsp, as it configures directory-level build defaults
-!Directory.Build.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
-*.log
-*.tlog
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Coverlet is a free, cross platform Code Coverage Tool
-coverage*.json
-coverage*.xml
-coverage*.info
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio 6 auto-generated project file (contains which files were open etc.)
-*.vbp
-
-# Visual Studio 6 workspace and project file (working project files containing files to include in project)
-*.dsw
-*.dsp
-
-# Visual Studio 6 technical files
-*.ncb
-*.aps
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-**/.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-**/.fake/
-
-# CodeRush personal settings
-**/.cr/personal
-
-# Python Tools for Visual Studio (PTVS)
-**/__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-#tools/**
-#!tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-MSBuild_Logs/
-
-# AWS SAM Build and Temporary Artifacts folder
-.aws-sam
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-**/.mfractor/
-
-# Local History for Visual Studio
-**/.localhistory/
-
-# Visual Studio History (VSHistory) files
-.vshistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-**/.ionide/
-
-# Fody - auto-generated XML schema
-FodyWeavers.xsd
-
-# VS Code files for those working on multiple tools
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-!.vscode/*.code-snippets
-
-# Local History for Visual Studio Code
-.history/
-
-# Built Visual Studio Code Extensions
-*.vsix
-
-# Windows Installer files from build outputs
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
+.jekyll-cache/
+_site/
+.DS_Store
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..cec3383
--- /dev/null
+++ b/404.html
@@ -0,0 +1,22 @@
+---
+layout: default
+title: Shop page not found
+description: The requested PWindows Shop page could not be found.
+permalink: /404.html
+sitemap: false
+robots: noindex, follow
+english_fallback: true
+---
+
+
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..4ab8121
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,17 @@
+source "https://rubygems.org"
+
+platform :windows do
+ gem 'wdm', '>= 0.1.0'
+end
+
+gem "pwindows-theme", git: "https://github.com/PWindows/website-common.git", branch: "main"
+
+gem "jekyll", "~> 4.4"
+gem "webrick"
+
+group :jekyll_plugins do
+ gem "jekyll-polyglot"
+end
+
+gem "html-proofer", "~> 5.0"
+gem "nokogiri", "~> 1.19"
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..270fceb
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,295 @@
+GIT
+ remote: https://github.com/PWindows/website-common.git
+ revision: dcefd4051816760ed80103a182d5f3f3078a9c25
+ branch: main
+ specs:
+ pwindows-theme (1.0.0)
+ jekyll (~> 4.4)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ Ascii85 (2.0.1)
+ addressable (2.9.0)
+ public_suffix (>= 2.0.2, < 8.0)
+ afm (1.0.0)
+ async (2.43.0)
+ console (~> 1.29)
+ fiber-annotation
+ io-event (~> 1.11)
+ base64 (0.3.0)
+ benchmark (0.5.0)
+ bigdecimal (3.3.1)
+ colorator (1.1.0)
+ concurrent-ruby (1.3.8)
+ console (1.37.0)
+ fiber-annotation
+ fiber-local (~> 1.1)
+ json
+ csv (3.3.6)
+ em-websocket (0.5.3)
+ eventmachine (>= 0.12.9)
+ http_parser.rb (~> 0)
+ ethon (0.18.0)
+ ffi (>= 1.15.0)
+ logger
+ eventmachine (1.2.7)
+ ffi (1.17.4-aarch64-linux-gnu)
+ ffi (1.17.4-aarch64-linux-musl)
+ ffi (1.17.4-arm-linux-gnu)
+ ffi (1.17.4-arm-linux-musl)
+ ffi (1.17.4-arm64-darwin)
+ ffi (1.17.4-x86_64-darwin)
+ ffi (1.17.4-x86_64-linux-gnu)
+ ffi (1.17.4-x86_64-linux-musl)
+ fiber-annotation (0.2.0)
+ fiber-local (1.1.0)
+ fiber-storage
+ fiber-storage (1.0.1)
+ forwardable-extended (2.6.0)
+ google-protobuf (4.35.1)
+ bigdecimal
+ rake (~> 13.3)
+ google-protobuf (4.35.1-aarch64-linux-gnu)
+ bigdecimal
+ rake (~> 13.3)
+ google-protobuf (4.35.1-aarch64-linux-musl)
+ bigdecimal
+ rake (~> 13.3)
+ google-protobuf (4.35.1-arm64-darwin)
+ bigdecimal
+ rake (~> 13.3)
+ google-protobuf (4.35.1-x86_64-darwin)
+ bigdecimal
+ rake (~> 13.3)
+ google-protobuf (4.35.1-x86_64-linux-gnu)
+ bigdecimal
+ rake (~> 13.3)
+ google-protobuf (4.35.1-x86_64-linux-musl)
+ bigdecimal
+ rake (~> 13.3)
+ hashery (2.1.2)
+ html-proofer (5.2.1)
+ addressable (~> 2.3)
+ async (~> 2.1)
+ benchmark (~> 0.5)
+ nokogiri (~> 1.13)
+ pdf-reader (~> 2.11)
+ rainbow (~> 3.0)
+ typhoeus (~> 1.3)
+ yell (~> 2.0)
+ zeitwerk (~> 2.5)
+ http_parser.rb (0.8.1)
+ i18n (1.15.2)
+ concurrent-ruby (~> 1.0)
+ io-event (1.19.3)
+ jekyll (4.4.1)
+ addressable (~> 2.4)
+ base64 (~> 0.2)
+ colorator (~> 1.0)
+ csv (~> 3.0)
+ em-websocket (~> 0.5)
+ i18n (~> 1.0)
+ jekyll-sass-converter (>= 2.0, < 4.0)
+ jekyll-watch (~> 2.0)
+ json (~> 2.6)
+ kramdown (~> 2.3, >= 2.3.1)
+ kramdown-parser-gfm (~> 1.0)
+ liquid (~> 4.0)
+ mercenary (~> 0.3, >= 0.3.6)
+ pathutil (~> 0.9)
+ rouge (>= 3.0, < 5.0)
+ safe_yaml (~> 1.0)
+ terminal-table (>= 1.8, < 4.0)
+ webrick (~> 1.7)
+ jekyll-polyglot (1.13.0)
+ jekyll (>= 4.0, >= 3.0)
+ jekyll-sass-converter (3.1.0)
+ sass-embedded (~> 1.75)
+ jekyll-watch (2.2.1)
+ listen (~> 3.0)
+ json (2.21.1)
+ kramdown (2.5.2)
+ rexml (>= 3.4.4)
+ kramdown-parser-gfm (1.1.0)
+ kramdown (~> 2.0)
+ liquid (4.0.4)
+ listen (3.10.0)
+ logger
+ rb-fsevent (~> 0.10, >= 0.10.3)
+ rb-inotify (~> 0.9, >= 0.9.10)
+ logger (1.7.0)
+ mercenary (0.4.0)
+ nokogiri (1.19.4-aarch64-linux-gnu)
+ racc (~> 1.4)
+ nokogiri (1.19.4-aarch64-linux-musl)
+ racc (~> 1.4)
+ nokogiri (1.19.4-arm-linux-gnu)
+ racc (~> 1.4)
+ nokogiri (1.19.4-arm-linux-musl)
+ racc (~> 1.4)
+ nokogiri (1.19.4-arm64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.19.4-x86_64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.19.4-x86_64-linux-gnu)
+ racc (~> 1.4)
+ nokogiri (1.19.4-x86_64-linux-musl)
+ racc (~> 1.4)
+ pathutil (0.16.2)
+ forwardable-extended (~> 2.6)
+ pdf-reader (2.15.1)
+ Ascii85 (>= 1.0, < 3.0, != 2.0.0)
+ afm (>= 0.2.1, < 2)
+ hashery (~> 2.0)
+ ruby-rc4
+ ttfunk
+ public_suffix (7.0.5)
+ racc (1.8.1)
+ rainbow (3.1.1)
+ rake (13.4.2)
+ rb-fsevent (0.11.2)
+ rb-inotify (0.11.1)
+ ffi (~> 1.0)
+ rexml (3.4.4)
+ rouge (4.7.0)
+ ruby-rc4 (0.1.5)
+ safe_yaml (1.0.5)
+ sass-embedded (1.102.0-aarch64-linux-gnu)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-aarch64-linux-musl)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-arm-linux-gnueabihf)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-arm-linux-musleabihf)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-arm64-darwin)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-x86_64-darwin)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-x86_64-linux-gnu)
+ google-protobuf (~> 4.31)
+ sass-embedded (1.102.0-x86_64-linux-musl)
+ google-protobuf (~> 4.31)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ ttfunk (1.8.0)
+ bigdecimal (~> 3.1)
+ typhoeus (1.6.0)
+ ethon (>= 0.18.0)
+ unicode-display_width (2.6.0)
+ webrick (1.9.2)
+ yell (2.2.2)
+ zeitwerk (2.8.2)
+
+PLATFORMS
+ aarch64-linux-gnu
+ aarch64-linux-musl
+ arm-linux-gnu
+ arm-linux-gnueabihf
+ arm-linux-musl
+ arm-linux-musleabihf
+ arm64-darwin
+ x86_64-darwin
+ x86_64-linux-gnu
+ x86_64-linux-musl
+
+DEPENDENCIES
+ html-proofer (~> 5.0)
+ jekyll (~> 4.4)
+ jekyll-polyglot
+ nokogiri (~> 1.19)
+ pwindows-theme!
+ wdm (>= 0.1.0)
+ webrick
+
+CHECKSUMS
+ Ascii85 (2.0.1) sha256=15cb5d941808543cbb9e7e6aea3c8ec3877f154c3461e8b3673e97f7ecedbe5a
+ addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
+ afm (1.0.0) sha256=5bd4d6f6241e7014ef090985ec6f4c3e9745f6de0828ddd58bc1efdd138f4545
+ async (2.43.0) sha256=c3a6bd7ebb56a02b19eaa3b8ca26fced4397554bcd8c5d5046be5ee5598c452d
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
+ bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218
+ bundler (4.0.11) sha256=5bcec0fb78302e48d02ee46f10ee6e6942be647ba5b44a6d1ddfda9a240ce785
+ colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38
+ concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1
+ console (1.37.0) sha256=8093b286c2595a063849c098594fee5155ecc7967d36f3aa8cbe7569c8f3efd7
+ csv (3.3.6) sha256=aba61e7e507a66f03d45cb1f3c4b6359861c3504038b422962875dce099e4456
+ em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8
+ ethon (0.18.0) sha256=b598afc9f30448cb068b850714b7d6948e941476095d04f90a4ac65b8d6efcb2
+ eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972
+ ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df
+ ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39
+ ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564
+ ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95
+ ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b
+ ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496
+ ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d
+ ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e
+ fiber-annotation (0.2.0) sha256=7abfadf1d119f508867d4103bf231c0354d019cc39a5738945dec2edadaf6c03
+ fiber-local (1.1.0) sha256=c885f94f210fb9b05737de65d511136ea602e00c5105953748aa0f8793489f06
+ fiber-storage (1.0.1) sha256=f48e5b6d8b0be96dac486332b55cee82240057065dc761c1ea692b2e719240e1
+ forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97
+ google-protobuf (4.35.1) sha256=a3a6471331d918f58dfa4d014a8f6286f0af2cf4840216bde52fcf2ea3fe3726
+ google-protobuf (4.35.1-aarch64-linux-gnu) sha256=50ca44d0eeff3f8475e630a1accdd974256f3510694d574e2c9d6119ea8bc9e1
+ google-protobuf (4.35.1-aarch64-linux-musl) sha256=d5c65cef6bd6498a9e5ed5f88cf6cf7e341c10b0a005e32137d5d1a2b6e8c18a
+ google-protobuf (4.35.1-arm64-darwin) sha256=d9c957df04fa89c749fa9a72a7b383eb4296efc9b2303dc6fd6fbe39c698ad6b
+ google-protobuf (4.35.1-x86_64-darwin) sha256=66b62b4df00931018a692806df66393efa960d6d2b7da69735187249f950d3ee
+ google-protobuf (4.35.1-x86_64-linux-gnu) sha256=c786439087512a3fbd199e9897d265b855f951d4027e218ea55e858d45969edd
+ google-protobuf (4.35.1-x86_64-linux-musl) sha256=91890eb0002934a339fdb7d77a147c46b7474b6799db27872b747b905837f744
+ hashery (2.1.2) sha256=d239cc2310401903f6b79d458c2bbef5bf74c46f3f974ae9c1061fb74a404862
+ html-proofer (5.2.1) sha256=fdd958a7cbf9c3255fb96fe7cfc4e611f64e2706e469488a3326309ad007d2fd
+ http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a
+ i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
+ io-event (1.19.3) sha256=0fe24f0fe334ad39cf61a290131c54f8848184c0d166cea86ffae2d6548339d3
+ jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1
+ jekyll-polyglot (1.13.0) sha256=a5667e78b587e75b9705d387c6709e5e2237f7e0ddc471afa32094974add8ee4
+ jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443
+ jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1
+ json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
+ kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
+ liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3
+ listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138
+ nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
+ nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
+ nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca
+ nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb
+ nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527
+ nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551
+ nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
+ nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
+ pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589
+ pdf-reader (2.15.1) sha256=18c6a986a84a3117fa49f4279fc2de51f5d2399b71833df5d2bccd595c7068ce
+ public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
+ pwindows-theme (1.0.0)
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
+ rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
+ rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
+ rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
+ rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
+ rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739
+ ruby-rc4 (0.1.5) sha256=00cc40a39d20b53f5459e7ea006a92cf584e9bc275e2a6f7aa1515510e896c03
+ safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848
+ sass-embedded (1.102.0-aarch64-linux-gnu) sha256=087f377fa4135a8f67f5f422781b59815e99b8fd3aec335935c50a47c2a205fd
+ sass-embedded (1.102.0-aarch64-linux-musl) sha256=12bb4091972499241c35304ca11ca2c314764badf1b9933a8d437ba62432b538
+ sass-embedded (1.102.0-arm-linux-gnueabihf) sha256=566b1188e4f923366f494a5d95e4e5e03864ae55bae5ea52beb2c30b1b9e2915
+ sass-embedded (1.102.0-arm-linux-musleabihf) sha256=1ca396610bf4f4aa8f849b67a9f2720f67d9f3b42651072eafee786aece314cf
+ sass-embedded (1.102.0-arm64-darwin) sha256=8e18b2dd94b232c2dd73984c579f77bbc1a066028f4675c8989ac34fa40d14dc
+ sass-embedded (1.102.0-x86_64-darwin) sha256=3e78c6ac5be0ba4236d075bd044a49d0f515d54799f7d6f253c71d325ffedac0
+ sass-embedded (1.102.0-x86_64-linux-gnu) sha256=9815b7604123a9a44a65d44d5e58e7af1c7005174b745cda83bad4c9e3760ab3
+ sass-embedded (1.102.0-x86_64-linux-musl) sha256=9e3c15eb5d83784adf3b946d4fc5d8a32aed25566a2fee939f25dd1e1d217ddf
+ terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91
+ ttfunk (1.8.0) sha256=a7cbc7e489cc46e979dde04d34b5b9e4f5c8f1ee5fc6b1a7be39b829919d20ca
+ typhoeus (1.6.0) sha256=bacc41c23e379547e29801dc235cd1699b70b955a1ba3d32b2b877aa844c331d
+ unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a
+ webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131
+ yell (2.2.2) sha256=1d166f3cc3b6dc49a59778ea7156ed6d8de794c15106d48ffd6cbb061b9b26bc
+ zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+
+BUNDLED WITH
+ 4.0.11
diff --git a/README.md b/README.md
index 557efb4..a9f33a4 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,17 @@
-
+# PWindows Shop
+
+The static Jekyll storefront for [shop.pwindows.qzz.io](https://shop.pwindows.qzz.io). It uses the shared `pwindows-theme` and generates localized routes with `jekyll-polyglot`.
+
+Player lookup is informational onboarding, not authentication. The checkout service must revalidate player identity and resolve product IDs to server-owned prices. See `tools/production-runbook.md` for the external API, checkout, DNS, and hosting requirements.
+
+## Local verification
+
+```sh
+bundle exec jekyll build
+bundle exec htmlproofer ./_site --disable-external
+bundle exec ruby tools/verify-site.rb ./_site
+node --check assets/js/extra.js
+node tests/shop-js-test.js
+```
+
+Stripe price IDs, the checkout-worker URL, the undefined product, placeholder imagery, and coming-soon controls are intentional placeholders and must remain unchanged until an approved launch change.
diff --git a/_config.yml b/_config.yml
index 97d54b2..7b50b1d 100644
--- a/_config.yml
+++ b/_config.yml
@@ -1,7 +1,58 @@
title: PWindows Shop
-description: Official Store of PWindows
+description: Buy PCoins and support the PWindows community.
url: "https://shop.pwindows.qzz.io"
+theme: pwindows-theme
+markdown: kramdown
+default_lang: "en-us"
+languages:
+ [
+ "en-us",
+ "en-gb",
+ "zh-cn",
+ "es-es",
+ "fr-fr",
+ "de-de",
+ "it-it",
+ "pt-pt",
+ "pt-br",
+ "ja-jp",
+ "ko-kr",
+ "ru-ru",
+ "nl-nl",
+ "pl-pl",
+ "sv-se",
+ "da-dk",
+ "no-no",
+ "fi-fi",
+ "es-mx",
+ "fr-ca",
+ "tr-tr",
+ "ar-sa",
+ "he-il",
+ "hi-in",
+ "th-th",
+ "vi-vn",
+ "id-id",
+ "ms-my",
+ ]
+lang_from_path: true
+parallel_localization: false
+exclude_from_localization:
+ - assets
+ - sitemap.xml
+ - robots.txt
+ - CNAME
+kramdown:
+ input: GFM
+exclude:
+ - README.md
+ - vendor/
+ - tools/
+ - assets/extra/
collections:
products:
output: true
- permalink: /products/:name
\ No newline at end of file
+ permalink: /products/:name
+plugins:
+ - jekyll-polyglot
+ - pwindows-theme
diff --git a/_data/shop_translations.yml b/_data/shop_translations.yml
new file mode 100644
index 0000000..2afbaa9
--- /dev/null
+++ b/_data/shop_translations.yml
@@ -0,0 +1,173 @@
+en-us: &en
+ lookup_title_prefix: "Welcome to the"
+ lookup_title_shop: "PWindows Shop"
+ lookup_sub: "Look up your Minecraft player to browse PCoins. This is not an account sign-in."
+ username: "Minecraft username"
+ username_placeholder: "Your username..."
+ enter_shop: "Look up player"
+ checking: "Checking..."
+ invalid_username: "Enter a valid Minecraft username."
+ missing_username: "Please enter your username."
+ not_joined: "That player has not joined PWindows yet."
+ join_hint: "Join at play.pwindows.qzz.io first, then come back."
+ lookup_error: "Player lookup is unavailable. Please try again."
+ welcome: "Welcome!"
+ ready: "You’re ready to browse the PCoins shop. Checkout will revalidate your player."
+ browse: "Browse Coin Bundles"
+ switch_player: "Switch player"
+ shop_title: "PCoins Shop"
+ shop_sub: "Buy PCoins and spend them in-game."
+ search: "Search bundles"
+ search_placeholder: "Search bundles..."
+ categories: "Product categories"
+ all: "All"
+ coins: "Coins"
+ support: "Support"
+ products: "Products"
+ currency: "Currency"
+ most_popular: "Most Popular"
+ add_to_cart: "Add to Cart"
+ any_amount: "Any amount"
+ support_title: "Support PWindows"
+ support_description: "Love what we’re building? Help keep the servers alive."
+ donation_amount: "Donation amount"
+ add_support: "Add Support to Cart"
+ no_products: "No products found."
+ back_to_shop: "Back to Shop"
+ promo_code: "Promo code"
+ promo_placeholder: "Promo code (optional)"
+ apply: "Apply"
+ added_note: "Added items will appear in your shopping cart."
+ cart: "Cart"
+ open_cart: "Open shopping cart"
+ close_cart: "Close shopping cart"
+ items: "items"
+ shopping_cart: "Shopping Cart"
+ empty_cart: "Your cart is empty."
+ subtotal: "Subtotal:"
+ discount: "Discount:"
+ total: "Total:"
+ checkout: "Proceed to Checkout"
+ remove: "Remove"
+ processing: "Processing..."
+ checkout_placeholder: "Checkout is coming soon."
+ donation_invalid: "Enter a donation amount of at least one."
+ promo_coming_soon: "Promo codes are coming soon."
+ promo_saved: "Promo code saved for checkout."
+ added: "Added! ✓"
+zh-cn:
+ <<: *en
+ lookup_title_prefix: "欢迎来到"
+ lookup_title_shop: "PWindows 商店"
+ lookup_sub: "查询你的 Minecraft 玩家资料以浏览 PCoins。这不是账户登录。"
+ username: "Minecraft 用户名"
+ username_placeholder: "你的用户名……"
+ enter_shop: "查询玩家"
+ checking: "正在查询……"
+ invalid_username: "请输入有效的 Minecraft 用户名。"
+ missing_username: "请输入用户名。"
+ not_joined: "该玩家尚未加入 PWindows。"
+ join_hint: "请先加入 play.pwindows.qzz.io,然后返回。"
+ lookup_error: "玩家查询暂不可用,请重试。"
+ welcome: "欢迎!"
+ ready: "你现在可以浏览 PCoins 商店。结账时会重新验证玩家。"
+ browse: "浏览金币组合"
+ switch_player: "切换玩家"
+ shop_title: "PCoins 商店"
+ shop_sub: "购买 PCoins 并在游戏中使用。"
+ search: "搜索组合"
+ search_placeholder: "搜索组合……"
+ categories: "商品分类"
+ all: "全部"
+ coins: "金币"
+ support: "支持"
+ products: "商品"
+ currency: "货币"
+ most_popular: "最受欢迎"
+ add_to_cart: "加入购物车"
+ any_amount: "任意金额"
+ support_title: "支持 PWindows"
+ support_description: "喜欢我们的项目吗?帮助我们维持服务器运行。"
+ donation_amount: "支持金额"
+ add_support: "加入支持购物车"
+ no_products: "未找到商品。"
+ back_to_shop: "返回商店"
+ promo_code: "优惠码"
+ promo_placeholder: "优惠码(可选)"
+ apply: "应用"
+ added_note: "已添加的商品会显示在购物车中。"
+ cart: "购物车"
+ open_cart: "打开购物车"
+ close_cart: "关闭购物车"
+ items: "件商品"
+ shopping_cart: "购物车"
+ empty_cart: "购物车为空。"
+ subtotal: "小计:"
+ discount: "优惠:"
+ total: "总计:"
+ checkout: "前往结账"
+ remove: "移除"
+ processing: "处理中……"
+ checkout_placeholder: "结账功能即将推出。"
+ donation_invalid: "请输入至少为 1 的支持金额。"
+ promo_coming_soon: "优惠码功能即将推出。"
+ promo_saved: "优惠码已保存,将在结账时使用。"
+ added: "已添加 ✓"
+ja-jp:
+ <<: *en
+ lookup_title_prefix: "ようこそ"
+ lookup_title_shop: "PWindowsショップへ"
+ lookup_sub: "Minecraftプレイヤーを検索してPCoinsを閲覧します。これはアカウントへのログインではありません。"
+ username: "Minecraftユーザー名"
+ username_placeholder: "ユーザー名…"
+ enter_shop: "プレイヤーを検索"
+ checking: "確認中…"
+ invalid_username: "有効なMinecraftユーザー名を入力してください。"
+ missing_username: "ユーザー名を入力してください。"
+ not_joined: "このプレイヤーはまだPWindowsに参加していません。"
+ join_hint: "先に play.pwindows.qzz.io に参加してから戻ってください。"
+ lookup_error: "プレイヤー検索を利用できません。もう一度お試しください。"
+ welcome: "ようこそ!"
+ ready: "PCoinsショップを閲覧できます。購入時にプレイヤーを再確認します。"
+ browse: "コインバンドルを見る"
+ switch_player: "プレイヤーを変更"
+ shop_title: "PCoinsショップ"
+ shop_sub: "PCoinsを購入してゲーム内で使用できます。"
+ search: "バンドルを検索"
+ search_placeholder: "バンドルを検索…"
+ categories: "商品カテゴリー"
+ all: "すべて"
+ coins: "コイン"
+ support: "サポート"
+ products: "商品"
+ currency: "通貨"
+ most_popular: "人気商品"
+ add_to_cart: "カートに追加"
+ any_amount: "任意の金額"
+ support_title: "PWindowsを支援"
+ support_description: "私たちの活動を応援して、サーバー運営を支えてください。"
+ donation_amount: "支援金額"
+ add_support: "支援をカートに追加"
+ no_products: "商品が見つかりません。"
+ back_to_shop: "ショップに戻る"
+ promo_code: "プロモコード"
+ promo_placeholder: "プロモコード(任意)"
+ apply: "適用"
+ added_note: "追加した商品はショッピングカートに表示されます。"
+ cart: "カート"
+ open_cart: "ショッピングカートを開く"
+ close_cart: "ショッピングカートを閉じる"
+ items: "点"
+ shopping_cart: "ショッピングカート"
+ empty_cart: "カートは空です。"
+ subtotal: "小計:"
+ discount: "割引:"
+ total: "合計:"
+ checkout: "購入手続きへ"
+ remove: "削除"
+ processing: "処理中…"
+ checkout_placeholder: "購入機能は近日公開予定です。"
+ donation_invalid: "1以上の支援金額を入力してください。"
+ promo_coming_soon: "プロモコードは近日公開予定です。"
+ promo_saved: "プロモコードを購入用に保存しました。"
+ added: "追加済み ✓"
diff --git a/_data/site.yml b/_data/site.yml
new file mode 100644
index 0000000..c41ab3c
--- /dev/null
+++ b/_data/site.yml
@@ -0,0 +1,73 @@
+main_url: https://www.pwindows.qzz.io
+checkout_endpoint: https://your-worker.example.com/create-checkout
+checkout_allowed_hosts:
+ - checkout.stripe.com
+
+navigation:
+ - translation_key: about
+ path: /about
+ icon: /assets/mojang/svg/icons/book.png
+ icon_width: 160
+ icon_height: 160
+ - translation_key: news
+ path: /articles
+ icon: /assets/mojang/Invicon_Map.png
+ icon_width: 16
+ icon_height: 16
+ - translation_key: staff
+ path: /staff
+ icon: /assets/mojang/svg/icons/color-two-players.svg
+ icon_width: 32
+ icon_height: 32
+ - translation_key: departments
+ path: /departments/
+ icon: /assets/mojang/svg/icons/color-chest.svg
+ icon_width: 32
+ icon_height: 32
+ - translation_key: games
+ path: /games
+ icon: /assets/icons/controller.png
+ icon_width: 22
+ icon_height: 20
+
+footer_sections:
+ - translation_key: games
+ column_class: footer-column-center
+ path: /games
+ links:
+ - translation_key: sacred-cubes
+ path: /games/sacred-cubes
+ - translation_key: obby-of-dominance
+ path: /games/obby-of-dominance
+ - translation_key: departments
+ column_class: footer-column-departments
+ show_language: true
+ path: /departments/
+ links:
+ - translation_key: mcd
+ path: /departments/minecraft
+ - translation_key: rd
+ path: /departments/roblox
+ - translation_key: ud
+ path: /departments/unity
+ - translation_key: support
+ column_class: footer-column-right
+ show_shop: true
+ link_key: support
+ links:
+ - translation_key: feedback
+ path: /feedback
+ - translation_key: sitemap
+ path: /sitemap
+ - translation_key: contact
+ path: /contact
+ - translation_key: staff
+ path: /staff
+
+links:
+ support: https://discord.pwindows.qzz.io/
+ shop: https://shop.pwindows.qzz.io
+ discord: https://discord.pwindows.qzz.io/
+ youtube: https://www.youtube.com/@PWindows
+ twitter: https://x.com/pwindowsz
+ site_logo: /assets/PWindows.png
diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 0000000..90cd64d
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,72 @@
+{% assign footer_strings = site.data.translations[site.active_lang].site.footer %}
+{% assign ui = site.data.ui[site.active_lang] | default: site.data.ui[site.default_lang] %}
+{% assign main_site_url = site.data.site.main_url %}
+{% if site.active_lang != site.default_lang %}
+ {% capture main_site_url %}{{ site.data.site.main_url }}/{{ site.active_lang }}{% endcapture %}
+{% endif %}
+
+
diff --git a/_includes/header.html b/_includes/header.html
index ca9a6a7..863015b 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -1,73 +1,86 @@
-
-
+{% assign header_strings = site.data.translations[site.active_lang].site.header %}
+{% assign ui = site.data.ui[site.active_lang] | default: site.data.ui[site.default_lang] %}
+{% assign shop_strings = site.data.shop_translations[site.active_lang] | default: site.data.shop_translations[site.default_lang] %}
+{% assign main_site_url = site.data.site.main_url %}
+{% if site.active_lang != site.default_lang %}
+ {% capture main_site_url %}{{ site.data.site.main_url }}/{{ site.active_lang }}{% endcapture %}
+{% endif %}
+
+