Merge pull request #582 from the-luap/feat/slovenian-locale-580

feat(i18n): add Slovenian (sl) language support
This commit is contained in:
Paul Nothaft
2026-05-29 22:05:32 +02:00
committed by GitHub
4 changed files with 3421 additions and 0 deletions
@@ -0,0 +1,392 @@
/**
* Migration: seed Slovenian (sl) email-template translations.
*
* Covers all email templates currently seeded by PicPeak:
* - gallery delivery templates
* - administrator account templates
* - backup/restore notifications
* - update notifications
* - customer account templates
*
* Idempotent: checks (template_id, language) before inserting so re-runs
* are safe and do not overwrite rows that an admin may have edited in the UI.
*/
const TRANSLATIONS = {
admin_invitation: {
sl: {
subject: 'Povabljeni ste, da se pridružite PicPeak kot {{role_name}}',
body_html: `
<h2>Dobrodošli v PicPeak!</h2>
<p>Povabljeni ste, da se pridružite platformi PicPeak za deljenje fotografij kot <strong>{{role_name}}</strong>.</p>
<div style="background-color: #f0f8ff; border-left: 4px solid #5C8762; padding: 20px; margin: 20px 0; border-radius: 4px;">
<p style="margin: 0;"><strong>Vaša vloga:</strong> {{role_name}}</p>
<p style="margin: 10px 0 0 0;">Ta vloga vam omogoča upravljanje in administracijo platforme za deljenje fotografij.</p>
</div>
<p>Za sprejem povabila in nastavitev računa kliknite spodnji gumb:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{invite_link}}" style="display: inline-block; padding: 14px 35px; background-color: #5C8762; color: white; text-decoration: none; border-radius: 5px; font-weight: 600; font-size: 16px;">Sprejmi povabilo</a>
</div>
<div style="background-color: #fff3cd; border: 1px solid #ffeaa7; color: #856404; padding: 15px; border-radius: 4px; margin: 20px 0;">
<p style="margin: 0;"><strong>Pomembno:</strong> To povabilo poteče dne <strong>{{expires_at}}</strong>. Sprejmite ga pred tem datumom.</p>
</div>
<p>Če tega povabila niste pričakovali ali menite, da je bilo poslano pomotoma, lahko to e-pošto varno prezrete.</p>
<p style="color: #666; font-size: 13px; margin-top: 30px;">
Če zgornji gumb ne deluje, kopirajte to povezavo v brskalnik:<br>
<a href="{{invite_link}}" style="color: #5C8762; word-break: break-all;">{{invite_link}}</a>
</p>
<p>Lep pozdrav,<br>
ekipa PicPeak</p>`,
body_text: 'Dobrodošli v PicPeak!\n\nPovabljeni ste, da se pridružite platformi PicPeak za deljenje fotografij kot {{role_name}}.\n\nVaša vloga: {{role_name}}\nTa vloga vam omogoča upravljanje in administracijo platforme za deljenje fotografij.\n\nZa sprejem povabila in nastavitev računa obiščite povezavo:\n{{invite_link}}\n\nPOMEMBNO: To povabilo poteče dne {{expires_at}}. Sprejmite ga pred tem datumom.\n\nČe tega povabila niste pričakovali ali menite, da je bilo poslano pomotoma, lahko to e-pošto varno prezrete.\n\nLep pozdrav,\nekipa PicPeak',
},
},
admin_password_reset: {
sl: {
subject: 'Vaše PicPeak administratorsko geslo je bilo ponastavljeno',
body_html: `
<h2>Obvestilo o ponastavitvi gesla</h2>
<p>Pozdravljeni <strong>{{username}}</strong>,</p>
<p>Vaše administratorsko geslo za PicPeak je ponastavil sistemski administrator.</p>
<div style="background-color: #f9f9f9; padding: 20px; border-radius: 8px; margin: 20px 0;">
<h3 style="margin-top: 0;">Vaši novi prijavni podatki:</h3>
<ul style="list-style: none; padding: 0;">
<li style="margin-bottom: 10px;"><strong>Uporabniško ime:</strong> {{username}}</li>
<li style="margin-bottom: 10px;"><strong>Začasno geslo:</strong> <code style="background-color: #e9ecef; padding: 4px 8px; border-radius: 4px; font-family: monospace; font-size: 14px;">{{new_password}}</code></li>
</ul>
</div>
<div style="background-color: #fee; border: 1px solid #fcc; color: #c33; padding: 20px; border-radius: 8px; margin: 20px 0;">
<p style="margin: 0; font-weight: bold; font-size: 16px;">Varnostno obvestilo</p>
<ul style="margin: 10px 0 0 0; padding-left: 20px;">
<li>To je začasno geslo. Po prijavi ga takoj spremenite.</li>
<li>Svojega gesla nikoli ne delite z drugimi.</li>
<li>Če ponastavitve gesla niste pričakovali, se takoj obrnite na sistemskega administratorja.</li>
</ul>
</div>
<p>Za prijavo v administratorski vmesnik kliknite spodnji gumb:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{admin_login_url}}" style="display: inline-block; padding: 14px 35px; background-color: #5C8762; color: white; text-decoration: none; border-radius: 5px; font-weight: 600; font-size: 16px;">Prijava</a>
</div>
<p style="color: #666; font-size: 13px;">Po prijavi odprite nastavitve profila in geslo spremenite v varno geslo, ki ga poznate samo vi.</p>
<p>Lep pozdrav,<br>
ekipa PicPeak</p>`,
body_text: 'Obvestilo o ponastavitvi gesla\n\nPozdravljeni {{username}},\n\nVaše administratorsko geslo za PicPeak je ponastavil sistemski administrator.\n\nVaši novi prijavni podatki:\n- Uporabniško ime: {{username}}\n- Začasno geslo: {{new_password}}\n\nVARNOSTNO OBVESTILO:\n- To je začasno geslo. Po prijavi ga takoj spremenite.\n- Svojega gesla nikoli ne delite z drugimi.\n- Če ponastavitve gesla niste pričakovali, se takoj obrnite na sistemskega administratorja.\n\nZa prijavo v administratorski vmesnik obiščite: {{admin_login_url}}\n\nPo prijavi odprite nastavitve profila in geslo spremenite v varno geslo, ki ga poznate samo vi.\n\nLep pozdrav,\nekipa PicPeak',
},
},
archive_complete: {
sl: {
subject: 'Arhiviranje končano: {{event_name}}',
body_html: `<h2>Arhiviranje je končano</h2>
<p>Spoštovani {{host_name}},</p>
<p>Vaša fotogalerija "{{event_name}}" je bila uspešno arhivirana.</p>
<p><strong>Podrobnosti arhiva:</strong></p>
<ul>
<li>Število fotografij: {{photo_count}}</li>
<li>Velikost arhiva: {{archive_size}}</li>
<li>Datum arhiviranja: {{archive_date}}</li>
</ul>`,
body_text: 'Arhiviranje je končano\n\nSpoštovani {{host_name}},\n\nVaša fotogalerija "{{event_name}}" je bila uspešno arhivirana.\n\nFotografije: {{photo_count}}\nVelikost: {{archive_size}}\nDatum arhiviranja: {{archive_date}}',
},
},
backup_completed: {
sl: {
subject: 'Varnostna kopija uspešno ustvarjena',
body_html: `<h2>Varnostna kopija je bila uspešno ustvarjena</h2>
<p>Načrtovana varnostna kopija je bila uspešno zaključena.</p>
<p><strong>Povzetek varnostne kopije:</strong></p>
<ul>
<li>Začetek: {{start_time}}</li>
<li>Trajanje: {{duration}}</li>
<li>Število varnostno kopiranih datotek: {{files_count}}</li>
<li>Skupna velikost: {{total_size}}</li>
<li>Vrsta varnostne kopije: {{backup_type}}</li>
</ul>`,
body_text: 'Varnostna kopija je bila uspešno ustvarjena\n\nNačrtovana varnostna kopija je bila uspešno zaključena.\n\nZačetek: {{start_time}}\nTrajanje: {{duration}}\nŠtevilo varnostno kopiranih datotek: {{files_count}}\nSkupna velikost: {{total_size}}\nVrsta varnostne kopije: {{backup_type}}',
},
},
backup_failed: {
sl: {
subject: 'Varnostno kopiranje ni uspelo - potrebno je takojšnje ukrepanje',
body_html: `<h2>Varnostno kopiranje ni uspelo</h2>
<p>Načrtovano varnostno kopiranje ni uspelo in zahteva takojšnjo pozornost.</p>
<p><strong>Podrobnosti napake:</strong></p>
<ul>
<li>Začetek: {{start_time}}</li>
<li>Vrsta varnostne kopije: {{backup_type}}</li>
<li>Napaka: {{error_message}}</li>
</ul>
<p>Preverite sistemske dnevnike za več podrobnosti in čim prej odpravite težavo.</p>`,
body_text: 'Varnostno kopiranje ni uspelo\n\nNačrtovano varnostno kopiranje ni uspelo in zahteva takojšnjo pozornost.\n\nZačetek: {{start_time}}\nVrsta varnostne kopije: {{backup_type}}\nNapaka: {{error_message}}\n\nPreverite sistemske dnevnike za več podrobnosti.',
},
},
customer_gallery_assigned: {
sl: {
subject: 'V vašem računu je na voljo nova galerija',
body_html: `<h2>Dodeljen vam je bil dostop do novih galerij</h2>
<p>Pozdravljeni {{customer_name}},</p>
{{#if singular}}<p>Fotograf vam je pravkar dodelil dostop do nove galerije v vašem računu:</p>{{/if}}{{#if multiple}}<p>Fotograf vam je pravkar dodelil dostop do {{gallery_count}} novih galerij v vašem računu:</p>{{/if}}
{{gallery_list_html}}
<p style="text-align: center; margin: 30px 0;">
<a href="{{dashboard_link}}" class="button">Odpri nadzorno ploščo</a>
</p>
<p style="font-size: 13px; color: #666;">Če gumb ne deluje, kopirajte to povezavo v brskalnik:<br>
<span style="word-break: break-all;">{{dashboard_link}}</span></p>`,
body_text: 'Dodeljen vam je bil dostop do novih galerij\n\nPozdravljeni {{customer_name}},\n\nFotograf vam je pravkar dodelil dostop do {{gallery_count}} nove galerije oziroma novih galerij v vašem računu:\n\n{{gallery_list_text}}\n\nOdpri nadzorno ploščo: {{dashboard_link}}',
},
},
customer_invitation: {
sl: {
subject: 'Povabljeni ste k dostopu do svojih fotogalerij',
body_html: `
<h2>Dobrodošli v svojih fotogalerijah</h2>
<p>Povabljeni ste, da ustvarite uporabniški račun, kjer boste lahko vse svoje galerije dogodkov pregledovali na enem mestu — brez ločenih povezav in gesel.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{invite_link}}" class="button">Nastavi račun</a>
</div>
<p>To povabilo poteče dne {{expires_at}}. Če povezava ne deluje, jo kopirajte v brskalnik:</p>
<p style="word-break: break-all; font-size: 13px; color: #666;">{{invite_link}}</p>
<p>Če tega e-poštnega sporočila niste pričakovali, ga lahko varno prezrete.</p>`,
body_text: 'Dobrodošli v svojih fotogalerijah\n\nPovabljeni ste, da ustvarite uporabniški račun, kjer boste lahko vse svoje galerije dogodkov pregledovali na enem mestu — brez ločenih povezav in gesel.\n\nNastavi račun: {{invite_link}}\n\nTo povabilo poteče dne {{expires_at}}.\n\nČe tega e-poštnega sporočila niste pričakovali, ga lahko varno prezrete.',
},
},
customer_password_reset: {
sl: {
subject: 'Ponastavitev gesla za vaš uporabniški račun',
body_html: `<p>Pozdravljeni,</p>
<p>Vaš fotograf je sprožil ponastavitev gesla za vaš uporabniški račun.</p>
<p><a href="{{reset_link}}" class="button">Nastavi novo geslo</a></p>
<p>Ta povezava poteče dne {{expires_at}}.</p>
<p>Če tega niste pričakovali, lahko sporočilo prezrete — vaše trenutno geslo bo delovalo še naprej, dokler ne kliknete povezave.</p>`,
body_text: 'Ponastavitev gesla za vaš uporabniški račun\n\nVaš fotograf je sprožil ponastavitev gesla za vaš uporabniški račun.\n\nNastavi novo geslo: {{reset_link}}\n\nTa povezava poteče dne {{expires_at}}.\n\nČe tega niste pričakovali, lahko sporočilo prezrete — vaše trenutno geslo bo delovalo še naprej, dokler ne kliknete povezave.',
},
},
database_backup_completed: {
sl: {
subject: 'Varnostna kopija podatkovne baze uspešno ustvarjena',
body_html: `<h2>Varnostna kopija podatkovne baze je bila uspešno ustvarjena</h2>
<p>Načrtovano varnostno kopiranje podatkovne baze je bilo uspešno zaključeno.</p>
<p><strong>Povzetek varnostne kopije:</strong></p>
<ul>
<li>Vrsta varnostne kopije: {{backup_type}}</li>
<li>Trajanje: {{duration}}</li>
<li>Velikost datoteke: {{file_size}}</li>
<li>Razmerje stiskanja: {{compression_ratio}}</li>
<li>Pot do datoteke: {{file_path}}</li>
</ul>`,
body_text: 'Varnostna kopija podatkovne baze je bila uspešno ustvarjena\n\nNačrtovano varnostno kopiranje podatkovne baze je bilo uspešno zaključeno.\n\nVrsta varnostne kopije: {{backup_type}}\nTrajanje: {{duration}}\nVelikost datoteke: {{file_size}}\nRazmerje stiskanja: {{compression_ratio}}\nPot do datoteke: {{file_path}}',
},
},
database_backup_failed: {
sl: {
subject: 'Varnostno kopiranje podatkovne baze ni uspelo - kritično opozorilo',
body_html: `<h2>Varnostno kopiranje podatkovne baze ni uspelo</h2>
<p>Načrtovano varnostno kopiranje podatkovne baze ni uspelo in zahteva takojšnjo pozornost.</p>
<p><strong>Podrobnosti napake:</strong></p>
<ul>
<li>Vrsta varnostne kopije: {{backup_type}}</li>
<li>Časovni žig: {{timestamp}}</li>
<li>Napaka: {{error_message}}</li>
</ul>
<p>To je kritična težava, ki lahko vpliva na obnovitev po izpadu. Čim prej jo preverite.</p>`,
body_text: 'Varnostno kopiranje podatkovne baze ni uspelo\n\nNačrtovano varnostno kopiranje podatkovne baze ni uspelo.\n\nVrsta varnostne kopije: {{backup_type}}\nČasovni žig: {{timestamp}}\nNapaka: {{error_message}}\n\nTo je kritična težava - preverite jo čim prej.',
},
},
expiration_warning: {
sl: {
subject: 'Vaša fotogalerija bo kmalu potekla',
body_html: `<h2>Galerija bo kmalu potekla</h2>
<p>Spoštovani {{host_name}},</p>
<p>Vaša fotogalerija "{{event_name}}" bo potekla čez {{days_remaining}} dni.</p>
<p>Po poteku bo galerija arhivirana in gostom ne bo več dostopna.</p>
<p><a href="{{gallery_link}}">Odpri galerijo</a></p>`,
body_text: 'Galerija bo kmalu potekla\n\nSpoštovani {{host_name}},\n\nVaša fotogalerija "{{event_name}}" bo potekla čez {{days_remaining}} dni.\n\nGalerija: {{gallery_link}}',
},
},
gallery_created: {
sl: {
subject: 'Vaša fotogalerija je pripravljena!',
body_html: `<h2>Galerija je bila uspešno ustvarjena</h2>
<p>Spoštovani {{host_name}},</p>
<p>Vaša fotogalerija "{{event_name}}" je bila uspešno ustvarjena!</p>
<p><strong>Podrobnosti galerije:</strong></p>
<ul>
<li>Datum dogodka: {{event_date}}</li>
<li>Povezava do galerije: <a href="{{gallery_link}}">{{gallery_link}}</a></li>
<li>Geslo: {{gallery_password}}</li>
<li>Velja do: {{expiry_date}}</li>
</ul>
<p>Povezavo in geslo lahko delite z gosti, da si bodo lahko ogledali in prenesli fotografije.</p>
{{#if welcome_message}}<p><em>{{welcome_message}}</em></p>{{/if}}`,
body_text: 'Galerija je bila uspešno ustvarjena\n\nSpoštovani {{host_name}},\n\nVaša fotogalerija "{{event_name}}" je bila uspešno ustvarjena!\n\nPovezava do galerije: {{gallery_link}}\nGeslo: {{gallery_password}}\nVelja do: {{expiry_date}}',
},
},
gallery_expired: {
sl: {
subject: 'Vaša fotogalerija je potekla',
body_html: `<h2>Galerija je potekla</h2>
<p>Spoštovani {{host_name}},</p>
<p>Vaša fotogalerija "{{event_name}}" je potekla in ni več dostopna.</p>
<p>Fotografije so bile arhivirane. Če potrebujete dostop, se obrnite na administratorja na {{admin_email}}.</p>`,
body_text: 'Galerija je potekla\n\nSpoštovani {{host_name}},\n\nVaša fotogalerija "{{event_name}}" je potekla in ni več dostopna.\n\nKontakt: {{admin_email}}',
},
},
restore_completed: {
sl: {
subject: '✅ Obnovitev uspešno zaključena',
body_html: `<h2>Obnovitev je bila zaključena</h2>
<p>Obnovitev je bila uspešno zaključena.</p>
<h3>Podrobnosti:</h3>
<ul>
<li><strong>Vrsta obnovitve:</strong> {{restore_type}}</li>
<li><strong>Trajanje:</strong> {{duration}}</li>
<li><strong>Obnovljene datoteke:</strong> {{files_restored}}</li>
<li><strong>Velikost podatkovne baze:</strong> {{database_size}}</li>
</ul>
<p>Preverite, ali aplikacija deluje pravilno in ali so podatki dostopni.</p>`,
body_text: 'Obnovitev je bila uspešno zaključena\n\nVrsta obnovitve: {{restore_type}}\nTrajanje: {{duration}}\nObnovljene datoteke: {{files_restored}}\nVelikost podatkovne baze: {{database_size}}\n\nPreverite, ali aplikacija deluje pravilno in ali so podatki dostopni.',
},
},
restore_failed: {
sl: {
subject: '❌ Obnovitev ni uspela',
body_html: `<h2>Obnovitev ni uspela</h2>
<p>Obnovitev ni uspela in zahteva pozornost.</p>
<h3>Podrobnosti:</h3>
<ul>
<li><strong>Vrsta obnovitve:</strong> {{restore_type}}</li>
<li><strong>Napaka:</strong> {{error_message}}</li>
<li><strong>Časovni žig:</strong> {{timestamp}}</li>
</ul>
<p>Preverite sistemske dnevnike za več podrobnosti in odpravite težavo pred ponovnim poskusom.</p>`,
body_text: 'Obnovitev ni uspela\n\nObnovitev ni uspela in zahteva pozornost.\n\nVrsta obnovitve: {{restore_type}}\nNapaka: {{error_message}}\nČasovni žig: {{timestamp}}\n\nPreverite sistemske dnevnike za več podrobnosti in odpravite težavo pred ponovnim poskusom.',
},
},
version_update_available: {
sl: {
subject: 'Na voljo je posodobitev PicPeak: različica {{new_version}}',
body_html: `
<h2>Na voljo je nova različica PicPeak</h2>
<p>Dobra novica! Za vašo namestitev je na voljo nova različica PicPeak.</p>
<div style="background-color: #f0f8ff; border-left: 4px solid #5C8762; padding: 20px; margin: 20px 0; border-radius: 4px;">
<p style="margin: 0;"><strong>Trenutna različica:</strong> {{current_version}}</p>
<p style="margin: 10px 0 0 0;"><strong>Nova različica:</strong> {{new_version}}</p>
<p style="margin: 10px 0 0 0;"><strong>Kanal:</strong> {{channel}}</p>
</div>
<p>Priporočamo, da pred posodobitvijo ustvarite varnostno kopijo podatkovne baze in naloženih datotek.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{release_notes_url}}" style="display: inline-block; padding: 14px 35px; background-color: #5C8762; color: white; text-decoration: none; border-radius: 5px; font-weight: 600; font-size: 16px;">Ogled opomb ob izdaji</a>
</div>
<p style="color: #666; font-size: 13px;">
Če gumb ne deluje, kopirajte to povezavo v brskalnik:<br>
<a href="{{release_notes_url}}" style="color: #5C8762; word-break: break-all;">{{release_notes_url}}</a>
</p>
<p>Lep pozdrav,<br>
ekipa PicPeak</p>`,
body_text: 'Na voljo je nova različica PicPeak\n\nDobra novica! Za vašo namestitev je na voljo nova različica PicPeak.\n\nTrenutna različica: {{current_version}}\nNova različica: {{new_version}}\nKanal: {{channel}}\n\nPriporočamo, da pred posodobitvijo ustvarite varnostno kopijo podatkovne baze in naloženih datotek.\n\nOpombe ob izdaji: {{release_notes_url}}\n\nLep pozdrav,\nekipa PicPeak',
},
},
version_update_test: {
sl: {
subject: '[TEST] PicPeak obvestilo o posodobitvi — preverjanje nastavitev',
body_html: `<h2>To je testno e-poštno sporočilo</h2>
<p>To sporočilo ste prejeli, ker je administrator na strani za obvestila o posodobitvah
v vaši namestitvi PicPeak kliknil <strong>Pošlji testno e-pošto</strong>.</p>
<div style="background-color: #f0f8ff; border-left: 4px solid #5C8762; padding: 20px; margin: 20px 0; border-radius: 4px;">
<p style="margin: 0;"><strong>Rezultat:</strong> Nastavitve e-pošte za obvestila o posodobitvah delujejo.</p>
</div>
<p>Če tega testa niste sprožili vi, preverite nedavno administratorsko aktivnost.</p>`,
body_text: 'To je testno e-poštno sporočilo\n\nTo sporočilo ste prejeli, ker je administrator na strani za obvestila o posodobitvah v vaši namestitvi PicPeak kliknil Pošlji testno e-pošto.\n\nRezultat: Nastavitve e-pošte za obvestila o posodobitvah delujejo.\n\nČe tega testa niste sprožili vi, preverite nedavno administratorsko aktivnost.',
},
},
};
exports.up = async function(knex) {
if (!(await knex.schema.hasTable('email_templates'))) return;
if (!(await knex.schema.hasTable('email_template_translations'))) return;
const rows = await knex('email_templates')
.whereIn('template_key', Object.keys(TRANSLATIONS))
.select('id', 'template_key');
const keyToId = Object.fromEntries(rows.map((r) => [r.template_key, r.id]));
let inserted = 0;
let skipped = 0;
let missing = 0;
for (const [key, perLocale] of Object.entries(TRANSLATIONS)) {
const templateId = keyToId[key];
if (!templateId) {
missing += 1;
continue;
}
for (const [language, content] of Object.entries(perLocale)) {
const existing = await knex('email_template_translations')
.where({ template_id: templateId, language })
.first();
if (existing) {
skipped += 1;
continue;
}
await knex('email_template_translations').insert({
template_id: templateId,
language,
subject: content.subject,
body_html: content.body_html,
body_text: content.body_text,
created_at: new Date(),
updated_at: new Date(),
});
inserted += 1;
}
}
console.log(`107_seed_sl_email_template_translations: inserted=${inserted}, skipped=${skipped}, missing=${missing}`);
};
exports.down = async function(knex) {
// No-op: an admin may have hand-edited the `sl` rows in the Templates UI
// after this migration ran, and we cannot reliably distinguish seeded rows
// from edited rows. Remove them manually if rollback is truly required.
};
+1
View File
@@ -164,6 +164,7 @@ async function getRecipientLanguage(email, eventId = null) {
{ domains: ['.br', '.pt'], language: 'pt' },
{ domains: ['.ru', '.su'], language: 'ru' },
{ domains: ['.es'], language: 'es' },
{ domains: ['.si'], language: 'sl' },
];
for (const { domains, language: lang } of domainLanguageMap) {
if (domains.some(d => domain.endsWith(d))) {
@@ -62,6 +62,22 @@ const ESFlag: React.FC<{ className?: string }> = ({ className = "w-5 h-5" }) =>
</svg>
);
const SLFlag: React.FC<{ className?: string }> = ({ className = "w-5 h-5" }) => (
<svg className={className} viewBox="0 0 640 480" xmlns="http://www.w3.org/2000/svg">
<path fill="#fff" d="M0 0h640v160H0z"/>
<path fill="#005DA4" d="M0 160h640v160H0z"/>
<path fill="#ED1C24" d="M0 320h640v160H0z"/>
<path fill="#005DA4" d="M160 80h120v120c0 60-60 90-60 90s-60-30-60-90V80z"/>
<path fill="#fff" d="M172 96h96v100c0 36-28 61-48 74-20-13-48-38-48-74V96z"/>
<path fill="#005DA4" d="M184 108h72v82c0 26-18 46-36 59-18-13-36-33-36-59v-82z"/>
<path fill="#fff" d="m198 178 22-36 22 36h-44z"/>
<path fill="#ED1C24" d="M184 202h72c-6 21-24 37-36 45-12-8-30-24-36-45z"/>
<circle fill="#FFD700" cx="198" cy="122" r="5"/>
<circle fill="#FFD700" cx="220" cy="116" r="5"/>
<circle fill="#FFD700" cx="242" cy="122" r="5"/>
</svg>
);
export const SUPPORTED_LANGUAGES = [
{ code: 'en', name: 'English', Flag: GBFlag },
{ code: 'de', name: 'Deutsch', Flag: DEFlag },
@@ -70,6 +86,7 @@ export const SUPPORTED_LANGUAGES = [
{ code: 'nl', name: 'Nederlands', Flag: NLFlag },
{ code: 'fr', name: 'Français', Flag: FRFlag },
{ code: 'es', name: 'Español', Flag: ESFlag },
{ code: 'sl', name: 'Slovenščina', Flag: SLFlag },
];
export const LanguageSelector: React.FC = () => {
File diff suppressed because it is too large Load Diff