The statement for task #10: English and Russian languages, the currency, SEO.
Goal. Visitors get the app in English at the root and in Russian on a separate page. Each bill has its own currency (dollars or rubles), it travels in the "Share" link and survives a language switch. Both pages are fully indexable: complete metadata, a sitemap, robots, a preview image and text visible without JavaScript.
What was checked in the sandbox. The npm registry is available, Lighthouse 13 runs with the preinstalled Chromium. Now on the main page performance, accessibility and best practices give 1.0, SEO 0.9 — the points are lost only because of the missing description. The Astro container can render components inside Vitest together with the Solid island. The sitemap plugin writes an index and one sitemap file, with one sitemap.xml file it will not do. The Intl format for 1250.50: $1,250.50 and ₽1,250.50 on the English page, 1 250,50 $ and 1 250,50 ₽ on the Russian one.
Phase 1, the link with a currency. A new file with the list of currencies and the code check. The link format of version 2 is the names, the expenses and the currency code; version 1 is still read, the currency is then the default for the page. An unknown currency, a missing currency or an extra element is an invalid bill. Criteria: old links open as before, the encoding round trip keeps the bill and the currency.
Phase 2, dictionaries and formatting. All interface texts move to dictionaries in English and Russian with one type, a missing key is a type error. Plurals through Intl.PluralRules, amounts through Intl.NumberFormat, the language is available inside the island through a context. The Russian texts stay verbatim, the English ones are new. The currency becomes the state of the app. Criteria: there are no interface strings in components outside the dictionaries, the Russian page looks as before, the app renders in English.
Phase 3, two static pages and a language switch. One template page builds both languages. The link to the other language carries the bill and the currency in the address; without a fragment only when the bill is empty and the currency is the default. Criteria: the pages have the right lang, the link keeps the bill, there are no redirects and no reading of the browser language.
Phase 4, the currency switch. An ordinary select with a hidden label in the header next to the language link. A change of the currency changes all amounts and the address, and the "link copied" state is reset. In the header at 360 px everything fits without horizontal scroll.
Phase 5, SEO. The site address in the build settings, the sitemap plugin, robots.txt from the same settings, the page head with title, description, canonical, three hreflang, Open Graph, Twitter and JSON-LD WebApplication, a static block "How it works", two preview images of 1200×630.
Phase 6, documentation, screenshots, Lighthouse. The project rules and the README describe the languages and currencies and how to add them; screenshots in both languages, the Lighthouse reports in the documentation; the last commit closes the task.
Tests: currencies, the link format (including fixed strings of the old and new versions), formatting and plurals, dictionaries, the explanation of the calculation in both languages, the app on both pages, metadata and robots, the page render through the container.
Out of scope, noticed: robots.txt on a GitHub project page does not lie at the host root, so the sitemap is useful only if it is submitted to the search console; the type "kopecks" cannot be renamed without touching the calculation; the amount input does not take the language into account; the avatar uses the Russian locale; there is no separate theme-color for the dark theme.
Decisions without the human: the format version 2 with the currency as the third element; the currency is not a field of the bill but lives next to it, so the calculation and its tests do not change; abbreviated currency signs (narrowSymbol); the currency is chosen by an ordinary select, the language by a link with the name in its own language; the language link encodes the current bill anew; one page file instead of two; the site address is taken from the GitHub Pages setting; the sitemap index plus a sitemap file, robots.txt is built from the same setting; one preview image per language; Lighthouse through npx with the preinstalled Chromium, three runs and the median, the reports in the documentation; the amount input does not change; the Russian texts verbatim; the block "How it works" is static markup outside the island.