Bladeren bron

chore: fix domain name in vue files and add sitemap generator script

unknown 2 maanden geleden
bovenliggende
commit
f8559968e5
8 gewijzigde bestanden met toevoegingen van 510 en 20 verwijderingen
  1. 2 1
      package.json
  2. 1 1
      public/robots.txt
  3. 426 12
      public/sitemap.xml
  4. 75 0
      scripts/generate_sitemap.py
  5. 2 2
      src/components/Footer.vue
  6. 2 2
      src/pages/Contact.vue
  7. 1 1
      src/pages/HelpCenter.vue
  8. 1 1
      src/pages/Terms.vue

+ 2 - 1
package.json

@@ -5,8 +5,9 @@
   "type": "module",
   "type": "module",
   "scripts": {
   "scripts": {
     "dev": "npm run i18n:generate && vite",
     "dev": "npm run i18n:generate && vite",
-    "build": "npm run i18n:generate && vue-tsc && vite build",
+    "build": "npm run i18n:generate && npm run sitemap:generate && vue-tsc && vite build",
     "i18n:generate": "backend/venv/bin/python3 scripts/manage_locales.py split",
     "i18n:generate": "backend/venv/bin/python3 scripts/manage_locales.py split",
+    "sitemap:generate": "backend/venv/bin/python3 scripts/generate_sitemap.py",
     "i18n:merge": "backend/venv/bin/python3 scripts/manage_locales.py merge",
     "i18n:merge": "backend/venv/bin/python3 scripts/manage_locales.py merge",
     "i18n:check": "backend/venv/bin/python3 scripts/manage_locales.py missing",
     "i18n:check": "backend/venv/bin/python3 scripts/manage_locales.py missing",
     "lint": "eslint . --ext ts,vue --report-unused-disable-directives --max-warnings 0",
     "lint": "eslint . --ext ts,vue --report-unused-disable-directives --max-warnings 0",

+ 1 - 1
public/robots.txt

@@ -3,4 +3,4 @@ Allow: /
 Disallow: /admin
 Disallow: /admin
 Disallow: /orders
 Disallow: /orders
 
 
-Sitemap: https://radionica3d.com/sitemap.xml
+Sitemap: https://radionica3d.me/sitemap.xml

+ 426 - 12
public/sitemap.xml

@@ -1,29 +1,443 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
   <url>
   <url>
-    <loc>https://radionica3d.com/</loc>
-    <lastmod>2026-01-01</lastmod>
+    <loc>https://radionica3d.me/en/</loc>
+    <lastmod>2026-04-23</lastmod>
     <changefreq>weekly</changefreq>
     <changefreq>weekly</changefreq>
     <priority>1.0</priority>
     <priority>1.0</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/"/>
   </url>
   </url>
   <url>
   <url>
-    <loc>https://radionica3d.com/portfolio</loc>
-    <lastmod>2026-01-01</lastmod>
+    <loc>https://radionica3d.me/me/</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>weekly</changefreq>
+    <priority>1.0</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>weekly</changefreq>
+    <priority>1.0</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>weekly</changefreq>
+    <priority>1.0</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/portfolio</loc>
+    <lastmod>2026-04-23</lastmod>
     <changefreq>daily</changefreq>
     <changefreq>daily</changefreq>
     <priority>0.8</priority>
     <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/portfolio"/>
   </url>
   </url>
   <url>
   <url>
-    <loc>https://radionica3d.com/blog</loc>
-    <lastmod>2026-01-01</lastmod>
-    <changefreq>weekly</changefreq>
-    <priority>0.7</priority>
+    <loc>https://radionica3d.me/me/portfolio</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/portfolio"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/portfolio</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/portfolio"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/portfolio</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/portfolio"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/portfolio"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/about</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/about"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/about"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/about"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/about"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/about"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/about</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/about"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/about"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/about"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/about"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/about"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/about</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/about"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/about"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/about"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/about"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/about"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/about</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/about"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/about"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/about"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/about"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/about"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/blog</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/blog"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/blog"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/blog"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/blog"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/blog"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/blog</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/blog"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/blog"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/blog"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/blog"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/blog"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/blog</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/blog"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/blog"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/blog"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/blog"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/blog"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/blog</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>daily</changefreq>
+    <priority>0.8</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/blog"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/blog"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/blog"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/blog"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/blog"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/contact</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/contact"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/contact"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/contact"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/contact"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/contact"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/contact</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/contact"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/contact"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/contact"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/contact"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/contact"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/contact</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/contact"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/contact"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/contact"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/contact"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/contact"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/contact</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/contact"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/contact"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/contact"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/contact"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/contact"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/help</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/help"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/help"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/help"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/help"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/help"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/help</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/help"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/help"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/help"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/help"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/help"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/help</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/help"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/help"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/help"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/help"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/help"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/help</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/help"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/help"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/help"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/help"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/help"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/guidelines</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/guidelines"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/guidelines</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/guidelines"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/guidelines</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/guidelines"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/guidelines</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/guidelines"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/guidelines"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/privacy</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/privacy"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/privacy"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/privacy"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/privacy</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/privacy"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/privacy"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/privacy"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/privacy</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/privacy"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/privacy"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/privacy"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/privacy</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/privacy"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/privacy"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/privacy"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/privacy"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/terms</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/terms"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/terms"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/terms"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/terms"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/terms"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/terms</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/terms"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/terms"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/terms"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/terms"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/terms"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ru/terms</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/terms"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/terms"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/terms"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/terms"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/terms"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/ua/terms</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/terms"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/terms"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/terms"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/terms"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/terms"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/en/careers</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/careers"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/careers"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/careers"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/careers"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/careers"/>
+  </url>
+  <url>
+    <loc>https://radionica3d.me/me/careers</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
+    <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/careers"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/careers"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/careers"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/careers"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/careers"/>
   </url>
   </url>
   <url>
   <url>
-    <loc>https://radionica3d.com/about</loc>
+    <loc>https://radionica3d.me/ru/careers</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
     <priority>0.5</priority>
     <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/careers"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/careers"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/careers"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/careers"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/careers"/>
   </url>
   </url>
   <url>
   <url>
-    <loc>https://radionica3d.com/contact</loc>
+    <loc>https://radionica3d.me/ua/careers</loc>
+    <lastmod>2026-04-23</lastmod>
+    <changefreq>monthly</changefreq>
     <priority>0.5</priority>
     <priority>0.5</priority>
+    <xhtml:link rel="alternate" hreflang="en" href="https://radionica3d.me/en/careers"/>
+    <xhtml:link rel="alternate" hreflang="me" href="https://radionica3d.me/me/careers"/>
+    <xhtml:link rel="alternate" hreflang="ru" href="https://radionica3d.me/ru/careers"/>
+    <xhtml:link rel="alternate" hreflang="ua" href="https://radionica3d.me/ua/careers"/>
+    <xhtml:link rel="alternate" hreflang="x-default" href="https://radionica3d.me/me/careers"/>
   </url>
   </url>
-</urlset>
+</urlset>

+ 75 - 0
scripts/generate_sitemap.py

@@ -0,0 +1,75 @@
+import os
+from datetime import datetime
+
+# Настройки
+DOMAIN = "https://radionica3d.me"
+LANGUAGES = ["en", "me", "ru", "ua"]
+# Список публичных страниц (без учета языка)
+PAGES = [
+    "",
+    "portfolio",
+    "about",
+    "blog",
+    "contact",
+    "help",
+    "guidelines",
+    "privacy",
+    "terms",
+    "careers"
+]
+
+def generate_sitemap():
+    xml = ['<?xml version="1.0" encoding="UTF-8"?>']
+    xml.append('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">')
+    
+    # Добавляем каждую страницу для каждого языка
+    for page in PAGES:
+        for lang in LANGUAGES:
+            # Формируем путь: /lang/page (если page пустая, то просто /lang/)
+            path = f"/{lang}/{page}" if page else f"/{lang}/"
+            
+            # Приоритеты
+            if page == "":
+                priority = "1.0"
+                freq = "weekly"
+            elif page in ["portfolio", "blog"]:
+                priority = "0.8"
+                freq = "daily"
+            else:
+                priority = "0.5"
+                freq = "monthly"
+            
+            url = f"{DOMAIN}{path}"
+            xml.append('  <url>')
+            xml.append(f'    <loc>{url}</loc>')
+            xml.append(f'    <lastmod>{datetime.now().strftime("%Y-%m-%d")}</lastmod>')
+            xml.append(f'    <changefreq>{freq}</changefreq>')
+            xml.append(f'    <priority>{priority}</priority>')
+            
+            # Добавляем ссылки на альтернативные языковые версии
+            for alt_lang in LANGUAGES:
+                alt_path = f"/{alt_lang}/{page}" if page else f"/{alt_lang}/"
+                xml.append(f'    <xhtml:link rel="alternate" hreflang="{alt_lang}" href="{DOMAIN}{alt_path}"/>')
+            
+            # x-default (пусть будет ME как основной или просто без префикса, но у нас роутер всегда редиректит)
+            # В нашем случае x-default укажем на ME
+            xml.append(f'    <xhtml:link rel="alternate" hreflang="x-default" href="{DOMAIN}/me/{page if page else ""}"/>')
+            
+            xml.append('  </url>')
+    
+    xml.append('</urlset>')
+    
+    content = "\n".join(xml)
+    
+    # Путь к public/sitemap.xml
+    # Скрипт лежит в scripts/, так что идем на уровень выше
+    root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+    sitemap_path = os.path.join(root_dir, "public", "sitemap.xml")
+    
+    with open(sitemap_path, "w", encoding="utf-8") as f:
+        f.write(content)
+    
+    print(f"Sitemap generated with {len(PAGES) * len(LANGUAGES)} URLs at {sitemap_path}")
+
+if __name__ == "__main__":
+    generate_sitemap()

+ 2 - 2
src/components/Footer.vue

@@ -7,8 +7,8 @@
           <Logo />
           <Logo />
           <p class="text-foreground/40 text-sm mt-3 mb-4 max-w-sm font-medium leading-relaxed">{{ t("footer.tagline") }}</p>
           <p class="text-foreground/40 text-sm mt-3 mb-4 max-w-sm font-medium leading-relaxed">{{ t("footer.tagline") }}</p>
           <div class="space-y-2">
           <div class="space-y-2">
-            <a href="mailto:hello@radionica3d.com" class="flex items-center gap-2 text-xs font-bold text-foreground/40 hover:text-primary transition-colors">
-              <Mail class="w-3.5 h-3.5" />hello@radionica3d.com
+            <a href="mailto:hello@radionica3d.me" class="flex items-center gap-2 text-xs font-bold text-foreground/40 hover:text-primary transition-colors">
+              <Mail class="w-3.5 h-3.5" />hello@radionica3d.me
             </a>
             </a>
             <div class="flex items-center gap-2 text-xs font-bold text-foreground/40">
             <div class="flex items-center gap-2 text-xs font-bold text-foreground/40">
               <MapPin class="w-3.5 h-3.5" />{{ t("footer.location") }}
               <MapPin class="w-3.5 h-3.5" />{{ t("footer.location") }}

+ 2 - 2
src/pages/Contact.vue

@@ -31,8 +31,8 @@
                   <h3 class="font-display font-bold text-foreground mb-1">
                   <h3 class="font-display font-bold text-foreground mb-1">
                     {{ t("contact.info.email.title") }}
                     {{ t("contact.info.email.title") }}
                   </h3>
                   </h3>
-                  <a href="mailto:hello@radionica3d.com" class="text-foreground/70 hover:text-primary transition-colors">
-                    hello@radionica3d.com
+                  <a href="mailto:hello@radionica3d.me" class="text-foreground/70 hover:text-primary transition-colors">
+                    hello@radionica3d.me
                   </a>
                   </a>
                   <p class="text-sm text-foreground/60 mt-1">
                   <p class="text-sm text-foreground/60 mt-1">
                     {{ t("contact.info.email.description") }}
                     {{ t("contact.info.email.description") }}

+ 1 - 1
src/pages/HelpCenter.vue

@@ -159,7 +159,7 @@
               {{ t("help.contact.button") }}
               {{ t("help.contact.button") }}
             </router-link>
             </router-link>
             <a 
             <a 
-              href="mailto:support@radionica3d.com"
+              href="mailto:support@radionica3d.me"
               class="inline-flex items-center justify-center px-6 py-3 border border-gray-300 text-foreground font-bold rounded-lg hover:bg-gray-50 transition-colors"
               class="inline-flex items-center justify-center px-6 py-3 border border-gray-300 text-foreground font-bold rounded-lg hover:bg-gray-50 transition-colors"
             >
             >
               {{ t("help.contact.email") }}
               {{ t("help.contact.email") }}

+ 1 - 1
src/pages/Terms.vue

@@ -249,7 +249,7 @@
                 {{ t("terms.contact.button") }}
                 {{ t("terms.contact.button") }}
               </router-link>
               </router-link>
               <a 
               <a 
-                href="mailto:legal@radionica3d.com"
+                href="mailto:legal@radionica3d.me"
                 class="inline-flex items-center justify-center px-6 py-3 border border-gray-300 text-foreground font-bold rounded-lg hover:bg-gray-50 transition-colors"
                 class="inline-flex items-center justify-center px-6 py-3 border border-gray-300 text-foreground font-bold rounded-lg hover:bg-gray-50 transition-colors"
               >
               >
                 {{ t("terms.contact.email") }}
                 {{ t("terms.contact.email") }}