Add real country flags to language selector

- Replace emoji flags with SVG-based country flags
- German flag: Black-Red-Gold (official colors)
- USA flag: Red-White-Blue with stars
- Dynamic flag switching on language change
- Applied to both dashboard and leaderboard
- Database achievements now support English translations
- Extended achievements table with name_en and description_en columns
- Updated API routes to return English translations
- Simplified frontend translation system to use database translations
This commit is contained in:
2025-09-10 19:40:57 +02:00
parent 11d0647ab9
commit 340e22a815
7 changed files with 541 additions and 149 deletions

View File

@@ -11,7 +11,7 @@ body {
background: #0a0a0f;
color: #ffffff;
min-height: 100vh;
background-image:
background-image:
radial-gradient(circle at 20% 80%, #1a1a2e 0%, transparent 50%),
radial-gradient(circle at 80% 20%, #16213e 0%, transparent 50%),
radial-gradient(circle at 40% 40%, #0f3460 0%, transparent 50%);
@@ -24,6 +24,43 @@ body {
min-height: 100vh;
}
/* Language Selector */
.language-selector {
position: fixed;
top: 2rem;
left: 2rem;
z-index: 1000;
}
.language-selector select {
padding: 0.5rem 1rem;
background: rgba(15, 23, 42, 0.9);
border: 1px solid #334155;
border-radius: 0.5rem;
color: #ffffff;
font-size: 0.9rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
backdrop-filter: blur(10px);
padding-left: 2.5rem;
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" viewBox="0 0 20 15"><rect width="20" height="5" fill="%23000000"/><rect y="5" width="20" height="5" fill="%23DD0000"/><rect y="10" width="20" height="5" fill="%23FFCE00"/></svg>');
background-repeat: no-repeat;
background-position: 0.5rem center;
background-size: 20px 15px;
}
.language-selector select:hover {
border-color: #00d4ff;
box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.1);
}
.language-selector select:focus {
outline: none;
border-color: #00d4ff;
box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.2);
}
.header-section {
text-align: center;
margin-bottom: 3rem;
@@ -151,8 +188,13 @@ body {
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.user-info {
@@ -893,8 +935,10 @@ body {
/* Touch-friendly improvements for mobile */
@media (max-width: 768px) {
.btn {
min-height: 44px; /* Apple's recommended minimum touch target */
touch-action: manipulation; /* Prevents double-tap zoom */
min-height: 44px;
/* Apple's recommended minimum touch target */
touch-action: manipulation;
/* Prevents double-tap zoom */
}
.card {
@@ -930,7 +974,8 @@ body {
/* Better spacing for mobile */
.header-section {
margin-bottom: 2rem;
margin-top: 5rem; /* Account for fixed nav */
margin-top: 5rem;
/* Account for fixed nav */
}
/* Improve modal usability on mobile */
@@ -1019,7 +1064,7 @@ body {
text-align: center;
gap: 1.5rem;
}
.footer-links {
flex-wrap: wrap;
justify-content: center;
@@ -1292,6 +1337,7 @@ body {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
@@ -1340,33 +1386,33 @@ body {
.achievements-header h2 {
font-size: 2rem;
}
.achievement-stats {
flex-direction: column;
align-items: center;
}
.achievement-stat {
width: 100%;
max-width: 250px;
}
.category-tabs {
flex-direction: column;
align-items: center;
}
.category-tab {
width: 100%;
max-width: 200px;
text-align: center;
}
.achievements-grid {
grid-template-columns: 1fr;
gap: 1rem;
}
.achievement-notification {
top: 1rem;
right: 1rem;
@@ -1452,11 +1498,11 @@ body {
border-radius: 50%;
}
input:checked + .toggle-slider {
input:checked+.toggle-slider {
background-color: #00d4ff;
}
input:checked + .toggle-slider:before {
input:checked+.toggle-slider:before {
transform: translateX(26px);
}
@@ -1482,17 +1528,17 @@ input:checked + .toggle-slider:before {
align-items: flex-start;
gap: 1rem;
}
.setting-control {
margin-left: 0;
align-self: flex-end;
}
.settings-actions {
flex-direction: column;
}
.settings-actions .btn {
width: 100%;
}
}
}