Merge branch 'PretendoNetwork:dev' into dev

This commit is contained in:
Eyad
2021-08-23 01:44:41 +02:00
committed by GitHub
14 changed files with 611 additions and 26 deletions

139
locales/ES_es.json Normal file
View File

@@ -0,0 +1,139 @@
{
"nav": {
"about": "Acerca de",
"faq": "FAQ",
"credits": "Créditos",
"progress": "Progreso"
},
"hero": {
"subtitle": "Servidores en línea",
"title": "Recreados",
"text": "Pretendo es un reemplazo gratuito y de código abierto de los servidores de Nintendo para 3DS y Wii U que permite la comunicación en línea incluso después del cierre de los servidores oficiales.",
"buttons": {
"readMore": "Leer más"
}
},
"aboutUs": {
"title": "Sobre nosotros",
"paragraphs": [
"Pretendo es un proyecto de código abierto que busca recrear Nintendo Network para 3DS y Wii U aplicando ingeniería inversa con un diseño en sala limpia.",
"Como nuestros servicios serán gratuitos y de código abierto, podrán existir tras el inevitable cierre de Nintendo Network."
]
},
"progress": {
"title": "Progreso",
"paragraphs": [
"Actualmente, estamos trabajando en Miiverse, junto con los servidores de cuentas y la integración con los servicios.",
"En 3DS también trabajamos en el soporte de Mario Kart 7, con el deseo de continuar trabajando en otros juegos en cuanto sea posible."
]
},
"faq": {
"title": "Frequently Asked Questions",
"text": "Aquí se muestran algunas cuestiones comunes.",
"QAs": [
{
"question": "¿Qué es Pretendo?",
"answer": "Pretendo es un reemplazo gratuito y de código abierto de Nintendo Network que nace con el objetivo de crear servidores en línea personalizados para las consolas Wii U y 3DS. Nuestra meta es preservar las funcionalidades en línea de esas consolas, permitiendo a los jugadores seguir jugando sus juegos favoritos de Wii U y 3DS en su plena capacidad."
},
{
"question": "¿Mi NNID actual funciona en Pretendo?",
"answer": "Tristemente, no. Los NNID no funcionan en Pretendo, ya que solo Nintendo almacena tus datos de usuario. Aunque una migración NNID-a-PNID es teóricamente posible, sería arriesgado y requiere datos de usuario sensibles que preferimos no almacenar."
},
{
"question": "¿Cómo uso Pretendo?",
"answer": "Pretendo no está actualmente en un estado adecuado para el uso público. Sin embargo, en cuanto esté listo podrás usar Pretendo simplemente cargando nuestro parcheador homebrew en tu consola."
},
{
"question": "¿Sabéis cuándo <determinada función/servicio> estará listo/a?",
"answer": "No. Muchos/as funciones/servicios de Pretendo son desarrolladas independientemente (por ejemplo, un desarrollador puede estar trabajando en Miiverse mientras otro se encarga de las Cuentas y los Amigos) y, por lo tanto, no podemos dar una ETA exacta de cuánto puede tardar en estar listo."
},
{
"question": "¿Pretendo funciona en Cemu/emuladores?",
"answer": "Pretendo está diseñado con el hardware de Wii U y 3DS en mente. Hasta ahora, el único emulador para esas consolas con soporte de NN es Cemu. Cemu no soporta oficialmente servidores personalizados, pero debería ser posible en un futuro llegar a usar Pretendo con Cemu.<br>A día de hoy, Pretendo no soporta Cemu."
},
{
"question": "Si estoy baneado en Nintendo Network, ¿seguiré baneado al usar Pretendo?",
"answer": "No tenemos acceso a los baneos de Nintendo Network motivo por el nadie estará baneado en nuestros servidores al principio. Sin embargo, tendremos reglas a seguir al acceder a nuestros servicios y no hacerlo resultará en un baneo."
},
{
"question": "¿Pretendo soportará Wii/Switch?",
"answer": "La Wii ya tiene servidores en línea personalizados de parte de <a href=\"https://wiimmfi.de/\" target=\"_blank\">Wiimmfi</a>. No tenemos planeado trabajar con Switch ya que sus servidores son de pago y completamente diferentes a los de Nintendo Network."
},
{
"question": "¿Necesitaré modificar mi consola para conectarme?",
"answer": "Sí, necesitas modificar tu consola para conectarte. Sin embargo, en Wii U solo necesitas acceso al Homebrew Launcher (p.e. Haxchi, Coldboot Haxchi, o el exploit web). La información sobre como conectarse con una 3DS llegará posteriormente."
}
]
},
"credits": {
"title": "Equipo",
"text": "Conoce al equipo tras el proyecto",
"people": [
{
"name": "Jonathan Barrow (jonbarrow)",
"caption": "Líder del proyecto y desarrollador principal",
"picture": "https://github.com/jonbarrow.png",
"github": "https://github.com/jonbarrow"
},
{
"name": "Jemma (CaramelKat)",
"caption": "Estudio y desarrollo de Miiverse",
"picture": "https://github.com/caramelkat.png",
"github": "https://github.com/CaramelKat"
},
{
"name": "superwhiskers",
"caption": "Desarrollo de librerías crunch",
"picture": "https://github.com/superwhiskers.png",
"github": "https://github.com/superwhiskers"
},
{
"name": "SuperMarioDaBom",
"caption": "Estudio de consolas y otros sistemas",
"picture": "https://github.com/supermariodabom.png",
"github": "https://github.com/SuperMarioDaBom"
},
{
"name": "Rambo6Glaz",
"caption": "Instalador de la red y estudio de consolas",
"picture": "https://github.com/Rambo6Glaz.png",
"github": "https://github.com/NexoDevelopment"
},
{
"name": "mrjvs",
"caption": "Desarrollo web y temprano estudio de eShop",
"picture": "https://github.com/mrjvs.png",
"github": "https://github.com/mrjvs"
},
{
"name": "Benjamin Moss (kxpler442b)",
"caption": "Desarrollo web",
"picture": "https://github.com/kxpler442b.png",
"github": "https://github.com/kxpler442b"
},
{
"name": "Jip Fr",
"caption": "Desarrollo web",
"picture": "https://github.com/jipfr.png",
"github": "https://github.com/jipfr"
},
{
"name": "Shutterbug2000",
"caption": "Estudio de Mario Kart 7 y 3DS",
"picture": "https://cdn.discordapp.com/avatars/191370953807233024/0311b61e2009c1576828dd2e9a59d72e.png?size=128",
"github": "https://github.com/shutterbug2000"
},
{
"name": "Kinnay",
"special": "Agradecimientos",
"caption": "Estudio de las estructuras de datos de Nintendo",
"picture": "https://cdn.discordapp.com/avatars/186572995848830987/b55c0d4e7bfd792edf0689f83a25d8ea.png?size=128",
"github": "https://github.com/Kinnay"
}
]
},
"progressPage": {
"title": "Progreso",
"description": "¡Comprueba el progreso y las metas pendientes! (Se actualiza cada hora, así que no refleja TODAS nuestras metas o el progreso total)"
}
}

139
locales/TR_tr.json Normal file
View File

@@ -0,0 +1,139 @@
{
"nav": {
"about": "Hakkımızda",
"faq": "SSS",
"credits": "Katkıda Bulunanlar",
"progress": "İlerleme"
},
"hero": {
"subtitle": "Oyun sunucuları",
"title": "Yenilendi",
"text": "Pretendo, Nintendo'nun Wii U ve 3DS konsollarının sunucuları yerine kullanılabilmesi için tasarlanmış, asıl sunucular kapatılmış olmasına rağmen çevrimiçi bağlantıya olanak sağlayan ücretsiz açık kaynaklı bir yazılımdır.",
"buttons": {
"readMore": "Daha fazlasını oku"
}
},
"aboutUs": {
"title": "Hakkımızda",
"paragraphs": [
"Pretendo, Wii U ve 3DS için yapılmış Nintendo Network'ü temiz oda tekniğini kullanarak yeniden oluşturmayı hedefleyen açık kaynaklı bir projedir.",
"Hem ücretsiz hem de açık kaynaklı olan hizmetlerimiz, Nintendo Network'ün kaçınılmaz kapanışından sonra uzun bir süre çalışabilecektir."
]
},
"progress": {
"title": "İlerleme",
"paragraphs": [
"Şu anda, hesap sunucularımız ve hizmetlerle entegrason ile birlikte Miiverse üzerinde çalışıyoruz.",
"3DS için ise, mümkün olduğu vakit diğer oyunlar üzerinde çalışmaya devam etme arzusuyla Mario Kart 7 üzerinde çalışıyoruz."
]
},
"faq": {
"title": "Sıkça Sorulan Sorular",
"text": "Bize sorulan bazı genel sorular ve cevapları:",
"QAs": [
{
"question": "Pretendo nedir?",
"answer": "Pretendo, Wii U ve 3DS konsolları için özel sunucu oluşturmayı amaç edinen Nintendo Network replasmanıdır. Hedefimiz, oyuncuların favori Wii U ve 3DS oyunlarını tam kapasitede oynayabilmeleri için konsolların çevrimiçi işlevlerini temin etmektir."
},
{
"question": "Varolan Nintendo Network Kimliklerim Pretendo'da çalışacak mı?",
"answer": "Ne yazık ki, hayır. Varolan Nintendo Kimlikleri, kullanıcı verilerinize sadece Nintendo sahip olduğundan, Pretendo'da çalışmaz. Tabi, Nintendo Network'ten Prentendo Network'e kimlik intikali teorik olarak mümkündür. Ancak bu işlemin risk ihtimali bulunmakta; ve işlem için sahip olmak istemediğimiz hassas kullanıcı verileri gerekmektedir."
},
{
"question": "Pretendo'yu nasıl kullanırım?",
"answer": "Pretendo, şuanlık topluluk kullanımı için uygun bir vaziyette değil. Bununla birlikte, hazır olduğunda Pretendo'yu sadece konsolunuzdaki Homebrew Yamamızı çalıştırarak kullanabileceksiniz."
},
{
"question": "<Özel aksam/Hizmet> işlevinin ne zaman hazır olacağını biliyor musunuz?",
"answer": "Maalesef. Pek çok Pretendo aksamı/hizmeti bağımsız olarak geliştirilmekte (örneğin, Miiverse üzerinde bir geliştirici çalışırken, Hesaplar ve Arkadaşlar üzerinde başka bir geliştirici çalışmaktadır). Bu yüzden, bu işin ne kadar süreceği hakkında herhangi bir tahmin yapamıyoruz."
},
{
"question": "Pretendo Cemu/emülatörlerde çalışır mı??",
"answer": "Pretendo tasarımında, Wii U ve 3DS donanımını esas alır. Konsollara Nintendo Network desteği sağlayan tek emülatör de Cemu'dur. Cemu resmî olarak özel suncuları desteklemiyor ancak yine de Pretendo'yu Cemu üzerinden kullanabilmek mümkün olmalı.<br>Pretendo şu anlık Cemu'yu desteklemiyor."
},
{
"question": "Nintendo Network'ten banlandıysam, Pretendo'da da banlı kalır mıyım?",
"answer": "Nintendo Network'ün banlarına erişemediğimizden dolayı herhangi bir kullanıcı banlı olmayacak. Ancak, hizmetimiz kullanılırken uyulması gereken kurallar olacak ve uyulmadığı takdirde banlanmalar meydana gelebilecektir."
},
{
"question": "Pretendo Wii/Switch'i destekleyecek mi?",
"answer": "Wii'nin hâlihazırda <a href=\"https://wiimmfi.de/\" target=\"_blank\">Wiimmfi</a> tarafından sağlanan özel sunucuları bulunmaktadır. Switch için ise, hem sunucular çalıştığından hem de sistemi Nintendo Network'ten tamamen farklı olduğundan dolayı, şimdilik üzerine uğraşmayı düşünmüyoruz."
},
{
"question": "Bağlanmak için hacke ihtiyacım var mı?",
"answer": "Evet, cihazınızı hacklemeniz gerekmektedir. Ancak, Wii U'nuzda sadece Homebrew Launcher'a erişebilmeniz gerekmektedir (yani Haxchi, Coldboot Haxchi veya web tarayıcı exploiti gerekmektedir). 3DS'in nasıl bağlanacağı ile ilgili bilgilendirme ileriki tarihlerde verilecektir."
}
]
},
"credits": {
"title": "Ekip",
"text": "Projenin arkasındaki ekiple tanışın",
"people": [
{
"name": "Jonathan Barrow (jonbarrow)",
"caption": "Proje sahibi ve rehber geliştirici",
"picture": "https://github.com/jonbarrow.png",
"github": "https://github.com/jonbarrow"
},
{
"name": "Jemma (CaramelKat)",
"caption": "Miiverse üzerine araştırma ve geliştirme",
"picture": "https://github.com/caramelkat.png",
"github": "https://github.com/CaramelKat"
},
{
"name": "superwhiskers",
"caption": "Sıkıştırılmış kütüphane geliştirme",
"picture": "https://github.com/superwhiskers.png",
"github": "https://github.com/superwhiskers"
},
{
"name": "SuperMarioDaBom",
"caption": "Konsol ve diğer sistem üzerine araştırma",
"picture": "https://github.com/supermariodabom.png",
"github": "https://github.com/SuperMarioDaBom"
},
{
"name": "Rambo6Glaz",
"caption": "Ağ yükleyicisi ve konsol üzerine araştırma",
"picture": "https://github.com/Rambo6Glaz.png",
"github": "https://github.com/Rambo6Glaz"
},
{
"name": "mrjvs",
"caption": "Web sayfası geliştirme ve başlarda eShop üzerine araştırma",
"picture": "https://github.com/mrjvs.png",
"github": "https://github.com/mrjvs"
},
{
"name": "Benjamin Moss (kxpler442b)",
"caption": "Web sayfası geliştirme",
"picture": "https://github.com/kxpler442b.png",
"github": "https://github.com/kxpler442b"
},
{
"name": "Jip Fr",
"caption": "Web sayfası geliştirme",
"picture": "https://github.com/jipfr.png",
"github": "https://github.com/jipfr"
},
{
"name": "Shutterbug2000",
"caption": "Mario Kart 7 ve 3DS üzerine araştırma",
"picture": "https://cdn.discordapp.com/avatars/191370953807233024/0311b61e2009c1576828dd2e9a59d72e.png?size=128",
"github": "https://github.com/shutterbug2000"
},
{
"name": "Kinnay",
"special": "Özel teşekkür",
"caption": "Nintendo'nun veri yapıları üzerine araştırma",
"picture": "https://cdn.discordapp.com/avatars/186572995848830987/b55c0d4e7bfd792edf0689f83a25d8ea.png?size=128",
"github": "https://github.com/Kinnay"
}
]
},
"progressPage": {
"title": "İlerlememiz",
"description": "Proje ilerlemesini ve hedeflerini kontrol edin! (Her saat başı güncellenir. TÜM proje hedeflerini veya ilerlemesini yansıtmaz)"
}
}

72
package-lock.json generated
View File

@@ -10,8 +10,10 @@
"license": "ISC",
"dependencies": {
"colors": "^1.4.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"express-handlebars": "^4.0.4",
"express-locale": "^2.0.0",
"fs-extra": "^9.1.0",
"ioredis": "^4.26.0",
"morgan": "^1.10.0",
@@ -156,6 +158,18 @@
"node": ">= 0.6"
}
},
"node_modules/cookie-parser": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
"integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
"dependencies": {
"cookie": "0.4.0",
"cookie-signature": "1.0.6"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
@@ -287,6 +301,11 @@
"node": ">=0.10"
}
},
"node_modules/express-locale": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/express-locale/-/express-locale-2.0.0.tgz",
"integrity": "sha512-SUwsgOTV8lplAkgyfKSwKH3ZVSKUrAa+b48acPGXpwWX211WZ/BYWX2WcZO57+xLOqPYb6rSNpWCFnhGrt0moA=="
},
"node_modules/finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
@@ -366,9 +385,9 @@
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"node_modules/handlebars": {
"version": "4.7.6",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
"integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dependencies": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
@@ -820,11 +839,6 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sax": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
"integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
},
"node_modules/send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -992,6 +1006,11 @@
"xmlbuilder": ">=0.4.2"
}
},
"node_modules/xml2js/node_modules/sax": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
"integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
},
"node_modules/xmlbuilder": {
"version": "15.1.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
@@ -1003,7 +1022,10 @@
"node_modules/yaml": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-0.2.3.tgz",
"integrity": "sha1-tUUOkudu82td0k42YAkeuu7z5cc="
"integrity": "sha1-tUUOkudu82td0k42YAkeuu7z5cc=",
"engines": {
"node": "*"
}
}
},
"dependencies": {
@@ -1114,6 +1136,15 @@
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
},
"cookie-parser": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
"integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
"requires": {
"cookie": "0.4.0",
"cookie-signature": "1.0.6"
}
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
@@ -1224,6 +1255,11 @@
"promise": "^8.1.0"
}
},
"express-locale": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/express-locale/-/express-locale-2.0.0.tgz",
"integrity": "sha512-SUwsgOTV8lplAkgyfKSwKH3ZVSKUrAa+b48acPGXpwWX211WZ/BYWX2WcZO57+xLOqPYb6rSNpWCFnhGrt0moA=="
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
@@ -1288,9 +1324,9 @@
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"handlebars": {
"version": "4.7.6",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
"integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"requires": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
@@ -1630,11 +1666,6 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sax": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
"integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -1763,6 +1794,13 @@
"requires": {
"sax": "0.5.x",
"xmlbuilder": ">=0.4.2"
},
"dependencies": {
"sax": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
"integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
}
}
},
"xmlbuilder": {

View File

@@ -18,8 +18,10 @@
"homepage": "https://github.com/PretendoNetwork/website#readme",
"dependencies": {
"colors": "^1.4.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"express-handlebars": "^4.0.4",
"express-locale": "^2.0.0",
"fs-extra": "^9.1.0",
"ioredis": "^4.26.0",
"morgan": "^1.10.0",

View File

@@ -0,0 +1,106 @@
.select-box {
display: flex;
width: 200px;
flex-direction: column;
position: relative;
user-select: none;
}
.select-box > * {
box-sizing: border-box;
}
.select-box .options-container {
max-height: 0;
width: calc(100% - 12px);
opacity: 0;
transition: all 0.4s;
overflow: hidden;
border-radius: 5px;
background-color: var(--btn-secondary);
order: 1;
position: absolute;
top: 50px;
}
.selected-locale {
margin-bottom: 8px;
position: relative;
width: 188px;
height: 45px;
border-radius: 5px;
display: flex;
align-items: center;
background-color: var(--btn-secondary);
color: white;
order: 0;
}
.selected-locale::after {
content: "";
width: 1.2rem;
height: 1.2rem;
background: url("/assets/icons/down-arrow.svg");
position: absolute;
right: 15px;
top: 50%;
transition: transform 150ms;
transform: translateY(-50%);
background-size: contain;
background-position: center;
}
.select-box .option .item {
color: #afb5dd;
}
.select-box .lang {
width: 1.3rem;
height: 1rem;
margin-right: .2rem;
display: inline-block;
}
.select-box .options-container.active {
max-height: 240px;
opacity: 1;
overflow-y: auto;
}
.select-box .options-container.active + .selected-locale::after {
transform: translateY(-50%) rotateX(180deg);
}
.select-box .options-container::-webkit-scrollbar {
width: 8px;
background: #0d141f;
background: #81878f;
background: #f1f2f3;
border-radius: 0 5px 5px 0;
}
.select-box .options-container::-webkit-scrollbar-thumb {
background: #525861;
background: #81878f;
border-radius: 0 5px 5px 0;
}
.select-box .option,
.selected-locale {
padding: 12px 15px;
cursor: pointer;
}
.select-box .option:hover {
background: #2f345b;
}
.select-box .option:hover .item {
color: white;
}
.select-box label {
cursor: pointer;
}
.select-box .option .radio {
display: none;
}

View File

@@ -4,6 +4,7 @@
--text: white;
--text-secondary: #A1A8D9;
--btn: #673DB6;
--btn-secondary: #333960;
--theme: var(--btn);
--text-secondary-2: #8990C1;
}
@@ -80,6 +81,10 @@ header nav a {
text-decoration: none;
}
.locale-dropdown {
margin-left: auto;
z-index: 2;
}
/* Misc */
.purple-circle {
@@ -114,7 +119,7 @@ header nav a {
left: 50%;
transform: translate(-50%, -50%);
margin-left: -40px;
z-index: 3;
z-index: 1;
}
.light-purple-circle .deco {
position: absolute;
@@ -124,6 +129,15 @@ header nav a {
z-index: -2;
}
/* Twemoji */
img.emoji {
height: 1em;
width: 1em;
margin: 0 .05em 0 .1em;
vertical-align: -0.1em;
}
/* Title business */
.sect .title[id] {
padding-top: 100px;
@@ -217,7 +231,7 @@ header nav a {
background: var(--btn);
}
.button.secondary {
background: #333960;
background: var(--btn-secondary);
}
.button.secondary.discord svg {
margin-bottom: -1px;
@@ -527,6 +541,11 @@ footer {
display: none;
}
.locale-dropdown {
/* You don't really need this either on mobile IMHO */
display: none;
}
.hero-meta {
margin-top: 100px;
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-down"><polyline points="6 9 12 15 18 9"></polyline></svg>

After

Width:  |  Height:  |  Size: 261 B

View File

@@ -0,0 +1,56 @@
function setDefaultDropdownLocale(localeString) {
const selected = document.querySelector(".selected-locale");
selected.innerHTML = document.querySelector(`label[for=${localeString}`).innerHTML
}
function localeDropdownHandler(selectedLocale) {
document.cookie = `preferredLocale=${selectedLocale};max-age=31536000`;
window.location.reload();
}
const dropdowns = document.querySelectorAll("*[data-dropdown]");
const dropdownOptions = document.querySelectorAll(
"*[data-dropdown] .options-container"
);
dropdowns.forEach((el) => {
const selected = el.querySelector(".selected-locale");
const optionsContainer = el.querySelector(".options-container");
const optionsList = el.querySelectorAll(".option");
// click dropdown element will open dropdown
selected.addEventListener("click", () => {
optionsContainer.classList.toggle("active");
});
// clicking on any option will close dropdown and change value
optionsList.forEach((option) => {
option.addEventListener("click", () => {
selected.innerHTML = option.querySelector("label").innerHTML;
optionsContainer.classList.remove("active");
const selectedLocale = option.querySelector("label").getAttribute("for");
localeDropdownHandler(selectedLocale);
});
});
});
// close all dropdowns on scroll
document.addEventListener("scroll", () => {
dropdownOptions.forEach((el) => el.classList.remove("active"));
});
// click outside of dropdown will close all dropdowns
document.addEventListener("click", (e) => {
const targetElement = e.target;
// check if target is from a dropdown
let found = false;
dropdowns.forEach((v) => {
if (v == targetElement || v.contains(targetElement)) found = true;
});
if (found) return;
// click outside of dropdowns
dropdownOptions.forEach((el) => el.classList.remove("active"));
});

View File

@@ -5,12 +5,16 @@ const router = new Router();
const { getTrelloCache } = require('../trello');
router.get('/', async (request, response) => {
const tmpLocale = util.getLocale('US', 'en');
const reqLocale = request.locale
const locale = util.getLocale(reqLocale.region, reqLocale.language);
const cache = await getTrelloCache();
response.render('home', {
layout: 'main',
locale: tmpLocale,
locale,
localeString: reqLocale.toString(),
featuredFeatureList: cache.sections[0]
});
});

View File

@@ -5,12 +5,18 @@ const router = new Router();
const { getTrelloCache } = require('../trello');
router.get('/', async (request, response) => {
const tmpLocale = util.getLocale('US', 'en');
const reqLocale = request.locale
const locale = util.getLocale(reqLocale.region, reqLocale.language);
const localeString = reqLocale.toString()
const cache = await getTrelloCache();
response.render('progress', {
layout: 'main',
locale: tmpLocale,
locale,
localeString,
progressLists: cache
});
});

View File

@@ -3,6 +3,8 @@ process.title = 'Pretendo - Website';
const express = require('express');
const handlebars = require('express-handlebars');
const morgan = require('morgan');
const expressLocale = require('express-locale');
const cookieParser = require('cookie-parser')
const logger = require('./logger');
const util = require('./util');
const config = require('../config.json');
@@ -23,6 +25,28 @@ const routers = {
progress: require('./routers/progress')
};
app.use(cookieParser())
// Locale express middleware setup
app.use(expressLocale({
"priority": ["cookie", "accept-language", "map", "default"],
cookie: {name: 'preferredLocale'},
// fallbacks for browsers that don't send a region code, but only a language
map: {
de: 'de-DE',
es: 'es-ES',
fr: 'fr-FR',
it: 'it-IT',
ko: 'ko-KR',
ru: 'ru-RU',
tr: 'tr-TR'
},
"default": "en-US"
}))
app.use('/', routers.home);
app.use('/faq', routers.faq);
app.use('/progress', routers.progress);

View File

@@ -1,4 +1,4 @@
const Trello = require('trello');
const Trello =require("trello")
const Redis = require('ioredis');
const JSONCache = require('redis-json');
const config = require('../config.json');

View File

@@ -27,12 +27,19 @@
<!-- favicon -->
<link rel="shortcut icon" href="/assets/icons/favicon.ico"><title>Pretendo</title>
<!-- css files -->
<link rel="stylesheet" href="/assets/css/dropdown.css" />
<link rel="stylesheet" href="/assets/css/main.css">
<!-- favicon -->
<link rel="shortcut icon" href="/assets/icons/favicon.ico">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap" rel="stylesheet">
<!-- Twemoji setup -->
<script src="https://twemoji.maxcdn.com/v/latest/twemoji.min.js" crossorigin="anonymous"></script>
<script>
window.onload = function() {
twemoji.parse(document.body, {folder: 'svg', ext: '.svg'});
}
</script>
</head>
<body>
<div class="main-body">
@@ -40,5 +47,8 @@
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js"></script>
<script src="/assets/js/progress-charts.js"></script>
<script src="/assets/js/locale-dropdown-handler.js"></script>
<script>setDefaultDropdownLocale("{{localeString}}")</script>
</body>
</html>

View File

@@ -30,4 +30,45 @@
<a href="/#credits">{{ locale.nav.credits }}</a>
<a href="/progress" class="keep-on-mobile">{{ locale.nav.progress }}</a>
</nav>
<div class="select-box locale-dropdown" data-dropdown>
<div class="options-container">
<div class="option">
<input type="radio" class="radio" id="en-US" name="category" />
<label for="en-US">
<div class="item"><span class="lang">🇺🇸</span>English</div>
</label>
</div>
<div class="option">
<input type="radio" class="radio" id="es-ES" name="category" />
<label for="es-ES">
<div class="item"><span class="lang">🇪🇸</span>Español</div>
</label>
</div>
<div class="option">
<input type="radio" class="radio" id="it-IT" name="category" />
<label for="it-IT">
<div class="item"><span class="lang">🇮🇹</span>Italiano</div>
</label>
</div>
<div class="option">
<input type="radio" class="radio" id="ru-RU" name="category" />
<label for="ru-RU">
<div class="item"><span class="lang">🇷🇺</span>Pусский</div>
</label>
</div>
<div class="option">
<input type="radio" class="radio" id="tr-TR" name="category" />
<label for="tr-TR">
<div class="item"><span class="lang">🇹🇷</span>Türkçe</div>
</label>
</div>
</div>
<div class="selected-locale">
<div class="item"><span class="lang"></span></div>
</div>
</div>
</header>