mirror of
https://github.com/MadeBaruna/paimon-moe.git
synced 2025-02-27 06:22:03 +01:00
Merge branch 'MadeBaruna:main' into main
This commit is contained in:
commit
ebe6735080
26 changed files with 2230 additions and 194 deletions
|
@ -21,11 +21,13 @@
|
|||
export let mobile = false;
|
||||
|
||||
const languages = [
|
||||
{ id: 'zh', label: '中文(简体)' },
|
||||
{ id: 'en', label: 'English' },
|
||||
{ id: 'id', label: 'Indonesia' },
|
||||
{ id: 'ru', label: 'Русский' },
|
||||
{ id: 'ko', label: '한국어' },
|
||||
{ id: 'fr', label: 'Français' },
|
||||
{ id: 'ko', label: '한국어' },
|
||||
{ id: 'id', label: 'Indonesia' },
|
||||
{ id: 'pt', label: 'Português' },
|
||||
{ id: 'ru', label: 'Русский' },
|
||||
];
|
||||
$: currentLocale = languages.find((e) => e.id === $locale.substring(0, 2)) || { id: 'en', label: 'English' };
|
||||
$: locales = languages.filter((e) => e.id !== currentLocale.id);
|
||||
|
@ -48,6 +50,7 @@
|
|||
function changeLocale(lang) {
|
||||
locale.set(lang);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div
|
||||
|
@ -199,4 +202,5 @@
|
|||
@apply rounded-xl;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -447,20 +447,14 @@
|
|||
}
|
||||
|
||||
if (rarity === 5) {
|
||||
if (combined[i].pity === 0) {
|
||||
combined[i].pity = legendary;
|
||||
}
|
||||
combined[i].pity = legendary;
|
||||
legendary = 0;
|
||||
// rare = 0;
|
||||
} else if (rarity === 4) {
|
||||
if (combined[i].pity === 0) {
|
||||
combined[i].pity = rare;
|
||||
}
|
||||
combined[i].pity = rare;
|
||||
rare = 0;
|
||||
} else {
|
||||
if (combined[i].pity === 0) {
|
||||
combined[i].pity = 1;
|
||||
}
|
||||
combined[i].pity = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -743,7 +737,7 @@
|
|||
{/if}
|
||||
|
||||
<div class="flex flex-col md:flex-row mt-4 md:justify-end items-center">
|
||||
{#if !showFaq}
|
||||
<!-- {#if !showFaq}
|
||||
<div class="flex-1 flex mb-4 md:mb-0 md:ml-4">
|
||||
<Checkbox disabled={false} bind:checked={newOnly}>
|
||||
<span class="text-white select-none">{$t('wish.import.importNewWishOnly')}</span>
|
||||
|
@ -753,7 +747,7 @@
|
|||
<span class="tooltip-content">{$t('wish.import.importNewWishUncheck')}</span>
|
||||
</span>
|
||||
</div>
|
||||
{/if}
|
||||
{/if} -->
|
||||
<div>
|
||||
{#if !showFaq}
|
||||
<Button on:click={startImport} color="green" className="mr-4">{$t('wish.import.import')}</Button>
|
||||
|
@ -791,7 +785,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
/* .tooltip {
|
||||
@apply relative;
|
||||
|
||||
.tooltip-content {
|
||||
|
@ -815,6 +809,6 @@
|
|||
&:hover .tooltip-content {
|
||||
@apply block;
|
||||
}
|
||||
}
|
||||
} */
|
||||
|
||||
</style>
|
||||
|
|
1
src/data/achievement/pt.json
Normal file
1
src/data/achievement/pt.json
Normal file
File diff suppressed because one or more lines are too long
1
src/data/achievement/zh.json
Normal file
1
src/data/achievement/zh.json
Normal file
File diff suppressed because one or more lines are too long
1
src/data/furnishing/pt.json
Normal file
1
src/data/furnishing/pt.json
Normal file
File diff suppressed because one or more lines are too long
1
src/data/furnishing/zh.json
Normal file
1
src/data/furnishing/zh.json
Normal file
File diff suppressed because one or more lines are too long
|
@ -44,6 +44,17 @@ export const eventsData = [
|
|||
url: 'https://genshin.mihoyo.com/en/news/detail/12368',
|
||||
showOnHome: true,
|
||||
},
|
||||
{
|
||||
name: 'Update 1.6!',
|
||||
pos: '0% 40%',
|
||||
image: 'update16.jpg',
|
||||
start: '2021-06-09 10:00:00',
|
||||
end: '2021-06-16 10:00:00',
|
||||
color: '#3B8AFF',
|
||||
zoom: '140%',
|
||||
url: 'https://www.youtube.com/watch?v=OrZ8RbXwoK4',
|
||||
showOnHome: true,
|
||||
},
|
||||
],
|
||||
[
|
||||
{
|
||||
|
@ -96,7 +107,7 @@ export const eventsData = [
|
|||
image: 'mimi_tomo_update.jpg',
|
||||
start: '2021-05-27 10:00:00',
|
||||
end: '2021-06-08 04:00:00',
|
||||
color: '#B89BCB',
|
||||
color: '#E5C18B',
|
||||
zoom: '200%',
|
||||
url: 'https://www.hoyolab.com/genshin/article/387817',
|
||||
showOnHome: true,
|
||||
|
@ -149,12 +160,13 @@ export const eventsData = [
|
|||
},
|
||||
{
|
||||
name: 'Overflowing Mastery',
|
||||
pos: '0% 85%',
|
||||
pos: '0% 50%',
|
||||
image: 'overflowing_mastery.jpg',
|
||||
start: '2021-05-31 10:00:00',
|
||||
start: '2021-05-31 04:00:00',
|
||||
end: '2021-06-07 04:00:00',
|
||||
color: '#FFF76C',
|
||||
zoom: '150%',
|
||||
zoom: '200%',
|
||||
url: 'https://www.hoyolab.com/genshin/article/394841',
|
||||
showOnHome: true,
|
||||
},
|
||||
],
|
||||
|
@ -365,7 +377,7 @@ export const eventsData = [
|
|||
end: '2021-06-01 04:00:00',
|
||||
color: '#4299E1',
|
||||
description:
|
||||
"A backlash will occur when opponents hit a character protected by a shield, unleashing a shockwave that deals AoE DMG. Can occur once every 6s.",
|
||||
'A backlash will occur when opponents hit a character protected by a shield, unleashing a shockwave that deals AoE DMG. Can occur once every 6s.',
|
||||
},
|
||||
{
|
||||
name: 'Spiral Abyss',
|
||||
|
@ -409,6 +421,16 @@ export const eventsData = [
|
|||
image: 'paimon_bargain.png',
|
||||
description: 'Now selling: Bennett, Lisa, and Blackcliff Weapons.',
|
||||
},
|
||||
{
|
||||
name: "Paimon's Bargain - Barbara, Kaeya, and Royal",
|
||||
pos: '0% 50%',
|
||||
zoom: '150%',
|
||||
start: '2021-06-01 04:00:00',
|
||||
end: '2021-07-01 04:00:00',
|
||||
color: '#B6A1EA',
|
||||
image: 'paimon_bargain.png',
|
||||
description: 'Now selling: Barbara, Kaeya, and Royal Weapons.',
|
||||
},
|
||||
],
|
||||
[
|
||||
{
|
||||
|
|
|
@ -5,6 +5,8 @@ import id from './locales/id.json';
|
|||
import ru from './locales/ru.json';
|
||||
import ko from './locales/ko.json';
|
||||
import fr from './locales/fr.json';
|
||||
import zh from './locales/zh.json';
|
||||
import pt from './locales/pt.json';
|
||||
|
||||
const INIT_OPTIONS = {
|
||||
fallbackLocale: 'en',
|
||||
|
@ -28,6 +30,8 @@ addMessages('id', id);
|
|||
addMessages('ru', ru);
|
||||
addMessages('ko', ko);
|
||||
addMessages('fr', fr);
|
||||
addMessages('zh', zh);
|
||||
addMessages('pt', pt);
|
||||
|
||||
export function startClient() {
|
||||
const savedLocale = localStorage.getItem('locale');
|
||||
|
|
|
@ -104,6 +104,8 @@
|
|||
"title": "Wish Counter",
|
||||
"autoImport": "Auto Import",
|
||||
"helpAndSetting": "Help & Settings",
|
||||
"helps": "Help",
|
||||
"settings": "Settings",
|
||||
"wishesWorth": "Wishes Worth",
|
||||
"lifetimePulls": "Lifetime Pulls",
|
||||
"guarantee": "Guaranteed at {pity}",
|
||||
|
@ -237,13 +239,41 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
"excel": {
|
||||
"title": "Excel Importer",
|
||||
"subtitle": "Select where your excel come from:",
|
||||
"default": "Paimon.moe Export",
|
||||
"takagg": "TakaGG Gacha Export",
|
||||
"notice": [
|
||||
"This feature still in BETA please backup first by going to Setting then Export to Excel!",
|
||||
"Wish with the same timestamp and reward name will NOT be touched (so existing wish will not be rewritten)",
|
||||
"Will only append and prepend wishes, this mean nothing will be inserted on the middle of the list",
|
||||
"Currently only support excel with ENGLISH reward name"
|
||||
],
|
||||
"selectFile": {
|
||||
"default": "Drag & drop Paimon.moe excel file here, or click here to select",
|
||||
"takagg": "Drag & drop TakaGG gacha export excel file here, or click here to select"
|
||||
},
|
||||
"processing": "Processing...",
|
||||
"addedOn": "Inserted on the:",
|
||||
"beginning": "Beginning",
|
||||
"end": "End",
|
||||
"total": "Total",
|
||||
"saveNotice": "Save the imported wishes?",
|
||||
"save": "Save",
|
||||
"success": "Excel import success 😀!",
|
||||
"errorInvalidFile": "Invalid excel file",
|
||||
"errorReadExcel": "Error reading the excel file!",
|
||||
"errorExcelPaimon": "This is not excel from paimon.moe export",
|
||||
"errorUnknownItem": "Got an unknown reward name"
|
||||
},
|
||||
"help": {
|
||||
"title": "Wish Counter Help & Settings",
|
||||
"exportTitle": "Export Wish History",
|
||||
"exportMessage": "You can export your wish history to an excel file here",
|
||||
"exportTitle": "Export & Import Wish History",
|
||||
"exportMessage": "You can export your wish history to an excel file here. You can also import the exported excel from paimon.moe or TakaGG Gacha Export.",
|
||||
"export": "Export to Excel",
|
||||
"exporting": "Exporting...",
|
||||
"import": "Import",
|
||||
"import": "Import From Excel",
|
||||
"exportFinish": "Export success, please wait until the browser download the file!",
|
||||
"wishTallyTitle": "Submit Wish Tally",
|
||||
"wishTally": "We are doing a global wish tally! You can submit your wish tally to participate. All pity data will be aggregated to know what is the average pity of paimon.moe users.",
|
||||
|
@ -580,7 +610,8 @@
|
|||
},
|
||||
"achievement": {
|
||||
"title": "Achievement",
|
||||
"of": "of"
|
||||
"of": "of",
|
||||
"sort": "Show not achieved first"
|
||||
},
|
||||
"furnishing": {
|
||||
"title": "Furnishing",
|
||||
|
|
|
@ -16,13 +16,13 @@
|
|||
},
|
||||
"home": {
|
||||
"welcome": "Bienvenue sur Paimon.moe! 👋",
|
||||
"message": "Votre meilleur compagnon pour Genshin Impact ! Vous aide à plannifier ce que vous souhaitez farmer avec le calculateur d'élévation et vous permets de suivre votre progression avec la liste de tâches et le compteur de voeux.",
|
||||
"message": "Votre meilleur compagnon pour Genshin Impact ! Vous aide à planifier ce que vous souhaitez farmer avec le calculateur d'élévation et vous permet de suivre votre progression avec la liste de tâches et le compteur de voeux.",
|
||||
"banner": {
|
||||
"summoned": "Invocation",
|
||||
"percentage": "parmis tout les {rarity}",
|
||||
"percentage": "parmis tous les {rarity}",
|
||||
"avg": "Pity moyenne",
|
||||
"subtitle": "Calculé à partir des données fournis par {user} utilisateurs de paimon.moe",
|
||||
"detail": "Décompte global des voeux"
|
||||
"detail": "Compteur global des voeux"
|
||||
},
|
||||
"wish": {
|
||||
"message": "Importez votre historique de voeux pour le garder plus de 6 mois ! Compte aussi automatiquement votre pity et vos statistiques dans de jolis graphiques 📊",
|
||||
|
@ -34,7 +34,7 @@
|
|||
"detail": "Compteur de voeux"
|
||||
},
|
||||
"reminder": {
|
||||
"message": "Vous pouvez définir une notification de rappel 🔔 pour Transformateur Paramétrique et les récompenses quotidiennes d'Hoyolab! Cliquez sur le bouton de rappel ci-dessous pour commencer !",
|
||||
"message": "Vous pouvez définir une notification de rappel 🔔 pour le Transformateur Paramétrique et les récompenses quotidiennes d'Hoyolab! Cliquez sur le bouton de rappel ci-dessous pour commencer !",
|
||||
"detail": "Rappel"
|
||||
},
|
||||
"event": {
|
||||
|
@ -43,7 +43,7 @@
|
|||
"detail": "Calendrier"
|
||||
},
|
||||
"discord": {
|
||||
"online": "Membre en ligne",
|
||||
"online": "Membres en ligne",
|
||||
"message": "Rejoignez notre serveur Discord pour les dernières annonces de mise à jour ! Discutez aussi de Genshn Impact et donnez vos retours à propos de paimon.moe.",
|
||||
"join": "Rejoignez notre Discord"
|
||||
},
|
||||
|
@ -53,11 +53,11 @@
|
|||
"sunday": "Tout est farmable le dimanche 😁"
|
||||
},
|
||||
"calculator": {
|
||||
"title": "🧮 Calculez les matériaux nécessaires à l'élévation d'armes ou de personnages ainsi que les livres d'aptitudes ! Tout les calculs peuvent être ajoutés à la Liste des tâches, cela vous montrera de combien de résines vous aurez besoin !",
|
||||
"title": "🧮 Calculez les matériaux nécessaires à l'élévation d'armes ou de personnages ainsi que les livres d'aptitudes ! Tous les calculs peuvent être ajoutés à la Liste des tâches, cela vous montrera de combien de résines vous aurez besoin !",
|
||||
"detail": "Calculator"
|
||||
},
|
||||
"twitter": {
|
||||
"title": "Suivez mon Twitter, je posterais de temps en temps des aperçus de ce que je développe et des dernières mises à jour de paimon.moe!",
|
||||
"title": "Suivez mon Twitter, je posterai de temps en temps des aperçus de ce que je développe et des dernières mises à jour de paimon.moe!",
|
||||
"detail": "Suivez mon Twitter"
|
||||
},
|
||||
"achievement": {
|
||||
|
@ -110,21 +110,21 @@
|
|||
"welcome": "Bienvenue sur le compteur de voeux de Paimon.moe ! Il est recommandé d'importer l'historique des voeux avec l'importation auto.",
|
||||
"welcomeStart1": "Pour commencer, appuyez ici",
|
||||
"welcomeStart2": "bouton plus haut",
|
||||
"manual": "Si vous voulez imoporter manuellement vos données, vous pouvez l'activer ici :",
|
||||
"manual": "Si vous voulez importer manuellement vos données, vous pouvez l'activer ici :",
|
||||
"manualButton": "Activer l'importation manuelle",
|
||||
"errorBanner": "Les dates de bannières ne correspondent pas ! Veuillez ajuster votre serveur dans les paramètres. Cela ne marche toujours pas ? Laissez un message sur Discord 😅",
|
||||
"globalWishTally": "Décompte global des voeux",
|
||||
"globalWishTally": "Compteur global des voeux",
|
||||
"pityTooltip": [
|
||||
"Montre votre pity pour les {rarity}",
|
||||
"{count} voeux avant le prochain {rarity}"
|
||||
],
|
||||
"import": {
|
||||
"title": "Importer votre istorique de voeux",
|
||||
"title": "Importer votre historique de voeux",
|
||||
"faqsButton": "FAQ - LIRE EN PREMIER",
|
||||
"nonew": "Pas de nouveaux voeux",
|
||||
"importNotice1": "Les voeux importés serons ajoutés ou remplacés en fonction des données existentes",
|
||||
"importNotice2": "Si aucune donnée n'est présente, le premier voeux compteras comme la pity 1",
|
||||
"importNotice3": "Faites attention si vous importez des données de plusieurs comptes, soyez sûrs de séparer vos comptes dans les paramètres, ou vos données seront complêtements mélangés !",
|
||||
"importNotice1": "Les voeux importés serons ajoutés ou remplacés en fonction des données existantes",
|
||||
"importNotice2": "Si aucune donnée n'est présente, le premier voeux comptera comme la pity 1",
|
||||
"importNotice3": "Faites attention si vous importez des données de plusieurs comptes, soyez sûrs de séparer vos comptes dans les paramètres, ou vos données seront complètement mélangées !",
|
||||
"saveData": "Sauvegarder les données des voeux?",
|
||||
"reCalculating": "Recalcul de la pity...",
|
||||
"processing": "Traitement de la",
|
||||
|
@ -135,7 +135,7 @@
|
|||
"cancel": "Annuler",
|
||||
"cancelling": "Annulation...",
|
||||
"importNewWishOnly": "Importer uniquement les nouveaux voeux",
|
||||
"importNewWishUncheck": "Décochez uniquement si vous aez besoin de réimporter la totalité de votre historique de voeux",
|
||||
"importNewWishUncheck": "Décochez uniquement si vous avez besoin de réimporter la totalité de votre historique de voeux",
|
||||
"import": "Importer",
|
||||
"close": "Fermer",
|
||||
"invalidLink": "Lien invalide, veuillez le vérifier",
|
||||
|
@ -145,7 +145,7 @@
|
|||
"success": "Importation réussi 😀!",
|
||||
"server": "Sélectionnez votre serveur :",
|
||||
"wishTallyCheck": "Envoyez vos voeux pour le décompte global des voeux",
|
||||
"wishTally": "Nous faisons un décompte des voeux ! Vous pouvez envoyer votre historique de voeux pour participer. Toutes les données des pitys seront agrégés pour connaître la pity moyenne des utilisateurs de paimon.moe.",
|
||||
"wishTally": "Nous faisons un décompte des voeux ! Vous pouvez envoyer votre historique de voeux pour participer. Toutes les données des pitys seront agrégées pour connaître la pity moyenne des utilisateurs de paimon.moe.",
|
||||
"wishTallyCollected": [
|
||||
"Ce qui sera collecté : les pitys",
|
||||
"et",
|
||||
|
@ -154,25 +154,25 @@
|
|||
"faqs": {
|
||||
"title": "FAQ de l'importation de l'historique des voeux",
|
||||
"q1": "Comment ça marche ?",
|
||||
"a1": "L'historique de voeux de Genshin Impact est basiquement une page web, donc vous pouvez y accéder en ouvrant l'url de la page. Une clé temporaire sera généré après que vous ayez ouvert la page d'historique de voeux ou de commentaires, et l'importeur va utiliser automatiquement l'API de MiHoYo pour récupérer votre historique de voeux.",
|
||||
"a1": "L'historique de voeux de Genshin Impact est basiquement une page web, donc vous pouvez y accéder en ouvrant l'url de la page. Une clé temporaire sera générée après que vous ayez ouvert la page d'historique de voeux ou de commentaires, et l'importateur va utiliser automatiquement l'API de MiHoYo pour récupérer votre historique de voeux.",
|
||||
"q2": "Est-ce sécurisé ? Vais-je me faire bannir ?",
|
||||
"a2": "Paimon.moe utilise les mêmes requêtes que Genshin Impact utilise pour obtenir l'historique des voeux, et Paimon.moe n'a aucun moyen de modifier les fichiers du jeu ou le stockage, et ne devrait pas poser de problème. Mais utilisez le à vos risques et périls (je l'utilise personnellement sur mon compte principal). Et vous pouvez toujours importer vos données manuellement 😀.",
|
||||
"q3": "Pouvez-vous hacker mon compte du coup ?",
|
||||
"q3": "Pouvez-vous pirater mon compte du coup ?",
|
||||
"a3": [
|
||||
"Paimon.moe ne sauvegarde jamais d'informations personnelles tels que vos identifiants (même votre UID ou pseudonyme). La réponse est donc non. De plus ce projet est open-source",
|
||||
"; Je ne veux pas salir mon image en hackant les comptes d'autres joueurs."
|
||||
"; Je ne veux pas salir mon image en piratant les comptes d'autres joueurs."
|
||||
],
|
||||
"q4": "J'ai regardé les requêtes et tout, mais pourquoi la requêtes est addressée à votre nom de domaine et pas l'API de MiHoYo ?",
|
||||
"q4": "J'ai regardé les requêtes et tout, mais pourquoi la requête est addressée à votre nom de domaine et pas l'API de MiHoYo ?",
|
||||
"a4": [
|
||||
"Paimon.moe ne peut pas addresser la requête directement à l'API de MiHoYo à cause du",
|
||||
"Paimon.moe ne peut pas adresser la requête directement à l'API de MiHoYo à cause du",
|
||||
", donc la requête est redirigée sur un simple proxy CORS pour lui permettre de fonctionner. Vous pouvez lire le code",
|
||||
"ici"
|
||||
],
|
||||
"q5": "Est-ce que vous enregistrez ma clé temporaire ou mon historique de voeux ?",
|
||||
"a5": [
|
||||
"Paimon.moe n'enregistreras jamais vos clés, et utilise HTTPS pour passer votre URL à un proxy CORS pour faire fonctionner le CORS. Paimon.moe enregistrera votre pity 4*, votre pity 5*, ainsi que les informations des voeux 5* si vous envoyez votre historique pour le décompte globale des voeux (aucune information personnelle n'est enregistré ! Consultez la",
|
||||
"Paimon.moe n'enregistrera jamais vos clés, et utilise HTTPS pour passer votre URL à un proxy CORS pour faire fonctionner le CORS. Paimon.moe enregistrera votre pity 4*, votre pity 5*, ainsi que les informations des voeux 5* si vous envoyez votre historique pour le décompte global des voeux (aucune information personnelle n'est enregistrée ! Consultez la",
|
||||
"Politique de Confidentialité",
|
||||
"pour plus d'informations). Vous pouvez désactiver l'envoie de votre historique de voeux si vous le souhaitez. Et tout votre historique de voeux est enregistré sur votre appareil (ou votre Google Drive si vous avez activé la synchronisation).",
|
||||
"pour plus d'informations). Vous pouvez désactiver l'envoi de votre historique de voeux si vous le souhaitez. Et tout votre historique de voeux est enregistré sur votre appareil (ou votre Google Drive si vous avez activé la synchronisation).",
|
||||
"Si vous ne voulez rien faire passer autour de votre URL, vous pouvez utiliser le petit script d'importation de voeux pour récupérer votre historique de voeux sur votre PC (PC Local option) "
|
||||
],
|
||||
"q6": "J'ai fait toutes les étapes, mais j'obtiens des erreurs d'API ?",
|
||||
|
@ -241,9 +241,9 @@
|
|||
"export": "Exporter sur Excel",
|
||||
"exporting": "Exportation...",
|
||||
"import": "Importer",
|
||||
"exportFinish": "Exxportation réussi, veuillez attendre que le navigateur télécharge le fichier !",
|
||||
"exportFinish": "Exportation réussi, veuillez attendre que le navigateur télécharge le fichier !",
|
||||
"wishTallyTitle": "Envoyer l'historique des voeux",
|
||||
"wishTally": "Nous faisons un décompte des voeux ! Vous pouvez envoyer votre historique de voeux pour participer. Toutes les données des pitys seront agrégés pour connaître la pity moyenne des utilisateurs de paimon.moe.",
|
||||
"wishTally": "Nous faisons un décompte des voeux ! Vous pouvez envoyer votre historique de voeux pour participer. Toutes les données des pitys seront agrégées pour connaître la pity moyenne des utilisateurs de paimon.moe.",
|
||||
"wishTallyCollected": [
|
||||
"Ce qui sera collecté : les pitys",
|
||||
"et",
|
||||
|
@ -251,26 +251,26 @@
|
|||
],
|
||||
"wishTallySubmit": "Envoyer l'historique des voeux",
|
||||
"wishTallyThankyou": "Merci pour votre participation !",
|
||||
"manualTitle": "Paramètre d'importation manuel",
|
||||
"enableManual": "Activer l'importation manuel",
|
||||
"notice": "Utiliser l'importation automatique et manuel en même temps n'est pas recommandé car nécessitant plus de test !",
|
||||
"consider": "Il est préférable d'utiliser l'importation automatique en priorité, Accédez y en cliquant sur le bouton à côté de celui qui vous a permsi d'accéder à ce menu.",
|
||||
"manualTitle": "Paramètres d'importation manuelle",
|
||||
"enableManual": "Activer l'importation manuelle",
|
||||
"notice": "Utiliser l'importation automatique et manuelle en même temps n'est pas recommandé car nécessitant plus de tests !",
|
||||
"consider": "Il est préférable d'utiliser l'importation automatique en priorité, accédez-y en cliquant sur le bouton à côté de celui qui vous a permis d'accéder à ce menu.",
|
||||
"howto": {
|
||||
"title": "Comment utiliser l'importation manuel",
|
||||
"title": "Comment utiliser l'importation manuelle",
|
||||
"subtitle": "Après un voeu seul :",
|
||||
"pressWhenYouGet": "Cliquez {button} quand vous obtenez un {rarity}?",
|
||||
"p1": "Cela va automatiquement ajouter tout les voeuxet les pitys 5? et 4?",
|
||||
"pressWhenYouGet": "Cliquez {button} quand vous obtenez un {rarity}★",
|
||||
"p1": "Cela va automatiquement ajouter tous les voeux et les pitys 5★ et 4★",
|
||||
"p2": [
|
||||
"Quand la pity",
|
||||
"atteint 10, elle va automatiquement être réinitialisé à 0"
|
||||
"atteint 10, elle va automatiquement être réinitialisée à 0"
|
||||
],
|
||||
"p3": [
|
||||
"Quand la pity",
|
||||
"atteint 90, elle va automatiquement être réinitialisé à 0"
|
||||
"atteint 90, elle va automatiquement être réinitialisée à 0"
|
||||
],
|
||||
"p4": [
|
||||
"Après un tirage de 10 voeux",
|
||||
"mais rappelez vous que le compteur de la pity peut ne pas être précis, car il n'y a aucun moyen de dire quand le voeu est arrivé (peut-être l'avez vous eu sur le premier ou le dernier voeu du tirage). Pour éviter les imprécisions, il vous faut consulter l'historique des voeux en jeu et rentrer les voeux un par un."
|
||||
"mais rappelez-vous que le compteur de la pity peut ne pas être précis, car il n'y a aucun moyen de dire quand le voeu est arrivé (peut-être l'avez-vous eu sur le premier ou le dernier voeu du tirage). Pour éviter les imprécisions, il vous faut consulter l'historique des voeux en jeu et rentrer les voeux un par un."
|
||||
],
|
||||
"p5": [
|
||||
"Vous pouvez aussi cliquer sur le bouton",
|
||||
|
@ -301,18 +301,18 @@
|
|||
"totalThisBanner": "Nombre de voeux sur la bannière",
|
||||
"worth": "Valeur",
|
||||
"loading": "Chargement... (Si cela ne charge pas, changez le serveur sur la page des paramètres)",
|
||||
"guaranteed": "Le prochain 5? sera forcément le personnage ou arme en tête de bannière",
|
||||
"guaranteed": "Le prochain 5★ sera forcément le personnage ou arme en tête de bannière",
|
||||
"unknown_3_star": "Inconnu"
|
||||
},
|
||||
"tally": {
|
||||
"title": "Voeux globaux",
|
||||
"subtitle": "Pity moyenne global à partir des données envoyés par les utilisateurs de paimon.moe",
|
||||
"subtitle": "Pity moyenne globale à partir des données envoyées par les utilisateurs de paimon.moe",
|
||||
"update": "Mis à jour",
|
||||
"summoned": "Invoqué",
|
||||
"wonFiftyFifty": "ont gagné le 50:50",
|
||||
"fromFiveStar": "de tout les 5?",
|
||||
"fromFourStar": "de tout les 4?",
|
||||
"fromFourStarFeatured": "des têtes de bannière 4?",
|
||||
"fromFiveStar": "de tout les 5★",
|
||||
"fromFourStar": "de tout les 4★",
|
||||
"fromFourStarFeatured": "des têtes de bannière 4★",
|
||||
"show": "Show",
|
||||
"name": "Nom",
|
||||
"total": "Total",
|
||||
|
@ -322,7 +322,7 @@
|
|||
"character": "Personnage",
|
||||
"error": "Les données ne sont pas encore disponibles 😞",
|
||||
"pity": "Pity",
|
||||
"median": "Médiane 5?",
|
||||
"median": "Médiane 5★",
|
||||
"user": "Nombre total d'utilisateurs",
|
||||
"detail": "Détails"
|
||||
}
|
||||
|
@ -332,7 +332,7 @@
|
|||
"titleCharacter": "Calculateur de personnage",
|
||||
"titleResin": "Calculateur de résine",
|
||||
"goto": "Allez sur {where}",
|
||||
"howToUse": "Comment utilisé",
|
||||
"howToUse": "Comment utiliser",
|
||||
"guide": {
|
||||
"clickToMaximize": "Cliquez l'image pour l'agrandir",
|
||||
"howToWeapon": "Comment utiliser le calculateur d'arme",
|
||||
|
@ -349,12 +349,12 @@
|
|||
"inputIntendedLevel": "Niveau voulu...",
|
||||
"resource": "Ressources à utiliser",
|
||||
"calculate": "Calculer",
|
||||
"unknownInformation": "Il y a des informations inconnus",
|
||||
"unknownInformation": "Il y a des informations inconnues",
|
||||
"ascensionLevel": "Niveau d'élévation",
|
||||
"mora": "Mora (approximativement ±40)",
|
||||
"expWasted": "EXP gaché",
|
||||
"addToTodo": "Ajouter à la liste de tâche",
|
||||
"addedToTodo": "Ajouté à la liste de tâche !"
|
||||
"addToTodo": "Ajouter à la liste de tâches",
|
||||
"addedToTodo": "Ajouté à la liste de tâches !"
|
||||
},
|
||||
"character": {
|
||||
"calculateAscension": "Calculer les matériaux d'élévation ?",
|
||||
|
@ -370,23 +370,23 @@
|
|||
"inputTalentNotice": "Si les couleurs sont différentes, soustrayez trois",
|
||||
"inputTalent": [
|
||||
"Niveau première aptitude",
|
||||
"Niveau deuxième aptitud",
|
||||
"Niveau troisième aptitud"
|
||||
"Niveau deuxième aptitude",
|
||||
"Niveau troisième aptitude"
|
||||
],
|
||||
"talentToLevel": "au niveau",
|
||||
"calculate": "Calculer",
|
||||
"unknownInformation": "Il y a des informations inconnus",
|
||||
"unknownInformation": "Il y a des informations inconnues",
|
||||
"ascensionLevel": "Niveau d'élévation",
|
||||
"mora": "Mora (approximativement ±40)",
|
||||
"expWasted": "EXP gaché",
|
||||
"addToTodo": "Ajouter à la liste de tâche",
|
||||
"addedToTodo": "Ajouté à la liste de tâche !"
|
||||
"addToTodo": "Ajouter à la liste de tâches",
|
||||
"addedToTodo": "Ajouté à la liste de tâches !"
|
||||
},
|
||||
"expTable": {
|
||||
"level": "Niveau",
|
||||
"items": "Objets",
|
||||
"wasted": "EXP gaché",
|
||||
"mora": "Cout en Mora"
|
||||
"mora": "Coût en Mora"
|
||||
},
|
||||
"resinTable": {
|
||||
"quantity": "Quantité",
|
||||
|
@ -397,11 +397,11 @@
|
|||
"desiredResin": "Résine voulue",
|
||||
"or": "ou",
|
||||
"inputCurrentResin": "Résine actuelle...",
|
||||
"inputDesireResin": "Combien de résine à attendre...",
|
||||
"inputDesireResin": "Combien de résines à attendre...",
|
||||
"timeFormat": "en",
|
||||
"calculate": "Calculer",
|
||||
"currentTime": "Heure actuelle",
|
||||
"fullTime": "La résine sera plaine dans...",
|
||||
"fullTime": "La résine sera pleine dans...",
|
||||
"hours": "heures",
|
||||
"minutes": "minutes",
|
||||
"seconds": "secondes"
|
||||
|
@ -433,7 +433,7 @@
|
|||
"Saturday": "Samedi"
|
||||
},
|
||||
"todo": {
|
||||
"title": "Liste de tâche",
|
||||
"title": "Liste de tâches",
|
||||
"summary": "Résumé",
|
||||
"empty": [
|
||||
"Rien à faire pour l'instant 😀",
|
||||
|
@ -441,11 +441,11 @@
|
|||
],
|
||||
"farmableToday": "Farmable aujourd'hui",
|
||||
"resin": "Résine nécessaire",
|
||||
"based": "Basé sur le Niveau d'aventure :{ar} et niveau de monde :{wl}",
|
||||
"based": "Basé sur le Niveau d'aventure: {ar} et niveau de monde: {wl}",
|
||||
"change": "(modifier dans les paramètres)",
|
||||
"approximation": "Calcul approximatif à partir des taux de drop du",
|
||||
"delete": {
|
||||
"title": "Suprimer cette tâche ?",
|
||||
"title": "Supprimer cette tâche ?",
|
||||
"cancel": "Annuler",
|
||||
"delete": "Supprimer"
|
||||
}
|
||||
|
@ -454,7 +454,7 @@
|
|||
"title": "Calendrier",
|
||||
"localTime": "Montrer avec l'heure locale",
|
||||
"starting": "Commence dans",
|
||||
"ending": "Finit dans",
|
||||
"ending": "Se termine dans",
|
||||
"live": "Est disponible !",
|
||||
"finished": "Terminé"
|
||||
},
|
||||
|
@ -467,10 +467,10 @@
|
|||
"add": "Ajouter",
|
||||
"server": "Sélectionner votre serveur:",
|
||||
"drive": [
|
||||
"Paimon.moe utilise l' Application Data Directory sur votre Google Drive pour sauvegarder et synchroniser votre compte de voeux et vos listest de tâches.",
|
||||
"Paimon.moe peux uniquement lire et modifier les fichiers que le site a créé."
|
||||
"Paimon.moe utilise l'Application Data Directory sur votre Google Drive pour sauvegarder et synchroniser vos voeux et vos listes de tâches.",
|
||||
"Paimon.moe peut uniquement lire et modifier les fichiers que le site a créé."
|
||||
],
|
||||
"driveError": "L'API de Google Drive ne peux pas être chargé",
|
||||
"driveError": "L'API de Google Drive n'a pas pu être chargée.",
|
||||
"driveSignIn": "Connexion avec Google Drive",
|
||||
"driveSignOut": "Déconnexion Google Drive",
|
||||
"synced": "Synchroniser",
|
||||
|
@ -479,7 +479,7 @@
|
|||
"lastSync": "Dernière synchronisation :",
|
||||
"feedback": "Si vous trouvez des bugs, données incorrectes ou voulez donner vos retours, laissez un message sur",
|
||||
"or": "ou",
|
||||
"thanks": "Merci😁!",
|
||||
"thanks": "Merci 😁!",
|
||||
"modal": {
|
||||
"notice": "Toutes les listes de tâches et l'historique des voeux seront supprimés",
|
||||
"backup": "Vous pouvez sauvegarder votre historique de voeux avant en l'exportant dans un fichier excel !",
|
||||
|
@ -497,7 +497,7 @@
|
|||
"content": [
|
||||
"Paimon.moe utilise",
|
||||
"plausible.io",
|
||||
"(un analyseur respectant vos données privés) pour savoir combien de gens utilises chaque fonctionnalité, pour pouvoir prioriser quelles fonctionnalités ajouter ou améliorer."
|
||||
"(un analyseur respectant vos données privées) pour savoir combien de gens utilisent chaque fonctionnalité, pour pouvoir prioriser quelles fonctionnalités ajouter ou améliorer."
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -512,13 +512,13 @@
|
|||
"title": "Pity",
|
||||
"content": [
|
||||
"Paimon.moe sauvegardera le compte de pity 4* et 5*, et les informations des voeux 5* (heure, nom de l'objet, pity) si vous cochez 'Envoyez la pity pour le décompte global de pity' via l'importateur automatique ou si l'importation est manuelle via les paramètres. Paimon.moe va aggréger les données et l'utiliser pour calculer la pity moyenne par bannière pour chaque utilisateur de paimon.moe users. Vous pouvez la consulter ici",
|
||||
"Décompte global des voeux"
|
||||
"Compteur global des voeux"
|
||||
]
|
||||
}
|
||||
],
|
||||
"subtitleNotCollect": "Ce que paimon.moe ne collecte pas",
|
||||
"notCollect": [
|
||||
"Paimon.moe ne sauvegardera jamais de mot de passe, d'IUD, de nom d'utilisateur, d'email, de clé temporaire, ou d'URL de commentaire. Si vous êtes intéresser, le projet est open-source etvous pouvez lire le code source sur",
|
||||
"Paimon.moe ne sauvegardera jamais de mot de passe, d'UID, de nom d'utilisateur, d'email, de clé temporaire, ou d'URL de commentaire. Si vous êtes intéressé, le projet est open-source et vous pouvez lire le code source sur",
|
||||
"paimon-moe-api Github",
|
||||
"et",
|
||||
"paimon-moe Github"
|
||||
|
@ -538,16 +538,16 @@
|
|||
},
|
||||
"footer": {
|
||||
"affliate": "Paimon.moe n'est pas affilié à miHoYo.",
|
||||
"copyright": "Genshin Impact, les contenus du jeu ainsi que les différents matériaux sont des marques déposés de MiHoYo.",
|
||||
"copyright": "Genshin Impact, les contenus du jeu ainsi que les différents matériaux sont des marques déposées de MiHoYo.",
|
||||
"discord": "Rejoignez notre Discord",
|
||||
"community": "Liens de la communauté",
|
||||
"official": "Liens officiels"
|
||||
},
|
||||
"donate": {
|
||||
"message": [
|
||||
"Merci ! J'espère que vous le trouver utile.",
|
||||
"J'ai fait ce site pour le fun quand j'avais un peu de temps libre. Évidemment j'ajouterais d'autres fonctionnalités et mettrais à jours les données à chaque mise à jour de Genshin Impact, car j'aime explorer le jeu et essayer d'optimiser mon expérience.",
|
||||
"Si vous voulez me faire un don, cela va vraiment m'aider à améliorer le site et ajouter plus de fonctionnalités à Paimon.moe! Merci beaucoup et amusez vous, en espérant que vvous l'appréciez !",
|
||||
"Merci ! J'espère que vous le trouvez utile.",
|
||||
"J'ai fait ce site pour le fun quand j'avais un peu de temps libre. Évidemment, j'ajouterai d'autres fonctionnalités et mettrai à jour les données à chaque mise à jour de Genshin Impact, car j'aime explorer le jeu et essayer d'optimiser mon expérience.",
|
||||
"Si vous voulez me faire un don, cela va vraiment m'aider à améliorer le site et ajouter plus de fonctionnalités à Paimon.moe! Merci beaucoup et amusez vous, en espérant que vous l'appréciez !",
|
||||
"Si vous aimez coder, vous pouvez aussi contribuer au projet sur"
|
||||
],
|
||||
"kofi": "Soutenez moi sur Ko-fi",
|
||||
|
@ -556,21 +556,21 @@
|
|||
},
|
||||
"reminder": {
|
||||
"notSupported": "Votre navigateur ne supporte pas les notifications push, veuillez essayer avec un autre navigateur !",
|
||||
"blocked": "Les notifications sont bloqués, le rappel ne fonctionnera pas ! Veuillez l'active dans votre navigateur.",
|
||||
"desktop": "Les navigateur de bureau ne peuvent pas recevoir de notifications s'ils sont fermés !",
|
||||
"early": "La notifications peut arriver plus tôt (environ 1-10 minutes) à cause de la façon dont nous envoyons la notification",
|
||||
"blocked": "Les notifications sont bloquées, le rappel ne fonctionnera pas ! Veuillez l'activer dans votre navigateur.",
|
||||
"desktop": "Les navigateurs de bureau ne peuvent pas recevoir de notifications s'ils sont fermés !",
|
||||
"early": "La notification peut arriver plus tôt (environ 1-10 minutes) à cause de la façon dont nous envoyons la notification",
|
||||
"allowNotification": "Veuillez activer les notifications dans la fenêtre venant d'apparaître !",
|
||||
"transformer": "Rappel pour le Transformateur Paramétrique",
|
||||
"last": "Entrez la dernière fois que vous avez utilisé le Transformateur Paramétrique",
|
||||
"lastHoyolab": "Entrez l'heure à laquelle vous voulez être notifé quotidiennement",
|
||||
"every": "Tout les jours à",
|
||||
"countdown": "Entrez le temps de recharge du Transformateur Paramétric (si vous ne vous rappelez plus l'heure exact, faites le approximativement)",
|
||||
"lastHoyolab": "Entrez l'heure à laquelle vous voulez être notifié quotidiennement",
|
||||
"every": "Tous les jours à",
|
||||
"countdown": "Entrez le temps de recharge du Transformateur Paramétrique (si vous ne vous rappelez plus l'heure exacte, faites le approximativement)",
|
||||
"useLast": "Utiliser l'heure de la dernière utilisation",
|
||||
"useCountdown": "Utiliser l'heure du temps de recharge",
|
||||
"set": "Créer un rappel",
|
||||
"checking": "Vérification des rappels enregistrés...",
|
||||
"errorSelect": "Veuillez sélectionner le jour et l'heure !",
|
||||
"errorSaving": "Quelques chose s'est mal passé en mettant en place le rappel 🙁",
|
||||
"errorSaving": "Quelque chose s'est mal passé en mettant en place le rappel 🙁",
|
||||
"current": "Rappel actuel",
|
||||
"hoyolab": "Rappel de récupération de récompences quotidiennes Hoyolab",
|
||||
"comingsoon": "Prochainement !"
|
||||
|
@ -589,7 +589,7 @@
|
|||
"interior": "Intérieur",
|
||||
"exterior": "Extérieur",
|
||||
"info": [
|
||||
"Cela montre la charge que la zone peut supporter. Chaque décoration possède une valeur cachée de charge qui peut être consulté ci-dessous.",
|
||||
"Cela montre la charge que la zone peut supporter. Chaque décoration possède une valeur cachée de charge qui peut être consultée ci-dessous.",
|
||||
"(la valeur de charge maximum n'a pas encore été confirmé !)"
|
||||
],
|
||||
"hall": "Hall",
|
||||
|
@ -597,4 +597,4 @@
|
|||
"exteriorNum": "Zone {number}",
|
||||
"corridor": "Corridor"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,6 +76,8 @@
|
|||
"title": "Wish Counter",
|
||||
"autoImport": "Import Otomatis",
|
||||
"helpAndSetting": "Bantuan & Pengaturan",
|
||||
"helps": "Bantuan",
|
||||
"settings": "Pengaturan",
|
||||
"wishesWorth": "Wish Setara Dengan",
|
||||
"lifetimePulls": "Total Pull",
|
||||
"guarantee": "Dijamin saat {pity}",
|
||||
|
@ -209,13 +211,41 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
"excel": {
|
||||
"title": "Excel Import",
|
||||
"subtitle": "Pilih darimana asal file excelnya:",
|
||||
"default": "Paimon.moe Export",
|
||||
"takagg": "TakaGG Gacha Export",
|
||||
"notice": [
|
||||
"Fitur ini masih dalam tahap BETA, harap backup dulu melalui Pengaturan kemudian Export ke Excel!",
|
||||
"Wish dengan waktu dan reward yang sama tidak disentuh (agar wish yg sudah tersimpan tidak tertimpa)",
|
||||
"Hanya akan menambahkan wish di akhir dan di awal, yang artinya tidak ada wish yang dimasukkan di tengah-tengah data yang sudah ada",
|
||||
"Saat ini hanya bisa digunakan untuk reward dengan nama item yang berbahasa INGGRIS"
|
||||
],
|
||||
"selectFile": {
|
||||
"default": "Drag & drop Paimon.moe file excel kesini, atau klik disini untuk memilih",
|
||||
"takagg": "Drag & drop TakaGG gacha export file excel kesini, atau klik disini untuk memilih"
|
||||
},
|
||||
"processing": "Memproses...",
|
||||
"addedOn": "Dimasukkan di bagian:",
|
||||
"beginning": "Awal",
|
||||
"end": "Akhir",
|
||||
"total": "Total",
|
||||
"saveNotice": "Simpan wish yang diimport?",
|
||||
"save": "Simpan",
|
||||
"success": "Excel import sukses 😀!",
|
||||
"errorInvalidFile": "Excel file tidak valid",
|
||||
"errorReadExcel": "Error membaca file excel!",
|
||||
"errorExcelPaimon": "Ini bukan file excel export dari paimon.moe",
|
||||
"errorUnknownItem": "Mendapatkan nama reward yang tidak diketahui"
|
||||
},
|
||||
"help": {
|
||||
"title": "Wish Counter Bantuan & Pengaturan",
|
||||
"exportTitle": "Export Riwayat Wish",
|
||||
"exportMessage": "Kamu bisa export riwayat wish mu ke file excel disini",
|
||||
"exportTitle": "Export & Import Riwayat Wish",
|
||||
"exportMessage": "Kamu bisa export riwayat wish mu ke file excel disini. Kamu juga bisa meng-import excel dari paimon.moe export atau TakaGG Gacha Export.",
|
||||
"export": "Export ke Excel",
|
||||
"exporting": "Sedang meng-export...",
|
||||
"import": "Import",
|
||||
"import": "Import dari Excel",
|
||||
"exportFinish": "Export berhasil, harap tunggu sampai file nya sudah ter-download!",
|
||||
"wishTallyTitle": "Submit Perhitungan Pity Wish",
|
||||
"wishTally": "Kita sedang melakukan perhitungan pity global! Kamu bisa mensubmit pity mu untuk berpartisipasi. Semua data pity akan dikumpulkan untuk mengetahui berapa pity rata-rata pengguna paimon.moe.",
|
||||
|
@ -549,7 +579,8 @@
|
|||
},
|
||||
"achievement": {
|
||||
"title": "Achievement",
|
||||
"of": "dari"
|
||||
"of": "dari",
|
||||
"sort": "Urutkan yang belum didapatkan dulu"
|
||||
},
|
||||
"furnishing": {
|
||||
"title": "Furnitur",
|
||||
|
|
603
src/locales/pt.json
Normal file
603
src/locales/pt.json
Normal file
|
@ -0,0 +1,603 @@
|
|||
{
|
||||
"sidebar": {
|
||||
"home": "Página Inicial",
|
||||
"character": "Personagens",
|
||||
"wishCounter": "Histórico de Orações",
|
||||
"calculator": "Calculadora",
|
||||
"database": "Banco de Dados",
|
||||
"items": "Itens",
|
||||
"achievement": "Conquistas",
|
||||
"reminder": "Lembretes",
|
||||
"todoList": "Lista de Afazeres",
|
||||
"timeline": "Linha do Tempo",
|
||||
"furnishing": "Mobília",
|
||||
"settings": "Configurações",
|
||||
"donate": "Doar"
|
||||
},
|
||||
"home": {
|
||||
"welcome": "Boas-vindas ao Paimon.moe! 👋",
|
||||
"message": "Seu melhor companheiro de Genshin Impact! Planeje seu farm com a calculadora de ascenção e acompanhe seu progresso com a lista de afazeres e o histórico de orações.",
|
||||
"banner": {
|
||||
"featured": [
|
||||
"Eula"
|
||||
],
|
||||
"summoned": "Invocados",
|
||||
"percentage": "de todos {rarity}",
|
||||
"avg": "Pity médio",
|
||||
"subtitle": "Calculado a partir dos dados enviados por {user} usuários do paimon.moe",
|
||||
"detail": "Contagem Global de Orações"
|
||||
},
|
||||
"wish": {
|
||||
"message": "Importe seu histórico de orações para mantê-lo além de 6 meses! Além disso, rastreie seu pity com um contador automático e estatísticas sobre suas orações com belos gráficos 📊",
|
||||
"latest": "Sua Última Oração",
|
||||
"banner": "Banner",
|
||||
"time": "Horário",
|
||||
"name": "Nome",
|
||||
"pity": "Pity",
|
||||
"detail": "Histórico de Orações"
|
||||
},
|
||||
"reminder": {
|
||||
"message": "Você pode definir uma notificação de lembrete 🔔 para o Transformador Paramétrico e o Check-in Diário no HoYoLAB aqui! Clique no botão de lembrete abaixo para começar!",
|
||||
"detail": "Lembretes"
|
||||
},
|
||||
"event": {
|
||||
"upcoming": "Próximo Evento",
|
||||
"current": "Evento Atual",
|
||||
"detail": "Linha do Tempo"
|
||||
},
|
||||
"discord": {
|
||||
"online": "Membros Online",
|
||||
"message": "Junte-se ao nosso servidor no Discord para receber anúncios sobre novas atualizações! Discuta também sobre Genshin Impact e envie feedback para paimon.moe.",
|
||||
"join": "Junte-se ao Discord"
|
||||
},
|
||||
"items": {
|
||||
"title": "Farmáveis Hoje",
|
||||
"detail": "Itens",
|
||||
"sunday": "Todos os itens podem ser farmados aos domingos 😁"
|
||||
},
|
||||
"calculator": {
|
||||
"title": "🧮 Calcule materiais de ascenção de Personagens, Armas e elevação de talento! Todos os cálculos podem ser adicionados na Lista de Afazeres. Também mostra quantas resinas você irá precisar!",
|
||||
"detail": "Calculadora"
|
||||
},
|
||||
"twitter": {
|
||||
"title": "Siga meu Twitter, ocasionalmente posto uma prévia do que estou desenvolvendo atualmente e as últimas atualizações para paimon.moe!",
|
||||
"detail": "Seguir no Twitter"
|
||||
},
|
||||
"achievement": {
|
||||
"title": "🏆 Veja e acompanhe sua lista de conquistas aqui",
|
||||
"detail": "Conquistas"
|
||||
}
|
||||
},
|
||||
"characters": {
|
||||
"title": "Personagens",
|
||||
"subtitle": "Os números dos status são do Nível 80, Ascenção 6. Você pode clicar nos índices da tabela para ordenar!",
|
||||
"name": "Nome",
|
||||
"element": "Elemento",
|
||||
"rarity": "Raridade",
|
||||
"weapon": "Arma",
|
||||
"talents": "Talentos",
|
||||
"passiveTalents": "Talentos Passivos",
|
||||
"constellations": "Constelações",
|
||||
"asc": "ASC",
|
||||
"lvl": "NV",
|
||||
"hp": "HP",
|
||||
"atk": "ATK",
|
||||
"def": "DEF",
|
||||
"hpPercent": "HP%",
|
||||
"atkPercent": "ATK%",
|
||||
"defPercent": "DEF%",
|
||||
"critRate": "Chance CRIT",
|
||||
"critDamage": "Dano CRIT",
|
||||
"em": "Proficiência Elemental",
|
||||
"er": "Recarga de Energia",
|
||||
"healingBonus": "Bônus de Cura",
|
||||
"pyroDamageBonus": "Bônus de Dano Pyro",
|
||||
"hydroDamageBonus": "Bônus de Dano Hydro",
|
||||
"dendroDamageBonus": "Bônus de Dano Dendro",
|
||||
"electroDamageBonus": "Bônus de Dano Electro",
|
||||
"cryoDamageBonus": "Bônus de Dano Cryo",
|
||||
"anemoDamageBonus": "Bônus de Dano Anemo",
|
||||
"physicalDamageBonus": "Bônus de Dano Físico",
|
||||
"geoDamageBonus": "Bônus de Dano Geo"
|
||||
},
|
||||
"wish": {
|
||||
"title": "Histórico de Orações",
|
||||
"autoImport": "Importar Automaticamente",
|
||||
"helpAndSetting": "Ajuda & Configurações",
|
||||
"wishesWorth": "Valor das Orações",
|
||||
"lifetimePulls": "Total de Orações Realizadas",
|
||||
"guarantee": "Garantido em {pity}",
|
||||
"name": "Nome",
|
||||
"time": "Horário",
|
||||
"pity": "Pity",
|
||||
"welcome": "Boas-vindas ao Histórico de Orações de Paimon.moe! Recomendamos importar seu histórico de orações com a opção Importar Automaticamente.",
|
||||
"welcomeStart1": "Para começar, pressione o botão",
|
||||
"welcomeStart2": "acima",
|
||||
"manual": "Se você quiser informar os dados manualmente, você pode fazer isso aqui:",
|
||||
"manualButton": "Habilitar Inserção Manual",
|
||||
"errorBanner": "Incompatibilidade no tempo do banner! Ajuste seu servidor na página de configurações. Ainda não está funcionando? Por favor, deixa uma mensagem no Discord 😅",
|
||||
"globalWishTally": "Contagem Global de Orações",
|
||||
"pityTooltip": [
|
||||
"Informa seu pity atual para {rarity}",
|
||||
"{count} orações para um {rarity} garantido"
|
||||
],
|
||||
"import": {
|
||||
"title": "Importar Histórico de Orações",
|
||||
"faqsButton": "FAQ - LEIA PRIMEIRO",
|
||||
"nonew": "Sem Novas Orações",
|
||||
"importNotice1": "Orações importadas serão anexadas ou substituídas de acordo com os dados existentes",
|
||||
"importNotice2": "Se você não tiver nenhum dado salvo anteriormente, a primeira oração será contabilizada como pity 1",
|
||||
"importNotice3": "Caso esteja importando dados de uma conta diferente, primeiro separe suas contas na página de configuração, ou os dados serão misturados!",
|
||||
"saveData": "Salvar dados de orações?",
|
||||
"reCalculating": "Recalculando pity...",
|
||||
"processing": "Processando",
|
||||
"banner": "Banner",
|
||||
"page": "Página",
|
||||
"parsing": "Parsing...",
|
||||
"save": "Salvar",
|
||||
"cancel": "Cancelar",
|
||||
"cancelling": "Cancelando...",
|
||||
"importNewWishOnly": "Importar apenas novas orações",
|
||||
"importNewWishUncheck": "Desmarque apenas caso você precise importar novamente todo seu histórico de orações",
|
||||
"import": "Importar",
|
||||
"close": "Fechar",
|
||||
"invalidLink": "Link inválido, tente novamente",
|
||||
"errorApi": "Código de erro retornado do MiHoYo API, tente novamente mais tarde!",
|
||||
"timeout": "Conexão expirou, aguarde um momento e tente novamente mais tarde",
|
||||
"invalidData": "Dados inválidos retornados pelo API, tente novamente mais tarde",
|
||||
"success": "Sucesso na Importação 😀!",
|
||||
"server": "Selecione seu servidor:",
|
||||
"wishTallyCheck": "Enviar pity para a contagem global de orações",
|
||||
"wishTally": "Estamos fazendo uma contagem global de orações! Você pode enviar sua contagem de orações para participar. Todas as informações do pity serão agregadas para saber qual a média de pity dos usuários do paimon.moe.",
|
||||
"wishTallyCollected": [
|
||||
"O que será coletado:",
|
||||
"e",
|
||||
"pity do seu histórico de orações"
|
||||
],
|
||||
"faqs": {
|
||||
"title": "Importar Histórico de Orações FAQ",
|
||||
"q1": "Como funciona?",
|
||||
"a1": "O histórico de orações de Genshin Impact é basicamente uma página na internet, então você consegue acessá-lo através de uma URL. Uma chave temporária será gerada após você abrir a página do histórico de orações ou de feedback, e o importador irá automaticamente utilizar o MiHoYo API para buscar seu histórico de orações.",
|
||||
"q2": "É seguro? Eu serei banido?",
|
||||
"a2": "Paimon.moe utiliza a mesma requisição que Genshin Impact utiliza para buscar o histórico de orações, e Paimon.moe não consegue de maneira alguma modificar quaisquer arquivos ou dados do jogo, e isso deve ser seguro. Mas use por sua própria conta e risco (bom, eu uso na minha conta principal). Você ainda pode inserir seus dados manualmente 😀.",
|
||||
"q3": "Então você pode hackear minha conta?",
|
||||
"a3": [
|
||||
"Paimon.moe nunca salva informações pessoais como suas credenciais (nem mesmo UID ou apelido), então a resposta é não. Este projeto é de código aberto em",
|
||||
"; Não estou planejando manchar minha reputação hackeando a conta de outras pessoas."
|
||||
],
|
||||
"q4": "Ei, eu verifiquei as requisições e tal, mas por que as requisições são feitas em seu próprio domínio ao invés do MiHoYo API?",
|
||||
"a4": [
|
||||
"Paimon.moe não pode fazer uma requisição diretamente para o MiHoYo API devido ao",
|
||||
", então a requisição é redirecionada para um simples proxy CORS para que funcione. Você pode ver o código",
|
||||
"aqui"
|
||||
],
|
||||
"q5": "Você armazena minha chave temporária ou meu histórico de orações?",
|
||||
"a5": [
|
||||
"Paimon.moe jamais irá armazenar suas chaves, e utiliza HTTPS para passar sua URL para um proxy CORS para fazer o CORS funcionar. Paimon.moe irá salvar seu pity de 4*, seu pity de 5*, e as informações de uma oração 5* se você enviar sua oração para nossa contagem global de orações (nenhuma informação privada salva! Verifique",
|
||||
"Políticas de Privacidade",
|
||||
"para mais informações). Você pode desmarcar a opção de enviar sua oração para a contagem global. Então, todo seu histórico de orações é salvo em seu dispositivo (ou Google Drive caso você tenha ativado a sincronização).",
|
||||
"Se você não deseja compartilhar sua URL, você pode utilizar um pequeno script de importação para salvar seu histórico de orações em seu PC (opção para PC Local)"
|
||||
],
|
||||
"q6": "Eu fiz todos os procedimentos, mas tive um erro na API?",
|
||||
"a6": "Certifique-se de copiar todo o texto (segura e pressione Selecionar Tudo para dispositivos móveis); talvez você tenha esquecido alguns caracteres que não necessários para o funcionamento da importação.",
|
||||
"q7": "Não leu todo meu histórico!?",
|
||||
"a7": "Histórico de orações mais antigos que 6 meses são deletados dos servidores da MiHoYo, então se você não possui um backup em algum lugar, infelizmente se foi"
|
||||
},
|
||||
"guide": {
|
||||
"video": "Tutorial em Vídeo",
|
||||
"pc": [
|
||||
"Abra o menu da Paimon [ESC]",
|
||||
"Clique em Feedback",
|
||||
"Espere carregar, e então uma página no navegador será aberta",
|
||||
"Copie & cole o link na caixa de texto abaixo",
|
||||
"Cole o link aqui... https://webstatic..."
|
||||
],
|
||||
"android": [
|
||||
"Abra Orações (dentro do jogo)",
|
||||
"Pressione Histórico",
|
||||
"Aguarde o carregamento",
|
||||
"Desligue seu Wi-Fi e o tráfego de dados móveis",
|
||||
"Pressione atualizar no canto superior direito",
|
||||
"A página deverá informar um erro e irá mostrar um texto com uma fonte preta",
|
||||
"Segure e pressione Selecionar Tudo, e então copie o texto (não copie apenas uma parte)",
|
||||
"Ligue seu Wi-Fi ou tráfego de dados móveis",
|
||||
"Cole o texto na caixa de texto abaixo",
|
||||
"Cole o texto aqui... Webpage not available..."
|
||||
],
|
||||
"ios": [
|
||||
"Abra o menu da Paimon [ESC]",
|
||||
"Clique em Feedback",
|
||||
"Espere carregar, e então a página de feedback irá abrir",
|
||||
"Pressione Problemas com o jogo",
|
||||
"Pressione Modo Co-Op",
|
||||
"Há um link embaixo da resposta; pressione nele",
|
||||
"Um navegador deve abrir. Copie o link e cole-o abaixo",
|
||||
"Cole o link aqui... https://genshin.mihoyo..."
|
||||
],
|
||||
"ps": [
|
||||
"Você só pode usar esse método caso tenha um e-mail dentro do jogo com um QR Code para abrir uma página de evento web",
|
||||
"Abra Genshin Impact no seu PlayStation",
|
||||
"Abra o email do evento que contém QR Code",
|
||||
"Escaneie o QR Code com seu celular",
|
||||
"Copie o link e cole-o abaixo",
|
||||
"Cole o link aqui..."
|
||||
],
|
||||
"pclocal": [
|
||||
"Se você não se sente confortável em compartilhar sua URL de feedback, você pode usar esta opção para processar seu histórico de orações em seu PC localmente. Este script irá ler o log em seu PC para gerar a URL do histórico de orações.",
|
||||
"Abra o menu Iniciar, e então procure por Powershell",
|
||||
"Abra o Powershell do Widows, e então copie & cole o script abaixo no Powershell",
|
||||
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
|
||||
"Você pode revisar o script",
|
||||
"aqui",
|
||||
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
|
||||
"Pressione Enter para rodar o script, e então siga as instruções",
|
||||
"Depois disso, cole o resultado do script na caixa de texto abaixo",
|
||||
"Cole o resultado aqui...",
|
||||
"Esse recurso ainda está em fase beta, então por favor faça um backup antes indo no menu de Ajuda & Configurações, e então Exportar para Excel."
|
||||
]
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"title": "Ajuda & Configurações do Histórico de Orações",
|
||||
"exportTitle": "Exportar Histórico de Orações",
|
||||
"exportMessage": "Você pode exportar seu histórico de orações para um arquivo Excel aqui",
|
||||
"export": "Exportar para Excel",
|
||||
"exporting": "Exportando...",
|
||||
"import": "Importar",
|
||||
"exportFinish": "Exportado com successo, aguarde até que o navegador realize o download do arquivo!",
|
||||
"wishTallyTitle": "Enviar Contagem de Orações",
|
||||
"wishTally": "Estamos fazendo uma contagem global de orações! Você pode enviar sua contagem de orações para participar. Todas as informações do pity serão agregadas para saber qual a média de pity dos usuários do paimon.moe.",
|
||||
"wishTallyCollected": [
|
||||
"O que será coletado:",
|
||||
"e",
|
||||
"pity do seu histórico de orações"
|
||||
],
|
||||
"wishTallySubmit": "Enviar Contagem de Orações",
|
||||
"wishTallyThankyou": "Obrigado por participar!",
|
||||
"manualTitle": "Configuração de Inserção Manual",
|
||||
"enableManual": "Habilitar Inserção Manual",
|
||||
"notice": "Utilizar a Importação Automática e a Importação Manual simultaneamente não é recomendado uma vez que ainda são necessários mais alguns testes!",
|
||||
"consider": "Considere utilizar a Importação Automática primeiro. Acesse-a clicando no botão próximo ao botão que você clicou para abrir este Como Fazer.",
|
||||
"howto": {
|
||||
"title": "Como Utilizar a Inserção Manual",
|
||||
"subtitle": "Após 1x Oração:",
|
||||
"pressWhenYouGet": "Pressione {button} quando você conseguir um item {rarity}★",
|
||||
"p1": "Será adicionado automaticamente no seu total de orações realizadas, pity de 5★, de pity de 4★",
|
||||
"p2": [
|
||||
"Quando o pity de",
|
||||
"chegar a 10, seu valor será automaticamente restaurado para 0"
|
||||
],
|
||||
"p3": [
|
||||
"Quando o pity de",
|
||||
"chegar a 90, seu valor será automaticamente restaurado para 0"
|
||||
],
|
||||
"p4": [
|
||||
"Depois de realizar uma 10x Orações, pressione",
|
||||
"mas tenha em mente que o contador de pity pode não ser preciso, pois não há como saber quando o drop ocorreu (talvez você tenha pego o item na 1ª ou mesmo na 10ª oração). Para garantir que o contador irá se manter preciso, você precisa verificar a tabela de histórico e adicionar um por um igual é feito em 1x Oração."
|
||||
],
|
||||
"p5": [
|
||||
"Você também pode pressionar o botão",
|
||||
"para editar os valores manualmente!"
|
||||
],
|
||||
"p6": [
|
||||
"Pressione a seta embaixo para visualizar os detalhes das orações. Um pop-up irá aparecer quando você conseguir um item",
|
||||
"ou",
|
||||
"Você também pode adicionar ou editar a tabela manualmente."
|
||||
]
|
||||
}
|
||||
},
|
||||
"types": {
|
||||
"beginners": "Desejo dos Novatos",
|
||||
"standard": "Invocação do Mochileiro",
|
||||
"character-event": "Evento de Personagem",
|
||||
"weapon-event": "Evento de Arma"
|
||||
},
|
||||
"detail": {
|
||||
"weapon": "Arma",
|
||||
"character": "Personagem",
|
||||
"time": "Horário",
|
||||
"pity": "Pity",
|
||||
"name": "Nome",
|
||||
"type": "Tipo",
|
||||
"banner": "Banner",
|
||||
"roll": "#Orações",
|
||||
"totalThisBanner": "Total de orações nesse banner",
|
||||
"worth": "Valor",
|
||||
"loading": "Carregando... (Se travar, troque seu servidor na página de configurações)",
|
||||
"guaranteed": "O próximo 5★ é garantido ser o item promocional, personagem ou arma",
|
||||
"unknown_3_star": "Desconhecido"
|
||||
},
|
||||
"tally": {
|
||||
"title": "Contagem de Orações",
|
||||
"subtitle": "Média de pity global de acordo com as submissões dos usuários de paimon.moe",
|
||||
"update": "Atualizado",
|
||||
"summoned": "Invocados",
|
||||
"wonFiftyFifty": "ganhou no 50:50",
|
||||
"fromFiveStar": "de todos 5★",
|
||||
"fromFourStar": "de todos 4★",
|
||||
"fromFourStarFeatured": "dos destaques 4★",
|
||||
"show": "Mostrar",
|
||||
"name": "Nome",
|
||||
"total": "Total",
|
||||
"wishTotal": "Total de Orações",
|
||||
"worth": "Valor",
|
||||
"weapon": "Armas",
|
||||
"character": "Personagens",
|
||||
"error": "Dados ainda não disponíveis 😞",
|
||||
"pity": "Pity",
|
||||
"median": "5★ Mediana",
|
||||
"user": "Total de Usuários",
|
||||
"detail": "Detalhes"
|
||||
}
|
||||
},
|
||||
"calculator": {
|
||||
"titleWeapon": "Calculadora de Armas",
|
||||
"titleCharacter": "Calculadora de Personagens",
|
||||
"titleResin": "Calculadora de Resina",
|
||||
"goto": "Ir para {where}",
|
||||
"howToUse": "Como Usar",
|
||||
"guide": {
|
||||
"clickToMaximize": "Clique na imagem para maximizar",
|
||||
"howToWeapon": "Como usar a Calculadora de Armas",
|
||||
"howToCharacter": "Como usar a Calculadora de Personagens"
|
||||
},
|
||||
"weapon": {
|
||||
"calculateAscension": "Calcular Materiais de Ascenção?",
|
||||
"selectRarity": "Selecione a raridade da arma",
|
||||
"selectWeapon": "Selecione a arma",
|
||||
"current": "Nível, EXP, & Ascenção Atual da Arma",
|
||||
"inputCurrentLevel": "Informe o nível atual da arma...",
|
||||
"inputCurrentExp": "Informe a EXP atual da arma...",
|
||||
"intended": "Nível & Ascenção de Arma Desejados",
|
||||
"inputIntendedLevel": "Informe o nível desejado para a arma...",
|
||||
"resource": "Recursos para Usar",
|
||||
"calculate": "Calcular",
|
||||
"unknownInformation": "Há alguma informação desconhecida",
|
||||
"ascensionLevel": "Nível de ascenção",
|
||||
"mora": "Mora (aproximadamente ±40)",
|
||||
"expWasted": "EXP Desperdiçada",
|
||||
"addToTodo": "Adicionar na Lista de Afazeres",
|
||||
"addedToTodo": "Adicionado na Lista de Afazeres"
|
||||
},
|
||||
"character": {
|
||||
"calculateAscension": "Calcular Materiais de Ascenção?",
|
||||
"selectCharacter": "Selecione o personagem",
|
||||
"current": "Nível, EXP, & Ascenção Atual do Personagem",
|
||||
"inputCurrentLevel": "Informe o nível atual do personagem...",
|
||||
"inputCurrentExp": "Informe a EXP atual do personagem...",
|
||||
"intended": "Nível & Ascenção de Personagem Desejados",
|
||||
"inputIntendedLevel": "Informe o nível desejado para o personagem...",
|
||||
"resource": "Recursos para Usar",
|
||||
"calculateTalent": "Calcular Materiais de Elevação de Talentos?",
|
||||
"inputTalentLevel": "Informe os níveis atuais do 1º, 2º e 3º talento",
|
||||
"inputTalentNotice": "Se algum talento possuir cor diferente, subtraia 3",
|
||||
"inputTalent": [
|
||||
"Nível do 1º talento",
|
||||
"Nível do 2º talento",
|
||||
"Nível do 3º talento"
|
||||
],
|
||||
"talentToLevel": "para o nível",
|
||||
"calculate": "Calcular",
|
||||
"unknownInformation": "Há alguma informação desconhecida",
|
||||
"ascensionLevel": "Nível de ascenção",
|
||||
"mora": "Mora (aproximadamente ±40)",
|
||||
"expWasted": "EXP Desperdiçada",
|
||||
"addToTodo": "Adicionar na Lista de Afazeres",
|
||||
"addedToTodo": "Adicionado na Lista de Afazeres"
|
||||
},
|
||||
"expTable": {
|
||||
"level": "Nível",
|
||||
"items": "Itens",
|
||||
"wasted": "EXP Desperdiçada",
|
||||
"mora": "Custo em Mora"
|
||||
},
|
||||
"resinTable": {
|
||||
"quantity": "Quantidade",
|
||||
"time": "Tempo a Esperar"
|
||||
},
|
||||
"resin": {
|
||||
"currentResin": "Resina Atual",
|
||||
"desiredResin": "Resina Desejada",
|
||||
"or": "ou",
|
||||
"inputCurrentResin": "Informe a quantidade de resina atual...",
|
||||
"inputDesireResin": "Informe quantas resinas você quer esperar...",
|
||||
"timeFormat": "en",
|
||||
"calculate": "Calcular",
|
||||
"currentTime": "Horário Atual",
|
||||
"fullTime": "Será reabastecida em",
|
||||
"hours": "horas",
|
||||
"minutes": "minutos",
|
||||
"seconds": "segundos"
|
||||
}
|
||||
},
|
||||
"items": {
|
||||
"title": "Lista de Itens",
|
||||
"subtitle": "Clique na imagem do item para adicioná-lo na lista de afazeres",
|
||||
"searchCharacter": "Buscar personagem",
|
||||
"searchWeapon": "Buscar arma",
|
||||
"day": "Dias",
|
||||
"material": "Materiais",
|
||||
"characterWeapons": "Personagens & Armas",
|
||||
"add": {
|
||||
"rarity": "Selecione a Raridade",
|
||||
"amount": "Quantidade",
|
||||
"inputAmount": "Informe a quantidade...",
|
||||
"cancel": "Cancelar",
|
||||
"add": "Adicionar à lista"
|
||||
}
|
||||
},
|
||||
"days": {
|
||||
"Sunday": "Domingo",
|
||||
"Monday": "Segunda-feira",
|
||||
"Tuesday": "Terça-feira",
|
||||
"Wednesday": "Quarta-feira",
|
||||
"Thursday": "Quinta-feira",
|
||||
"Friday": "Sexta-feira",
|
||||
"Saturday": "Sábado"
|
||||
},
|
||||
"todo": {
|
||||
"title": "Lista de Afazeres",
|
||||
"summary": "Sumário",
|
||||
"empty": [
|
||||
"Nada para fazer ainda 😀",
|
||||
"Adicione algumas coisas a partir da Cálculadora ou da página de Itens!"
|
||||
],
|
||||
"farmableToday": "Farmáveis hoje",
|
||||
"resin": "Resinas necessárias",
|
||||
"based": "Baseado no AR:{ar} e WL:{wl}",
|
||||
"change": "(altera nas configurações)",
|
||||
"approximation": "Aproximação calculada a partir da taxa de drops por",
|
||||
"delete": {
|
||||
"title": "Deletar esse afazer?",
|
||||
"cancel": "Cancelar",
|
||||
"delete": "Deletar"
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"title": "Linha do Tempo",
|
||||
"localTime": "Mostrar como fuso horário local",
|
||||
"starting": "Começando em",
|
||||
"ending": "Terminando em",
|
||||
"live": "Disponível agora!",
|
||||
"finished": "Finalizado"
|
||||
},
|
||||
"settings": {
|
||||
"version": "Versão do Jogo:",
|
||||
"multiple": "Possui múltiplas contas? Escolha sua conta aqui para separar os dados de seu Histórico de Orações e Lista de Afazeres",
|
||||
"selectAccount": "Selecione sua conta",
|
||||
"reset": "Resetar",
|
||||
"delete": "Deletar",
|
||||
"add": "Adicionar",
|
||||
"server": "Selecione seu servidor:",
|
||||
"drive": [
|
||||
"Paimon.moe usa o diretório Application Data em seu Google Drive para salvar e sincronizar seu Histórico de Orações e Lista de Afazeres.",
|
||||
"Paimon.moe pode apenas ler e escrever em arquivos que o site criou."
|
||||
],
|
||||
"driveError": "API do Google Drive não pôde ser carregado",
|
||||
"driveSignIn": "Entrar no Google Drive",
|
||||
"driveSignOut": "Sair do Google Drive",
|
||||
"synced": "Sincronizado",
|
||||
"waiting": "Aguardando...",
|
||||
"syncing": "Sincronizando...",
|
||||
"lastSync": "Última Sincronização:",
|
||||
"feedback": "Se você encontrou algum bug, informação incorreta ou tem qualquer outro feedback, por favor deixe uma mensagem em",
|
||||
"or": "ou",
|
||||
"thanks": "Obrigado😁!",
|
||||
"modal": {
|
||||
"notice": "Todos os dados da Lista de Afazeres e Histórico de Orações serão apagados",
|
||||
"backup": "Você pode fazer um backup do seu histórico de orações através de uma exportação para um arquivo do Excel!",
|
||||
"cancel": "Cancelar",
|
||||
"delete": "Deletar",
|
||||
"reset": "Resetar"
|
||||
}
|
||||
},
|
||||
"privacypolicy": {
|
||||
"title": "Política de Privacidade",
|
||||
"subtitle": "O que paimon.moe coleta e pra que é usado",
|
||||
"collect": [
|
||||
{
|
||||
"title": "URL visitada em paimon.moe, referenciador, navegador, sistema operacional, tipo de dispositivo, país do visitante",
|
||||
"content": [
|
||||
"Paimon.moe utiliza",
|
||||
"plausible.io",
|
||||
"(um analisador de privacidade amigável) para que possamos ver quantas pessoas utilizam determinado recurso, para que então possamos determinar qual recurso priorizar na implementação ou melhoria."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Mensagens de erros e exceções do site",
|
||||
"content": [
|
||||
"Paimon.moe irá enviar erros e exceções do site para",
|
||||
"sentry.io",
|
||||
"para que possamos determinar o que está causando problema e corrigir adequadamente."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pity de Orações",
|
||||
"content": [
|
||||
"Paimon.moe irá salvar a contagem do pity de 4*, a contagem do pity de 5*, e as informações da oração de 5* (horário, nome do item, contagem do pity) caso você marque a caixa 'Enviar pity para a contagem global de orações' na Importação Automática de Orações ou enviar manualmente no menu de Ajuda & Configurações. Paimon.moe irá agregar os dados e usá-los para calcular o pity médio para cada banner levando em consideração os usuários do paimon.moe. Você pode conferir aqui",
|
||||
"contagem de orações"
|
||||
]
|
||||
}
|
||||
],
|
||||
"subtitleNotCollect": "O que paimon.moe NÃO coleta",
|
||||
"notCollect": [
|
||||
"Paimon.moe nunca salva nenhuma senha, uid, usuário, e-mail, chaves temporárias, ou url de feedback. Se você estiver interessado, o projeto possui código aberto e você pode consultar o código fonte em",
|
||||
"paimon-moe-api Github",
|
||||
"e",
|
||||
"paimon-moe Github"
|
||||
]
|
||||
},
|
||||
"sync": {
|
||||
"message": "Seus dados locais neste navegador estão em conflito com os dados armazenados no Google Drive!",
|
||||
"googleDriveData": "Dados do Google Drive",
|
||||
"localData": "Dados Locais Deste Navegador",
|
||||
"older": "MAIS ANTIGO",
|
||||
"newer": "MAIS RECENTE",
|
||||
"useGoogleDriveData": "Usar Dados do Google Drive",
|
||||
"useLocalData": "Usar Dados Locais Deste Navegador",
|
||||
"download": "Baixar Ambos os Dados",
|
||||
"lastModified": "Última modificação",
|
||||
"or": "ou"
|
||||
},
|
||||
"footer": {
|
||||
"affliate": "Paimon.moe não está afiliada com a miHoYo.",
|
||||
"copyright": "Genshin Impact, os conteúdo e materiais do jogo são marcas registradas e de direitos autorais da miHoYo.",
|
||||
"discord": "Junte-se ao Discord",
|
||||
"community": "Links da Comunidade",
|
||||
"official": "Links Oficiais"
|
||||
},
|
||||
"donate": {
|
||||
"message": [
|
||||
"Muito obrigado! Espero que ache isso útil.",
|
||||
"Fiz este site para me divertir quando tenha um tempo livre. Obviamente irei adicionar mais recursos e atualizarei os dados a cada nova atualização, pois gosto de explorar o jogo e tentar maximizar minha experiência",
|
||||
"Se você quiser doar, sua doação definitivamente irá ajudar a melhorar o site e me motivar a adicionar mais conteúdo para Paimon.moe! Muito obrigado e divirta-se, espero que goste!",
|
||||
"Se você gosta de codificar, você também pode contribuir para o projeto em"
|
||||
],
|
||||
"kofi": "Apoie-me no Ko-fi",
|
||||
"trakteer": "Apoie-me no Trakteer",
|
||||
"crypto": "Apoie-me com Crypto"
|
||||
},
|
||||
"reminder": {
|
||||
"notSupported": "Seu navegador não suporta notificações por push, por favor tente outro navegador!",
|
||||
"blocked": "Notificações estão bloqueadas, as notificações de lembrete não irão funcionar! Por favor ative-as em seu navegador.",
|
||||
"desktop": "Navegador desktop não pode receber notificações caso não esteja rodando!",
|
||||
"early": "A notificação poderá chegar mais cedo (cerca de 1-10 minutos) devido ao modo que enviamos a notificação",
|
||||
"allowNotification": "Por favor, permita o prompt de notificação!",
|
||||
"transformer": "Lembrete do Transformador Paramétrico",
|
||||
"last": "Informe quando foi a última vez que você usou o Transformador Paramétrico",
|
||||
"lastHoyolab": "Informe qual horário você deseja ser notificado sobre o check-in diário",
|
||||
"every": "Todos os dias às",
|
||||
"countdown": "Informe a contagem regressiva do Transformador Paramétrico (Se você não lembra o horário exato, você precisará aproximar)",
|
||||
"useLast": "Usar último horário",
|
||||
"useCountdown": "Usar contagem regressiva",
|
||||
"set": "Definir Lembrete",
|
||||
"checking": "Verificando lembretes salvos...",
|
||||
"errorSelect": "Por favor selecione o dia e horário!",
|
||||
"errorSaving": "Alguma coisa deu errado ao salvar o lembrete 🙁",
|
||||
"current": "Lembrete atual",
|
||||
"hoyolab": "Lembrete do Check-in Diário no HoYoLAB",
|
||||
"comingsoon": "Em Breve!"
|
||||
},
|
||||
"achievement": {
|
||||
"title": "Conquistas",
|
||||
"of": "de"
|
||||
},
|
||||
"furnishing": {
|
||||
"title": "Mobília",
|
||||
"name": "Nome",
|
||||
"energy": "Energia",
|
||||
"load": "Carga",
|
||||
"ratio": "Proporção",
|
||||
"using": "Quantidade",
|
||||
"interior": "Interior",
|
||||
"exterior": "Exterior",
|
||||
"info": [
|
||||
"Mostra a capacidade de carga de cada área. Cada mobília possui um valor oculto de carga que pode ser visualizado abaixo.",
|
||||
"(o valor máximo ainda não foi confirmado!)"
|
||||
],
|
||||
"hall": "Salão",
|
||||
"room": "Quarto {number}",
|
||||
"exteriorNum": "Exterior {number}",
|
||||
"corridor": "Corredor"
|
||||
}
|
||||
}
|
|
@ -104,6 +104,8 @@
|
|||
"title": "Счетчик молитв",
|
||||
"autoImport": "Авто импорт",
|
||||
"helpAndSetting": "Помощь и настройки",
|
||||
"helps": "Помощь",
|
||||
"settings": "Настройки",
|
||||
"wishesWorth": "Стоимость молитв",
|
||||
"lifetimePulls": "Молитв за все время",
|
||||
"guarantee": "Гарант к {pity}",
|
||||
|
@ -237,13 +239,41 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
"excel": {
|
||||
"title": "Excel Импортер",
|
||||
"subtitle": "Выберите, откуда берется ваш excel:",
|
||||
"default": "Paimon.moe Export",
|
||||
"takagg": "TakaGG Gacha Export",
|
||||
"notice": [
|
||||
"Эта функция все еще находится в бета-версии, пожалуйста, сначала сделайте резервную копию, перейдя в Настройки, затем нажмите Экспорт в Excel!",
|
||||
"Молитвы с той же временной меткой и именем награды НЕ будут затронуты (поэтому существующие молитвы не будут переписаны)",
|
||||
"Новые молитвы будут добавляться в конце списка, это означает, что ничего не будет добавлено в середину",
|
||||
"В настоящее время поддерживается excel только с АНГЛИЙСКИМИ именами наград"
|
||||
],
|
||||
"selectFile": {
|
||||
"default": "Перетащите файл файл excel из Paimon.moe export сюда, или нажмите здесь, чтобы выбрать",
|
||||
"takagg": "Перетащите сюда файл excel из TakaGG gacha export, или нажмите здесь, чтобы выбрать"
|
||||
},
|
||||
"processing": "Обработка...",
|
||||
"addedOn": "Вставлено в:",
|
||||
"beginning": "Начале",
|
||||
"end": "Конце",
|
||||
"total": "Всего",
|
||||
"saveNotice": "Сохранить импортированные молитвы?",
|
||||
"save": "Сохранить",
|
||||
"success": "Excel успешно импортирован 😀!",
|
||||
"errorInvalidFile": "Некорректный файл excel",
|
||||
"errorReadExcel": "Ошибка при чтении файла excel!",
|
||||
"errorExcelPaimon": "Этот excel не из paimon.moe export",
|
||||
"errorUnknownItem": "Получено неизвестное имя награды"
|
||||
},
|
||||
"help": {
|
||||
"title": "Счетчик молитв помощь и настройки",
|
||||
"exportTitle": "Эскпорт истории молитв",
|
||||
"exportMessage": "Вы можете экспортировать вашу историю молитв в excel файл здесь",
|
||||
"exportTitle": "Экспорт и Импорт истории молитв",
|
||||
"exportMessage": "Здесь вы можете экспортировать историю молитв в Excel файл. Вы так же можете импортировать экспортированный excel файл с paimon.moe export или TakaGG Gacha export.",
|
||||
"export": "Экспорт в Excel",
|
||||
"exporting": "Экспорт...",
|
||||
"import": "Импорт",
|
||||
"import": "Импорт из Excel",
|
||||
"exportFinish": "Успешный экспорт, пожалуйста подождите пока браузер загрузит файл!",
|
||||
"wishTallyTitle": "Отправить данные о молитвах для глобальной статистики",
|
||||
"wishTally": "Мы собираем глобальную статистику молитв! Вы можете отправить свои молитвы чтобы помочь нам. Все данные будут собраны чтобы узнать средний гарант у пользователей paimon.moe.",
|
||||
|
@ -580,7 +610,8 @@
|
|||
},
|
||||
"achievement": {
|
||||
"title": "Достижения",
|
||||
"of": "из"
|
||||
"of": "из",
|
||||
"sort": "Сначала незавершенные"
|
||||
},
|
||||
"furnishing": {
|
||||
"title": "Мебель",
|
||||
|
|
603
src/locales/zh.json
Normal file
603
src/locales/zh.json
Normal file
|
@ -0,0 +1,603 @@
|
|||
{
|
||||
"sidebar": {
|
||||
"home": "主页",
|
||||
"character": "角色",
|
||||
"wishCounter": "祈愿统计",
|
||||
"calculator": "升级计算器",
|
||||
"database": "数据库",
|
||||
"items": "素材道具",
|
||||
"achievement": "成就",
|
||||
"reminder": "提醒器",
|
||||
"todoList": "Todo 规划",
|
||||
"timeline": "时间线",
|
||||
"furnishing": "家具",
|
||||
"settings": "设置",
|
||||
"donate": "赞助"
|
||||
},
|
||||
"home": {
|
||||
"welcome": "欢迎来到 Paimon.moe! 👋",
|
||||
"message": "你最好的原神伙伴! 帮助你规划材料消耗与刷本, 追踪你的游戏进度与抽卡结果.",
|
||||
"banner": {
|
||||
"featured": [
|
||||
"优菈"
|
||||
],
|
||||
"summoned": "被抽到",
|
||||
"percentage": "占比于 {rarity}",
|
||||
"avg": "平均出金抽数",
|
||||
"subtitle": "计算数据来自 {user} 位 paimon.moe 用户提交的祈愿记录",
|
||||
"detail": "全球祈愿统计"
|
||||
},
|
||||
"wish": {
|
||||
"message": "导入你的祈愿记录, 以避免超过6个月会消失! 你的祈愿与保底情况会以表格形式自动计算展示。 📊",
|
||||
"latest": "你上一次抽卡",
|
||||
"banner": "祈愿池",
|
||||
"time": "时间",
|
||||
"name": "名字",
|
||||
"pity": "保底进度",
|
||||
"detail": "祈愿统计"
|
||||
},
|
||||
"reminder": {
|
||||
"message": "你可以通过计时器 🔔 来提醒使用质量参变仪和米游社签到的时间! 点击下方按钮来设置!",
|
||||
"detail": "提醒器"
|
||||
},
|
||||
"event": {
|
||||
"upcoming": "未来活动",
|
||||
"current": "当前活动",
|
||||
"detail": "时间线"
|
||||
},
|
||||
"discord": {
|
||||
"online": "在线成员",
|
||||
"message": "加入我们的 Discord 来获取最新通知! 也可以讨论原神以及本网站的反馈.",
|
||||
"join": "加入我们的 Discord"
|
||||
},
|
||||
"items": {
|
||||
"title": "今日可刷取",
|
||||
"detail": "道具",
|
||||
"sunday": "周日可以刷所有东西 😁"
|
||||
},
|
||||
"calculator": {
|
||||
"title": "🧮 计算角色、武器升级消耗! 所有计算都可以添加到 Todo 规划里, 可以显示你需要多少树脂!",
|
||||
"detail": "计算器"
|
||||
},
|
||||
"twitter": {
|
||||
"title": "关注我的 Twitter, 我会把目前开发的东西和 paimon.moe 的最新更新发布上去!",
|
||||
"detail": "关注 Twitter"
|
||||
},
|
||||
"achievement": {
|
||||
"title": "🏆 查看追踪你的成就完成状态",
|
||||
"detail": "成就"
|
||||
}
|
||||
},
|
||||
"characters": {
|
||||
"title": "角色",
|
||||
"subtitle": "表中数据为80级6阶突破. 可以点击表格标题来排序显示!",
|
||||
"name": "角色名",
|
||||
"element": "元素",
|
||||
"rarity": "稀有度",
|
||||
"weapon": "武器",
|
||||
"talents": "天赋",
|
||||
"passiveTalents": "被动天赋",
|
||||
"constellations": "命之座",
|
||||
"asc": "突破",
|
||||
"lvl": "等级",
|
||||
"hp": "生命",
|
||||
"atk": "攻击",
|
||||
"def": "防御",
|
||||
"hpPercent": "生命%",
|
||||
"atkPercent": "攻击%",
|
||||
"defPercent": "防御%",
|
||||
"critRate": "暴击率",
|
||||
"critDamage": "暴击伤害",
|
||||
"em": "元素精通",
|
||||
"er": "元素充能效率",
|
||||
"healingBonus": "治疗加成",
|
||||
"pyroDamageBonus": "火元素伤害加成",
|
||||
"hydroDamageBonus": "水元素伤害加成",
|
||||
"dendroDamageBonus": "草元素伤害加成",
|
||||
"electroDamageBonus": "雷元素伤害加成",
|
||||
"cryoDamageBonus": "冰元素伤害加成",
|
||||
"anemoDamageBonus": "风元素伤害加成",
|
||||
"physicalDamageBonus": "物理伤害加成",
|
||||
"geoDamageBonus": "岩元素伤害加成"
|
||||
},
|
||||
"wish": {
|
||||
"title": "祈愿统计",
|
||||
"autoImport": "自动导入",
|
||||
"helpAndSetting": "帮助 & 设置",
|
||||
"wishesWorth": "已抽原石",
|
||||
"lifetimePulls": "总抽卡次数",
|
||||
"guarantee": "保底上限 {pity}",
|
||||
"name": "名字",
|
||||
"time": "时间",
|
||||
"pity": "保底",
|
||||
"welcome": "欢迎来到 Paimon.moe 祈愿统计! 建议使用自动导入功能来上传你的祈愿记录.",
|
||||
"welcomeStart1": "想要使用, 点击",
|
||||
"welcomeStart2": "上面的按钮即可",
|
||||
"manual": "如果你想手动输入数据, 你可以在这里启用该功能:",
|
||||
"manualButton": "启用手动输入",
|
||||
"errorBanner": "卡池时间错误! 请在设置页面修改你所属的服务器. 如果还是出错, 请到 Discord 中反馈 😅",
|
||||
"globalWishTally": "全球祈愿统计",
|
||||
"pityTooltip": [
|
||||
"显示你当前 {rarity} 保底进度",
|
||||
"{count} 抽可获得 {rarity}"
|
||||
],
|
||||
"import": {
|
||||
"title": "导入祈愿历史记录",
|
||||
"faqsButton": "常见问题 - 先读这个",
|
||||
"nonew": "没有新的记录",
|
||||
"importNotice1": "导入的祈愿记录会添加或覆盖到当前数据中",
|
||||
"importNotice2": "如果你先前没有任何记录, 你的保底进度将从头开始计算",
|
||||
"importNotice3": "请注意你导入的记录是否属于同一个账号, 一定要确保你在设置页面内区分了不同账号, 不然你的数据会混!",
|
||||
"saveData": "保存祈愿数据?",
|
||||
"reCalculating": "重新计算保底...",
|
||||
"processing": "处理中",
|
||||
"banner": "祈愿池",
|
||||
"page": "页",
|
||||
"parsing": "解析中...",
|
||||
"save": "保存",
|
||||
"cancel": "取消",
|
||||
"cancelling": "取消中...",
|
||||
"importNewWishOnly": "只导入新增祈愿",
|
||||
"importNewWishUncheck": "只有当你想重新导入所有记录时, 不勾选此项",
|
||||
"import": "导入",
|
||||
"close": "关闭",
|
||||
"invalidLink": "链接错误, 请重新检查",
|
||||
"errorApi": "MiHoYo API 返回错误, 请稍后再试!",
|
||||
"timeout": "连接超时, 请等一段时间再尝试",
|
||||
"invalidData": "返回的数据错误, 请稍后再试",
|
||||
"success": "导入成功 😀!",
|
||||
"server": "选择你的服务器:",
|
||||
"wishTallyCheck": "将你的记录提交到全球祈愿统计数据中",
|
||||
"wishTally": "我们在统计全球的祈愿数据! 你可以提交你的记录参与进来. 所有祈愿数据会统一整合, 用来考察 paimon.moe 用户的平均情况.",
|
||||
"wishTallyCollected": [
|
||||
"会被收集的数据:",
|
||||
"和",
|
||||
"你的抽卡历史记录"
|
||||
],
|
||||
"faqs": {
|
||||
"title": "导入祈愿记录常见问题",
|
||||
"q1": "这是怎么做到的?",
|
||||
"a1": "原神的祈愿历史记录是一个网页, 所以你可以通过打开网页的网址来访问它. 在打开祈愿历史页面时, 将生成一个临时密钥, 我们的导入程序将自动使用 MiHoYo API 来获取抽卡记录.",
|
||||
"q2": "安全吗? 会封号吗?",
|
||||
"a2": "Paimon.moe 与原神程序本身调取抽卡记录的方式是一致的, 并且 Paimon.moe 没办法修改游戏内存, 这本身是安全的, 但只能说风险自负 (我的大号是一直用的). 你也可以手动上传你的数据 😀.",
|
||||
"q3": "会被盗号吗?",
|
||||
"a3": [
|
||||
"Paimon.moe 从不会保存你的账号秘钥等个人信息 (甚至你的UID和游戏名也不会), 所以并不会被盗号. 这个网站是开源的",
|
||||
"; 我不可能尝试盗号来毁自己名声."
|
||||
],
|
||||
"q4": "我查了一下网站请求之类的, 但为什么它用的是你的域名, 而不是MiHoYo API的?",
|
||||
"a4": [
|
||||
"Paimon.moe 并不能直接从MiHoYo API 获得东西, 因为",
|
||||
", 所以链接会被重定向到 CORS proxy 来实现. 你可以查看源代码",
|
||||
"在这里"
|
||||
],
|
||||
"q5": "网站会保存临时秘钥或祈愿记录吗?",
|
||||
"a5": [
|
||||
"Paimon.moe 不会存储秘钥, 只会通过 HTTPS 递交你的 URL 给 CORS proxy 来让 CORS 工作. Paimon.moe 会保存你的 4* 记录, 5* 记录, 以及 5* 祈愿信息如果你提交记录到全球祈愿统计中. (没有其他个人信息记录! 请查阅",
|
||||
"隐私政策",
|
||||
"了解更多). 你可以取消勾选提交记录, 来撤掉提交功能. 这样你的所有祈愿记录会保存在你的电脑上 (或你的谷歌网盘, 如果你设置了同步功能).",
|
||||
"如果你不想通过url传递任何信息, 你可以在本地PC使用便捷导入脚本(本地PC选项)"
|
||||
],
|
||||
"q6": "我按流程操作了, 但它提示我 API 错误?",
|
||||
"a6": "确保你复制了完整的链接 (移动设备需要长按并全选); 可能你漏掉了链接的一部分.",
|
||||
"q7": "它并没有读取到我的全部抽卡记录!?",
|
||||
"a7": "超过6个月的祈愿记录会在服务器中过期, 如果你以前没备份过, 很遗憾那就没了."
|
||||
},
|
||||
"guide": {
|
||||
"video": "视频教程",
|
||||
"pc": [
|
||||
"打开派蒙按钮 [ESC]",
|
||||
"点击反馈",
|
||||
"等待加载出一个浏览器页面",
|
||||
"复制并粘贴链接到下面的文本框",
|
||||
"链接粘贴到这里 https://webstatic..."
|
||||
],
|
||||
"android": [
|
||||
"打开祈愿界面 (游戏内)",
|
||||
"点击历史记录",
|
||||
"等待加载",
|
||||
"断网(断开wifi或流量)",
|
||||
"点击右上角刷新按钮",
|
||||
"此时页面应该提示错误, 并显示一些文字",
|
||||
"长按并全选, 复制所有文本 (不要仅复制某一部分)",
|
||||
"连网(接回wifi或流量)",
|
||||
"粘贴复制的内容到下面的文本框",
|
||||
"文本粘贴到这里... Webpage not available..."
|
||||
],
|
||||
"ios": [
|
||||
"打开派蒙菜单",
|
||||
"点击反馈",
|
||||
"等待反馈页面加载",
|
||||
"点击游戏内问题",
|
||||
"点击多人游戏模式",
|
||||
"系统回复的最下面有一个链接; 点击它",
|
||||
"一个网页会被打开. 复制链接并粘贴到这里",
|
||||
"链接粘贴到这里... https://genshin.mihoyo..."
|
||||
],
|
||||
"ps": [
|
||||
"只有当你拥有带网页活动的二维码的游戏邮箱, 你才能获得网页链接, 使用这个导入功能",
|
||||
"在你的 PlayStation 里打开原神",
|
||||
"打开你的邮箱二维码",
|
||||
"用手机扫描二维码得到链接",
|
||||
"复制链接并粘贴到这里",
|
||||
"链接粘贴到这里..."
|
||||
],
|
||||
"pclocal": [
|
||||
"如果你不想提供你的url,你可以使用这个选项在你的电脑上本地处理祈愿历史记录。此脚本将读取您电脑上的日志文件以获取祈愿url。",
|
||||
"打开开始菜单, 搜索powershell",
|
||||
"打开windows powershell, 然后复制粘贴脚本到powershell里",
|
||||
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
|
||||
"你可以查看这个脚本",
|
||||
"这里",
|
||||
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
|
||||
"粘贴后回车即可运行脚本, 然后跟着说明走即可",
|
||||
"那之后, 把脚本输出的结果粘贴到这里",
|
||||
"粘贴结果到这里...",
|
||||
"这个功能还在开发中, 请先到“帮助&设置”界面, 导出excel备份一下你原来的记录."
|
||||
]
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"title": "祈愿统计 帮助 & 设置",
|
||||
"exportTitle": "导出祈愿记录",
|
||||
"exportMessage": "你可以在这里将祈愿记录导出为Excel",
|
||||
"export": "导出到Excel",
|
||||
"exporting": "导出中...",
|
||||
"import": "导入",
|
||||
"exportFinish": "导出成功, 请等待浏览器下载文件!",
|
||||
"wishTallyTitle": "提交祈愿到全球统计",
|
||||
"wishTally": "我们在统计全球的祈愿数据! 你可以提交你的记录参与进来. 所有祈愿数据会统一整合, 用来考察 paimon.moe 用户的平均情况.",
|
||||
"wishTallyCollected": [
|
||||
"会被收集的内容:",
|
||||
"和",
|
||||
"你的祈愿记录"
|
||||
],
|
||||
"wishTallySubmit": "提交祈愿到全球统计",
|
||||
"wishTallyThankyou": "感谢你的参与!",
|
||||
"manualTitle": "手动输入设置",
|
||||
"enableManual": "启用手动输入",
|
||||
"notice": "并不建议同时使用自动导入与手动导入, 二者混用还有待测试!",
|
||||
"consider": "请优先考虑自动导入. 点击打开这份教程的按钮旁边的另一个按钮即可.",
|
||||
"howto": {
|
||||
"title": "如何使用手动导入",
|
||||
"subtitle": "抽卡1次后:",
|
||||
"pressWhenYouGet": "按 {button} 当你得到 {rarity}★",
|
||||
"p1": "会自动添加总抽数, 5★, 以及 4★ 保底",
|
||||
"p2": [
|
||||
"当",
|
||||
"保底到达 10, 会自动被重置为 0"
|
||||
],
|
||||
"p3": [
|
||||
"当",
|
||||
"保底到达 90, 会自动被重置为 0"
|
||||
],
|
||||
"p4": [
|
||||
"抽10连后, 按",
|
||||
"但请注意保底计数并不会精确到位, 因为并不知道是10连的哪一抽出货 (你可能是在第一发或十连最后一发出货). 为了保障计数准确, 你需要到列表中检查十连里的每一抽, 修改为对应的正确内容."
|
||||
],
|
||||
"p5": [
|
||||
"你也可以按",
|
||||
"按钮来手动修改数值!"
|
||||
],
|
||||
"p6": [
|
||||
"点击按钮上的箭头来查看你的具体抽卡细节. 会自动弹出提示你获得一个",
|
||||
"或",
|
||||
"你也可以手动编辑列表."
|
||||
]
|
||||
}
|
||||
},
|
||||
"types": {
|
||||
"beginners": "初行者祈愿",
|
||||
"standard": "常驻池",
|
||||
"character-event": "角色池",
|
||||
"weapon-event": "武器池"
|
||||
},
|
||||
"detail": {
|
||||
"weapon": "武器",
|
||||
"character": "角色",
|
||||
"time": "时间",
|
||||
"pity": "保底",
|
||||
"name": "名称",
|
||||
"type": "类型",
|
||||
"banner": "卡池",
|
||||
"roll": "#Roll",
|
||||
"totalThisBanner": "这个池子的总抽数",
|
||||
"worth": "价值",
|
||||
"loading": "读取中... (如果卡住, 到设置中检查服务器)",
|
||||
"guaranteed": "下一个 5★ 一定会是当期UP",
|
||||
"unknown_3_star": "未知三星"
|
||||
},
|
||||
"tally": {
|
||||
"title": "祈愿统计",
|
||||
"subtitle": "全球 paimon.moe 用户们提交的平均统计情况",
|
||||
"update": "更新于",
|
||||
"summoned": "被抽到",
|
||||
"wonFiftyFifty": "小保底没歪",
|
||||
"fromFiveStar": "在所有 5★",
|
||||
"fromFourStar": "在所有 4★",
|
||||
"fromFourStarFeatured": "在UP 4★",
|
||||
"show": "显示",
|
||||
"name": "名字",
|
||||
"total": "总计",
|
||||
"wishTotal": "祈愿总计",
|
||||
"worth": "价值",
|
||||
"weapon": "武器",
|
||||
"character": "角色",
|
||||
"error": "数据不可用 😞",
|
||||
"pity": "保底",
|
||||
"median": "5★ 中位数",
|
||||
"user": "总玩家数",
|
||||
"detail": "详情"
|
||||
}
|
||||
},
|
||||
"calculator": {
|
||||
"titleWeapon": "武器计算器",
|
||||
"titleCharacter": "角色计算器",
|
||||
"titleResin": "数值计算器",
|
||||
"goto": "跳转到 {where}",
|
||||
"howToUse": "如何使用",
|
||||
"guide": {
|
||||
"clickToMaximize": "点击图片来最大化",
|
||||
"howToWeapon": "如何使用武器升级计算器",
|
||||
"howToCharacter": "如何使用角色升级计算器"
|
||||
},
|
||||
"weapon": {
|
||||
"calculateAscension": "计算突破材料?",
|
||||
"selectRarity": "选择武器稀有度",
|
||||
"selectWeapon": "选择武器",
|
||||
"current": "当前武器等级, 经验, & 突破阶段",
|
||||
"inputCurrentLevel": "输入当前武器等级...",
|
||||
"inputCurrentExp": "输入当前武器经验...",
|
||||
"intended": "武器目标等级 & 突破情况",
|
||||
"inputIntendedLevel": "输入目标武器等级...",
|
||||
"resource": "需要的资源",
|
||||
"calculate": "计算",
|
||||
"unknownInformation": "有一些未知信息",
|
||||
"ascensionLevel": "突破阶段",
|
||||
"mora": "摩拉 (误差 ±40)",
|
||||
"expWasted": "溢出经验",
|
||||
"addToTodo": "添加到Todo",
|
||||
"addedToTodo": "已添加到Todo"
|
||||
},
|
||||
"character": {
|
||||
"calculateAscension": "计算突破材料?",
|
||||
"selectCharacter": "选择角色",
|
||||
"current": "当前角色等级, 经验, & 突破阶段",
|
||||
"inputCurrentLevel": "输入当前角色等级...",
|
||||
"inputCurrentExp": "输入当前角色经验...",
|
||||
"intended": "目标角色等级 & 突破情况",
|
||||
"inputIntendedLevel": "输入目标角色等级...",
|
||||
"resource": "需要的资源",
|
||||
"calculateTalent": "计算天赋材料?",
|
||||
"inputTalentLevel": "输入三个技能当前等级",
|
||||
"inputTalentNotice": "如果被命座+3, 请减掉3",
|
||||
"inputTalent": [
|
||||
"普攻等级",
|
||||
"元素战技等级",
|
||||
"元素爆发等级"
|
||||
],
|
||||
"talentToLevel": "目标等级",
|
||||
"calculate": "计算",
|
||||
"unknownInformation": "有一些未知信息",
|
||||
"ascensionLevel": "突破阶段",
|
||||
"mora": "摩拉 (误差 ±40)",
|
||||
"expWasted": "溢出经验",
|
||||
"addToTodo": "添加到Todo",
|
||||
"addedToTodo": "已添加到Todo"
|
||||
},
|
||||
"expTable": {
|
||||
"level": "等级",
|
||||
"items": "物品",
|
||||
"wasted": "溢出经验",
|
||||
"mora": "摩拉消耗"
|
||||
},
|
||||
"resinTable": {
|
||||
"quantity": "数量",
|
||||
"time": "需等待时间"
|
||||
},
|
||||
"resin": {
|
||||
"currentResin": "当前树脂",
|
||||
"desiredResin": "需求树脂",
|
||||
"or": "或",
|
||||
"inputCurrentResin": "输入当前树脂...",
|
||||
"inputDesireResin": "输入你恢复到多少树脂...",
|
||||
"timeFormat": "en",
|
||||
"calculate": "计算",
|
||||
"currentTime": "当前时间",
|
||||
"fullTime": "将在多久回满",
|
||||
"hours": "时",
|
||||
"minutes": "分",
|
||||
"seconds": "秒"
|
||||
}
|
||||
},
|
||||
"items": {
|
||||
"title": "物品列表",
|
||||
"subtitle": "点击图标添加到Todo",
|
||||
"searchCharacter": "搜索角色",
|
||||
"searchWeapon": "搜索武器",
|
||||
"day": "日子",
|
||||
"material": "材料",
|
||||
"characterWeapons": "角色 & 武器",
|
||||
"add": {
|
||||
"rarity": "选择稀有度",
|
||||
"amount": "数量",
|
||||
"inputAmount": "输入数量...",
|
||||
"cancel": "取消",
|
||||
"add": "添加到Todo"
|
||||
}
|
||||
},
|
||||
"days": {
|
||||
"Sunday": "周日",
|
||||
"Monday": "周一",
|
||||
"Tuesday": "周二",
|
||||
"Wednesday": "周三",
|
||||
"Thursday": "周四",
|
||||
"Friday": "周五",
|
||||
"Saturday": "周六"
|
||||
},
|
||||
"todo": {
|
||||
"title": "Todo 列表",
|
||||
"summary": "总结",
|
||||
"empty": [
|
||||
"没啥要做的 😀",
|
||||
"从物品页面或计算器加点东西来!"
|
||||
],
|
||||
"farmableToday": "今日可刷取",
|
||||
"resin": "树脂需求",
|
||||
"based": "基于冒险等级:{ar} 和 世界等级:{wl}",
|
||||
"change": "(可在设置中更改)",
|
||||
"approximation": "掉率估算数值来自于",
|
||||
"delete": {
|
||||
"title": "删除这项Todo?",
|
||||
"cancel": "取消",
|
||||
"delete": "删除"
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"title": "时间线",
|
||||
"localTime": "显示为本地时间",
|
||||
"starting": "开始于",
|
||||
"ending": "结束于",
|
||||
"live": "正在进行!",
|
||||
"finished": "已结束"
|
||||
},
|
||||
"settings": {
|
||||
"version": "数据版本:",
|
||||
"multiple": "有多个账号? 在这里切换来区分不同的祈愿历史记录和Todo列表",
|
||||
"selectAccount": "选择你的账号",
|
||||
"reset": "重置",
|
||||
"delete": "删除",
|
||||
"add": "添加",
|
||||
"server": "选择服务器:",
|
||||
"drive": [
|
||||
"Paimon.moe 可以利用你的谷歌网盘应用数据文件夹和同步功能, 来保存你的祈愿记录和Todo列表.",
|
||||
"Paimon.moe 只能修改读取由本网站生成的文件."
|
||||
],
|
||||
"driveError": "谷歌网盘API无法加载",
|
||||
"driveSignIn": "登录谷歌网盘",
|
||||
"driveSignOut": "登出谷歌网盘",
|
||||
"synced": "已同步",
|
||||
"waiting": "等待中...",
|
||||
"syncing": "同步中...",
|
||||
"lastSync": "上次同步:",
|
||||
"feedback": "如果你发现一些BUG, 数据错误, 或者其他反馈, 请留言到",
|
||||
"or": "或",
|
||||
"thanks": "谢谢😁!",
|
||||
"modal": {
|
||||
"notice": "所有Todo和祈愿记录江北删除",
|
||||
"backup": "你可以通过导出Excel备份你的抽卡记录!",
|
||||
"cancel": "取消",
|
||||
"delete": "删除",
|
||||
"reset": "重置"
|
||||
}
|
||||
},
|
||||
"privacypolicy": {
|
||||
"title": "隐私政策",
|
||||
"subtitle": "paimon.moe 会收集什么信息以及如何使用",
|
||||
"collect": [
|
||||
{
|
||||
"title": "paimon.moe 中被点击的链接, 引用页面, 浏览器, 操作系统, 设备类型, 来源国家",
|
||||
"content": [
|
||||
"Paimon.moe 使用",
|
||||
"plausible.io",
|
||||
"(保护隐私分析方法) 查看有多少人使用网站的什么功能, 所以我们可以优先考虑要实现或改进的功能."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "网站的报错与异常信息",
|
||||
"content": [
|
||||
"Paimon.moe 会发送报错与异常情况到",
|
||||
"sentry.io",
|
||||
"来追踪问题来源并修复."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "抽卡保底",
|
||||
"content": [
|
||||
"Paimon.moe 会保存四星、五星的保底进度, 以及5星祈愿详情 (抽卡时间, 出货内容, 保底计数) 如果你点击 '提交祈愿到全球统计' 在自动导入功能中, 或在帮助与设置界面中手动提交, Paimon.moe 会自动统计并计算到每个池子的平均数据里, 你可以在这里查看",
|
||||
"祈愿总计"
|
||||
]
|
||||
}
|
||||
],
|
||||
"subtitleNotCollect": "paimon.moe 不会收集",
|
||||
"notCollect": [
|
||||
"paimon.moe 不会保存任何密码、UID、邮箱、临时秘钥或反馈文件. 如果你感兴趣, 这个网站是开源的, 你可以在这里查看源代码",
|
||||
"paimon-moe-api Github",
|
||||
"以及",
|
||||
"paimon-moe Github"
|
||||
]
|
||||
},
|
||||
"sync": {
|
||||
"message": "你的本地记录与谷歌网盘的记录冲突了!",
|
||||
"googleDriveData": "谷歌网盘数据",
|
||||
"localData": "浏览器本地数据",
|
||||
"older": "旧",
|
||||
"newer": "新",
|
||||
"useGoogleDriveData": "使用谷歌网盘数据",
|
||||
"useLocalData": "使用浏览器本地数据",
|
||||
"download": "两份都下载",
|
||||
"lastModified": "上次修改时间",
|
||||
"or": "或"
|
||||
},
|
||||
"footer": {
|
||||
"affliate": "Paimon.moe 与米哈游无关.",
|
||||
"copyright": "原神的游戏内容和各种素材与商标的版权都属于米哈游.",
|
||||
"discord": "加入我们的Discord",
|
||||
"community": "社群链接",
|
||||
"official": "官方链接"
|
||||
},
|
||||
"donate": {
|
||||
"message": [
|
||||
"谢谢!愿你能在本网站获得帮助.",
|
||||
"我出于兴趣在业余时间制作了这个网站, 随着更新加入了越来越多的功能与数据. 因为我喜欢探索游戏, 并简化各种内容",
|
||||
"如果你想要赞助, 你的捐赠会一定会有利于改善这个网站并激励我加入更多的内容倒 Paimon.moe! 非常感谢, 希望你能喜欢, 愿你玩得开心!",
|
||||
"如果你喜欢编程开发, 你也可以在这里为项目提供帮助"
|
||||
],
|
||||
"kofi": "在这里赞助 Ko-fi",
|
||||
"trakteer": "在这里赞助 Trakteer",
|
||||
"crypto": "利用虚拟货币赞助"
|
||||
},
|
||||
"reminder": {
|
||||
"notSupported": "你的浏览器不支持发送提醒, 请换另一个浏览器!",
|
||||
"blocked": "通知被禁用了, 计时提醒功能无法工作! 请在浏览器上启用它.",
|
||||
"desktop": "如果浏览器未运行,将无法接收通知!",
|
||||
"early": "由于我们发送通知的方式,通知可能会提前到达 (大约1-10分钟)",
|
||||
"allowNotification": "请允许出现通知提示!",
|
||||
"transformer": "质量参变仪使用提醒",
|
||||
"last": "输入上次使用质量参变仪的时间",
|
||||
"lastHoyolab": "输入你想被提醒米游社签到的时间",
|
||||
"every": "每天的",
|
||||
"countdown": "输入质量参变仪的倒计时 (如果不记得确切时间,则需要近似值)",
|
||||
"useLast": "使用上次用它的时间",
|
||||
"useCountdown": "使用倒计时代替",
|
||||
"set": "设置提醒器",
|
||||
"checking": "检查已保存的提醒器...",
|
||||
"errorSelect": "请选择日期和时间!",
|
||||
"errorSaving": "保存提醒器时出错了 🙁",
|
||||
"current": "当前提醒器",
|
||||
"hoyolab": "米游社每日签到提醒器",
|
||||
"comingsoon": "正在加入!"
|
||||
},
|
||||
"achievement": {
|
||||
"title": "成就",
|
||||
"of": "关于"
|
||||
},
|
||||
"furnishing": {
|
||||
"title": "家具",
|
||||
"name": "名字",
|
||||
"energy": "能量",
|
||||
"load": "载入",
|
||||
"ratio": "比例",
|
||||
"using": "数量",
|
||||
"interior": "室内",
|
||||
"exterior": "室外",
|
||||
"info": [
|
||||
"这表明该区域可以承受多大的负荷. 每个家具都有一个隐藏的负荷值, 可以在下面查看.",
|
||||
"(最大值尚未确定!)"
|
||||
],
|
||||
"hall": "大厅",
|
||||
"room": "屋子 {number}",
|
||||
"exteriorNum": "区域 {number}",
|
||||
"corridor": "走廊"
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
export async function preload() {
|
||||
return { data };
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
|
@ -208,6 +209,7 @@
|
|||
changeLocale(val);
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
|
@ -231,7 +233,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="lg:pl-4 text-white">
|
||||
<Checkbox checked={sort} on:change={() => changeSort(!sort)}>Show not achieved first</Checkbox>
|
||||
<Checkbox checked={sort} on:change={() => changeSort(!sort)}>{$t('achievement.sort')}</Checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col lg:flex-row space-y-3 lg:space-y-0 lg:space-x-3">
|
||||
|
@ -263,10 +265,7 @@
|
|||
{#each el as it, i}
|
||||
<div
|
||||
class="flex items-center {i !== 0 ? 'border-t border-gray-700 pt-1' : ''}
|
||||
{i > 0 &&
|
||||
el[i - 1].checked !== true
|
||||
? 'opacity-25'
|
||||
: ''}"
|
||||
{i > 0 && el[i - 1].checked !== true ? 'opacity-25' : ''}"
|
||||
>
|
||||
<div class="flex-1 pr-1">
|
||||
<p class="font-semibold">{it.name}</p>
|
||||
|
@ -332,4 +331,5 @@
|
|||
padding-top: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -23,8 +23,9 @@
|
|||
$: attachedNext = next !== null && next.start.diff(event.end, 'hour') < 3;
|
||||
$: attachedPrev = prev !== null && event.start.diff(prev.end, 'hour') < 3;
|
||||
$: prevEnded = prev !== null && now.isAfter(prev.end);
|
||||
$: shouldShowHourStart = diffStart <= 86400000 || event.duration > 8 || !prevNearby;
|
||||
$: shouldShowHourEnd = diffEnd <= 86400000 || event.duration > 8 || !prevNearby;
|
||||
$: shouldShowHourStart = diffStart <= 86400000 || event.duration > 6.5 || !prevNearby;
|
||||
$: shouldShowHourEnd = diffEnd <= 86400000 || event.duration > 6.5 || !prevNearby;
|
||||
|
||||
</script>
|
||||
|
||||
<div
|
||||
|
@ -32,23 +33,18 @@
|
|||
class="flex items-center z-10 text-white cursor-pointer absolute {prevDiff < 1 ? '' : 'rounded-l-xl'} {nextDiff < 1
|
||||
? 'border-r-4 border-white'
|
||||
: 'rounded-r-xl'}"
|
||||
style="width: {dayWidth * event.duration}px; left: {dayWidth *
|
||||
event.offset}px; background-color: {event.color};
|
||||
top: {marginTop +
|
||||
i * (eventHeight + eventMargin)}px; height: {eventHeight}px; padding-right: 10px;
|
||||
{prevNearby &&
|
||||
!started &&
|
||||
(attachedPrev || prevEnded) &&
|
||||
prevNearby
|
||||
style="width: {dayWidth * event.duration}px; left: {dayWidth * event.offset}px; background-color: {event.color};
|
||||
top: {marginTop + i * (eventHeight + eventMargin)}px; height: {eventHeight}px; padding-right: 10px;
|
||||
{prevNearby && !started && (attachedPrev || prevEnded) && prevNearby
|
||||
? 'padding-left: 35px;'
|
||||
: 'padding-left: 10px;'}
|
||||
--image: url(/images/events/{event.image}); --pos: {event.pos}; --color: {event.color};
|
||||
--zoom: {event.zoom
|
||||
? event.zoom
|
||||
: '200%'};"
|
||||
--zoom: {event.zoom ? event.zoom : '200%'};"
|
||||
>
|
||||
<div class="event-item {nextDiff < 1 ? '' : 'rounded-xl'}" />
|
||||
<span class="event-name text sticky left-0 font-display text-base md:text-lg text-black font-bold whitespace-no-wrap overflow-hidden">
|
||||
<span
|
||||
class="event-name text sticky left-0 font-display text-base md:text-lg text-black font-bold whitespace-no-wrap overflow-hidden"
|
||||
>
|
||||
{event.name}
|
||||
</span>
|
||||
<!-- Ending timer-->
|
||||
|
@ -106,4 +102,5 @@
|
|||
text-shadow: var(--color) -1px -1px 4px, var(--color) 1px -1px 4px, var(--color) -1px 1px 4px,
|
||||
var(--color) 1px 1px 4px, var(--color) 0 0 10px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
434
src/routes/wish/_excelImport.svelte
Normal file
434
src/routes/wish/_excelImport.svelte
Normal file
|
@ -0,0 +1,434 @@
|
|||
<script>
|
||||
import { t } from 'svelte-i18n';
|
||||
import { Workbook } from 'exceljs';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
import Button from '../../components/Button.svelte';
|
||||
import { pushToast } from '../../stores/toast';
|
||||
import { weaponList } from '../../data/weaponList';
|
||||
import { characters } from '../../data/characters';
|
||||
import { getAccountPrefix } from '../../stores/account';
|
||||
import { readSave, updateSave } from '../../stores/saveManager';
|
||||
|
||||
export let closeModal;
|
||||
|
||||
const bannerCategories = {
|
||||
'character-event': 'Character Event',
|
||||
'weapon-event': 'Weapon Event',
|
||||
standard: 'Standard',
|
||||
beginners: "Beginners' Wish",
|
||||
};
|
||||
|
||||
let selectedType = 'default';
|
||||
let fileInput;
|
||||
let step = 0;
|
||||
let loading = false;
|
||||
|
||||
let added = {};
|
||||
|
||||
function changeType(type) {
|
||||
selectedType = type;
|
||||
}
|
||||
|
||||
function selectFile() {
|
||||
fileInput.click();
|
||||
}
|
||||
|
||||
async function readLocalData(id) {
|
||||
const prefix = getAccountPrefix();
|
||||
const path = `wish-counter-${id}`;
|
||||
const data = await readSave(`${prefix}${path}`);
|
||||
let pulls = [];
|
||||
|
||||
let newest = dayjs().year(2000);
|
||||
let oldest = dayjs().year(2200);
|
||||
|
||||
if (data !== null) {
|
||||
newest = dayjs(data.pulls[data.pulls.length - 1].time);
|
||||
oldest = dayjs(data.pulls[0].time);
|
||||
pulls = data.pulls;
|
||||
}
|
||||
|
||||
return {
|
||||
path: `${prefix}${path}`,
|
||||
data: pulls,
|
||||
newest,
|
||||
oldest,
|
||||
};
|
||||
}
|
||||
|
||||
async function processWishes(path, combined) {
|
||||
let rare = 0;
|
||||
let legendary = 0;
|
||||
for (let i = 0; i < combined.length; i++) {
|
||||
rare++;
|
||||
legendary++;
|
||||
|
||||
let rarity;
|
||||
if (combined[i].type === 'character') {
|
||||
rarity = characters[combined[i].id].rarity;
|
||||
} else if (combined[i].type === 'weapon') {
|
||||
rarity = weaponList[combined[i].id].rarity;
|
||||
}
|
||||
|
||||
if (rarity === 5) {
|
||||
combined[i].pity = legendary;
|
||||
legendary = 0;
|
||||
// rare = 0;
|
||||
} else if (rarity === 4) {
|
||||
combined[i].pity = rare;
|
||||
rare = 0;
|
||||
} else {
|
||||
combined[i].pity = 1;
|
||||
}
|
||||
}
|
||||
|
||||
const data = {
|
||||
total: combined.length,
|
||||
legendary,
|
||||
rare,
|
||||
pulls: combined,
|
||||
};
|
||||
|
||||
await updateSave(path, data);
|
||||
}
|
||||
|
||||
async function save() {
|
||||
loading = true;
|
||||
|
||||
for (const id of Object.keys(bannerCategories)) {
|
||||
const { path, data } = await readLocalData(id);
|
||||
const { append, prepend } = added[id];
|
||||
|
||||
const beginning = prepend.map((e) => ({
|
||||
id: e[2],
|
||||
time: e[1],
|
||||
type: e[0],
|
||||
pity: 0,
|
||||
}));
|
||||
const end = append.map((e) => ({
|
||||
id: e[2],
|
||||
time: e[1],
|
||||
type: e[0],
|
||||
pity: 0,
|
||||
}));
|
||||
|
||||
const combined = [...beginning, ...data, ...end];
|
||||
|
||||
await processWishes(path, combined);
|
||||
}
|
||||
|
||||
const prefix = getAccountPrefix();
|
||||
await updateSave(`${prefix}collectables-updated`, true);
|
||||
|
||||
pushToast($t('wish.excel.success'));
|
||||
loading = false;
|
||||
closeModal();
|
||||
}
|
||||
|
||||
async function parseData(id, imported) {
|
||||
const { newest, oldest } = await readLocalData(id);
|
||||
const append = [];
|
||||
const prepend = [];
|
||||
|
||||
console.log(newest, oldest);
|
||||
|
||||
// new wishes
|
||||
imported.reverse();
|
||||
let index = 0;
|
||||
for (const row of imported) {
|
||||
if (dayjs(row[1]).isAfter(newest)) {
|
||||
append.push(row);
|
||||
index++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
imported = imported.slice(index, imported.length);
|
||||
|
||||
// old wishes
|
||||
imported.reverse();
|
||||
for (const row of imported) {
|
||||
if (dayjs(row[1]).isBefore(oldest)) {
|
||||
prepend.push(row);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
append.reverse();
|
||||
|
||||
console.log(prepend);
|
||||
console.log(append);
|
||||
|
||||
added[id] = {
|
||||
append,
|
||||
prepend,
|
||||
};
|
||||
}
|
||||
|
||||
async function readPaimonExcel(workbook) {
|
||||
const informationSheet = workbook.getWorksheet('Information');
|
||||
if (!informationSheet) {
|
||||
pushToast($t('wish.excel.errorExcelPaimon'), 'error');
|
||||
loading = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const row = informationSheet.getCell('A1').value;
|
||||
|
||||
if (row !== 'Paimon.moe Wish History Export') {
|
||||
pushToast($t('wish.excel.errorExcelPaimon'), 'error');
|
||||
loading = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const bannerCategories = {
|
||||
'character-event': 'Character Event',
|
||||
'weapon-event': 'Weapon Event',
|
||||
standard: 'Standard',
|
||||
beginners: "Beginners' Wish",
|
||||
};
|
||||
|
||||
const weapons = Object.values(weaponList);
|
||||
const chars = Object.values(characters);
|
||||
|
||||
for (const [id, name] of Object.entries(bannerCategories)) {
|
||||
const sheet = workbook.getWorksheet(name);
|
||||
const wishes = [];
|
||||
sheet.eachRow((row, index) => {
|
||||
if (index === 1) return;
|
||||
const type = row.getCell(1).text.toLowerCase();
|
||||
const time = row.getCell(3).text;
|
||||
const fullName = row.getCell(2).text;
|
||||
let name = '';
|
||||
if (type === 'weapon') {
|
||||
name = weapons.find((e) => e.name === fullName).id;
|
||||
} else if (type === 'character') {
|
||||
name = chars.find((e) => e.name === fullName).id;
|
||||
}
|
||||
|
||||
if (name === '') {
|
||||
pushToast($t('wish.excel.errorUnknownItem'), 'error');
|
||||
loading = false;
|
||||
throw 'unknown reward name';
|
||||
}
|
||||
|
||||
wishes.push([type, time, name]);
|
||||
});
|
||||
|
||||
console.log('from excel', name, wishes.length);
|
||||
await parseData(id, wishes);
|
||||
}
|
||||
|
||||
step = 1;
|
||||
loading = false;
|
||||
}
|
||||
|
||||
async function readGachaExportExcel(workbook) {
|
||||
const bannerCategories = {
|
||||
'character-event': 'Character Event Wish',
|
||||
'weapon-event': 'Weapon Event Wish',
|
||||
standard: 'Permanent Wish',
|
||||
beginners: "Novice Wishes",
|
||||
};
|
||||
|
||||
const weapons = Object.values(weaponList);
|
||||
const chars = Object.values(characters);
|
||||
|
||||
for (const [id, name] of Object.entries(bannerCategories)) {
|
||||
const sheet = workbook.getWorksheet(name);
|
||||
const wishes = [];
|
||||
sheet.eachRow((row, index) => {
|
||||
if (index === 1) return;
|
||||
const type = row.getCell(3).text.toLowerCase();
|
||||
const time = row.getCell(1).text;
|
||||
const fullName = row.getCell(2).text;
|
||||
let name = '';
|
||||
if (type === 'weapon') {
|
||||
name = weapons.find((e) => e.name === fullName).id;
|
||||
} else if (type === 'character') {
|
||||
name = chars.find((e) => e.name === fullName).id;
|
||||
}
|
||||
|
||||
if (name === '') {
|
||||
pushToast($t('wish.excel.errorUnknownItem'), 'error');
|
||||
loading = false;
|
||||
throw 'unknown reward name';
|
||||
}
|
||||
|
||||
wishes.push([type, time, name]);
|
||||
});
|
||||
|
||||
console.log('from excel', name, wishes.length);
|
||||
await parseData(id, wishes);
|
||||
}
|
||||
|
||||
step = 1;
|
||||
loading = false;
|
||||
}
|
||||
|
||||
async function readExcel(file) {
|
||||
loading = true;
|
||||
|
||||
const workbook = new Workbook();
|
||||
|
||||
try {
|
||||
const buffer = await fileToBuffer(file);
|
||||
await workbook.xlsx.load(buffer);
|
||||
} catch (err) {
|
||||
pushToast($t('wish.excel.errorReadExcel'), 'error');
|
||||
loading = false;
|
||||
}
|
||||
|
||||
try {
|
||||
if (selectedType === 'default') {
|
||||
readPaimonExcel(workbook);
|
||||
} else {
|
||||
readGachaExportExcel(workbook);
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
pushToast($t('wish.excel.errorReadExcel'), 'error');
|
||||
loading = false;
|
||||
}
|
||||
}
|
||||
|
||||
function checkFile(file) {
|
||||
console.log(file.type);
|
||||
if (file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
|
||||
readExcel(file);
|
||||
} else {
|
||||
pushToast($t('wish.excel.errorInvalidFile'), 'error');
|
||||
}
|
||||
}
|
||||
|
||||
function onFileChange(event) {
|
||||
const target = event.target;
|
||||
const { files } = target;
|
||||
|
||||
if (files === null || files.length === 0) return;
|
||||
const file = files[0];
|
||||
|
||||
checkFile(file);
|
||||
fileInput.value = null;
|
||||
}
|
||||
|
||||
function dropHandler(ev) {
|
||||
ev.preventDefault();
|
||||
|
||||
if (ev.dataTransfer.items) {
|
||||
if (ev.dataTransfer.items[0].kind === 'file') {
|
||||
const file = ev.dataTransfer.items[0].getAsFile();
|
||||
checkFile(file);
|
||||
}
|
||||
} else {
|
||||
checkFile(ev.dataTransfer.files[0]);
|
||||
}
|
||||
}
|
||||
|
||||
function dragOverHandler(ev) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
const fileToBuffer = (file) =>
|
||||
new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = (event) => {
|
||||
if (event.target === null) {
|
||||
reject(new Error('Failed to read file'));
|
||||
} else {
|
||||
const buffer = event.target.result;
|
||||
resolve(buffer);
|
||||
}
|
||||
};
|
||||
reader.readAsArrayBuffer(file);
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<h1 class="font-display text-white text-xl mb-2">{$t('wish.excel.title')}</h1>
|
||||
{#if step === 0}
|
||||
<div class="mb-4 bg-background rounded-xl p-4">
|
||||
<ol class="list-decimal ml-4">
|
||||
<li class="text-red-300">{$t('wish.excel.notice.0')}</li>
|
||||
<li class="text-white">{$t('wish.excel.notice.1')}</li>
|
||||
<li class="text-white">{$t('wish.excel.notice.2')}</li>
|
||||
<li class="text-white">{$t('wish.excel.notice.3')}</li>
|
||||
</ol>
|
||||
</div>
|
||||
<p class="text-gray-200 mb-2">{$t('wish.excel.subtitle')}</p>
|
||||
<div class="flex flex-row">
|
||||
<button on:click={() => changeType('default')} class={`pill ${selectedType === 'default' ? 'active' : ''}`}>
|
||||
{$t('wish.excel.default')}
|
||||
</button>
|
||||
<button on:click={() => changeType('takagg')} class={`pill ${selectedType === 'takagg' ? 'active' : ''}`}>
|
||||
{$t('wish.excel.takagg')}
|
||||
</button>
|
||||
</div>
|
||||
<input on:change={onFileChange} type="file" style="display: none;" bind:this={fileInput} />
|
||||
<!-- <Button disabled={loading} on:click={selectFile}>
|
||||
{loading ? $t('wish.excel.processing') : $t(`wish.excel.selectFile.${selectedType}`)}
|
||||
</Button> -->
|
||||
<div
|
||||
on:click={selectFile}
|
||||
on:drop={dropHandler}
|
||||
on:dragover={dragOverHandler}
|
||||
class="w-full h-32 rounded-xl border-dashed border-2 border-gray-400 flex items-center justify-center cursor-pointer p-8"
|
||||
>
|
||||
<p class="text-white">{loading ? $t('wish.excel.processing') : $t(`wish.excel.selectFile.${selectedType}`)}</p>
|
||||
</div>
|
||||
{/if}
|
||||
{#if step === 1}
|
||||
<table>
|
||||
<tr>
|
||||
<td class="px-2 text-white border-r border-gray-700">{$t('wish.excel.addedOn')}</td>
|
||||
<td class="px-2 text-white border-r border-gray-700 text-center">{$t('wish.excel.beginning')}</td>
|
||||
<td class="px-2 text-white border-r border-gray-700 text-center">{$t('wish.excel.end')}</td>
|
||||
<td class="px-2 text-white border-gray-700 text-center">{$t('wish.excel.total')}</td>
|
||||
</tr>
|
||||
{#each Object.entries(added) as [id, data]}
|
||||
<tr>
|
||||
<td class="px-2 text-white border-r border-t border-gray-700">{bannerCategories[id]}</td>
|
||||
<td class="px-2 text-white border-r border-t border-gray-700 text-center">{data.prepend.length}</td>
|
||||
<td class="px-2 text-white border-r border-t border-gray-700 text-center">{data.append.length}</td>
|
||||
<td class="px-2 text-white border-t border-gray-700 text-center">
|
||||
{data.prepend.length + data.append.length}
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</table>
|
||||
<p class="text-white py-2">{$t('wish.excel.saveNotice')}</p>
|
||||
<Button disabled={loading} on:click={save}>{$t('wish.excel.save')}</Button>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.pill {
|
||||
@apply rounded-2xl;
|
||||
@apply border-2;
|
||||
@apply border-white;
|
||||
@apply border-opacity-25;
|
||||
@apply text-white;
|
||||
@apply px-4;
|
||||
@apply py-1;
|
||||
@apply mr-2;
|
||||
@apply mb-2;
|
||||
@apply outline-none;
|
||||
@apply transition;
|
||||
@apply duration-100;
|
||||
|
||||
&:hover {
|
||||
@apply border-primary;
|
||||
}
|
||||
|
||||
&.active {
|
||||
@apply bg-primary;
|
||||
@apply border-primary;
|
||||
@apply text-background;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
|
@ -1,61 +1,12 @@
|
|||
<script>
|
||||
import { t } from 'svelte-i18n';
|
||||
|
||||
import { mdiCheckCircleOutline, mdiLoading, mdiPencil, mdiStar } from '@mdi/js';
|
||||
import Icon from './Icon.svelte';
|
||||
import Button from './Button.svelte';
|
||||
import Checkbox from '../components/Checkbox.svelte';
|
||||
|
||||
import { exportToExcel } from '../functions/export';
|
||||
import { submitWishTally } from '../functions/wishTally';
|
||||
import { pushToast } from '../stores/toast';
|
||||
|
||||
export let setManualInput;
|
||||
export let settings;
|
||||
|
||||
let loadingExport = false;
|
||||
let wishTallySubmitted = false;
|
||||
|
||||
let enableManual = settings.manualInput;
|
||||
|
||||
function toggleManual() {
|
||||
setManualInput(enableManual);
|
||||
}
|
||||
|
||||
async function exportFile() {
|
||||
loadingExport = true;
|
||||
await exportToExcel();
|
||||
loadingExport = false;
|
||||
pushToast($t('wish.help.exportFinish'));
|
||||
}
|
||||
|
||||
$: enableManual, toggleManual();
|
||||
import { mdiPencil, mdiStar } from '@mdi/js';
|
||||
import Icon from '../../components/Icon.svelte';
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<!-- <h1 class="font-display text-white text-xl mb-4">{$t('wish.help.title')}</h1> -->
|
||||
<h1 class="font-display text-white text-xl mb-2">{$t('wish.help.exportTitle')}</h1>
|
||||
<div class="text-white p-2 bg-background rounded-xl">
|
||||
<p class="mb-2">{$t('wish.help.exportMessage')}</p>
|
||||
<Button className="mr-2" disabled={loadingExport} on:click={exportFile}>
|
||||
{#if loadingExport}
|
||||
<Icon path={mdiLoading} spin size={0.8} className="mr-2" />
|
||||
{/if}
|
||||
{$t(loadingExport ? 'wish.help.exporting' : 'wish.help.export')}
|
||||
</Button>
|
||||
<!-- <Button disabled={loadingExport}>{$t('wish.help.import')}</Button> -->
|
||||
</div>
|
||||
<h1 class="font-display text-white text-xl mt-8 mb-2">{$t('wish.help.manualTitle')}</h1>
|
||||
<div class="text-white p-2 bg-background rounded-xl">
|
||||
<div class="py-2 pl-4">
|
||||
<Checkbox disabled={false} bind:checked={enableManual}
|
||||
><span class="select-none cursor-pointer">{$t('wish.help.enableManual')}</span></Checkbox
|
||||
>
|
||||
</div>
|
||||
<p class="text-red-300">{$t('wish.help.notice')}</p>
|
||||
<p>{$t('wish.help.consider')}</p>
|
||||
</div>
|
||||
<h1 class="font-display text-white text-xl mt-8 mb-2">{$t('wish.help.howto.title')}</h1>
|
||||
<h1 class="font-display text-white text-xl mb-2">{$t('wish.help.howto.title')}</h1>
|
||||
<div class="text-white p-2 bg-background rounded-xl">
|
||||
<p class="mb-2">{$t('wish.help.howto.subtitle')}</p>
|
||||
<p class="mb-2">
|
74
src/routes/wish/_settingModal.svelte
Normal file
74
src/routes/wish/_settingModal.svelte
Normal file
|
@ -0,0 +1,74 @@
|
|||
<script>
|
||||
import { t } from 'svelte-i18n';
|
||||
|
||||
import { mdiLoading } from '@mdi/js';
|
||||
import Icon from '../../components/Icon.svelte';
|
||||
import Button from '../../components/Button.svelte';
|
||||
import Checkbox from '../../components/Checkbox.svelte';
|
||||
|
||||
import { exportToExcel } from '../../functions/export';
|
||||
import { pushToast } from '../../stores/toast';
|
||||
import ExcelImportModal from './_excelImport.svelte';
|
||||
import { getContext } from 'svelte';
|
||||
|
||||
const { open: openModal, close: closeModal } = getContext('simple-modal');
|
||||
|
||||
export let setManualInput;
|
||||
export let settings;
|
||||
export let closeImportModal;
|
||||
|
||||
let loadingExport = false;
|
||||
|
||||
let enableManual = settings.manualInput;
|
||||
|
||||
function toggleManual() {
|
||||
setManualInput(enableManual);
|
||||
}
|
||||
|
||||
async function exportFile() {
|
||||
loadingExport = true;
|
||||
await exportToExcel();
|
||||
loadingExport = false;
|
||||
pushToast($t('wish.help.exportFinish'));
|
||||
}
|
||||
|
||||
function openImporter() {
|
||||
openModal(
|
||||
ExcelImportModal,
|
||||
{
|
||||
closeModal: closeImportModal
|
||||
},
|
||||
{
|
||||
closeButton: false,
|
||||
styleWindow: { background: '#25294A', width: '800px' },
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
$: enableManual, toggleManual();
|
||||
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<h1 class="font-display text-white text-xl mb-2">{$t('wish.help.exportTitle')}</h1>
|
||||
<div class="text-white p-2 bg-background rounded-xl">
|
||||
<p class="mb-2">{$t('wish.help.exportMessage')}</p>
|
||||
<Button className="mr-2" disabled={loadingExport} on:click={exportFile}>
|
||||
{#if loadingExport}
|
||||
<Icon path={mdiLoading} spin size={0.8} className="mr-2" />
|
||||
{/if}
|
||||
{$t(loadingExport ? 'wish.help.exporting' : 'wish.help.export')}
|
||||
</Button>
|
||||
<Button disabled={loadingExport} on:click={openImporter}>{$t('wish.help.import')}</Button>
|
||||
</div>
|
||||
<h1 class="font-display text-white text-xl mt-8 mb-2">{$t('wish.help.manualTitle')}</h1>
|
||||
<div class="text-white p-2 bg-background rounded-xl">
|
||||
<div class="py-2 pl-4">
|
||||
<Checkbox disabled={false} bind:checked={enableManual}
|
||||
><span class="select-none cursor-pointer">{$t('wish.help.enableManual')}</span></Checkbox
|
||||
>
|
||||
</div>
|
||||
<p class="text-red-300">{$t('wish.help.notice')}</p>
|
||||
<p>{$t('wish.help.consider')}</p>
|
||||
</div>
|
||||
</div>
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
import { onMount } from 'svelte';
|
||||
import dayjs from 'dayjs';
|
||||
import debounce from 'lodash/debounce';
|
||||
|
||||
import { characters } from '../../data/characters';
|
||||
import { weaponList } from '../../data/weaponList';
|
||||
|
@ -24,14 +25,16 @@
|
|||
let wishCount = 0;
|
||||
const avg = {};
|
||||
|
||||
$: if ($fromRemote) {
|
||||
const readDebounced = debounce(() => {
|
||||
readLocalData();
|
||||
}, 1000);
|
||||
|
||||
$: if ($fromRemote) {
|
||||
readDebounced();
|
||||
}
|
||||
|
||||
$: if ($updateTime) {
|
||||
setTimeout(() => {
|
||||
readLocalData();
|
||||
}, 1000);
|
||||
readDebounced();
|
||||
}
|
||||
|
||||
onMount(async () => {
|
||||
|
@ -76,6 +79,8 @@
|
|||
},
|
||||
};
|
||||
|
||||
|
||||
|
||||
export async function readLocalData() {
|
||||
let totalWish = 0;
|
||||
console.log('wish summary read local');
|
||||
|
@ -94,7 +99,7 @@
|
|||
}
|
||||
updateCollectedCharacters = true;
|
||||
} else {
|
||||
collectedCharacters = {...defaultChars};
|
||||
collectedCharacters = JSON.parse(JSON.stringify(defaultChars));
|
||||
}
|
||||
const collectablesNeedUpdateData = await readSave(`${prefix}collectables-updated`);
|
||||
if (collectablesNeedUpdateData === null || collectablesNeedUpdateData === true) {
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
</tr>
|
||||
</table>
|
||||
{#if avg.legendary.pulls.length > 0}
|
||||
<div class="flex flex-wrap mt-2 overflow-y-auto" style="max-height: 300px;">
|
||||
<div class="flex flex-wrap mt-2 overflow-y-auto" style="max-height: 500px;">
|
||||
{#each avg.legendary.pulls as pull}
|
||||
<span class="pity">{pull.name} <span style={calculateColor((90 - pull.pity) / 90)}>{pull.pity}</span></span>
|
||||
{/each}
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
<script>
|
||||
import { t } from 'svelte-i18n';
|
||||
|
||||
import { mdiDatabaseImport, mdiHelpCircle } from '@mdi/js';
|
||||
import { mdiCog, mdiDatabaseImport, mdiHelpCircle } from '@mdi/js';
|
||||
import { getContext, onMount } from 'svelte';
|
||||
|
||||
import Button from '../../components/Button.svelte';
|
||||
import Icon from '../../components/Icon.svelte';
|
||||
import HowToModal from '../../components/WishCounterHowToModal.svelte';
|
||||
import ImportModal from '../../components/WishImportModal.svelte';
|
||||
import { fromRemote, readSave, updateSave } from '../../stores/saveManager';
|
||||
|
||||
|
@ -14,6 +13,8 @@
|
|||
import Counter from './_counter.svelte';
|
||||
import FirstTimePopup from './_firstTime.svelte';
|
||||
import MonthlyGraph from './_monthlyGraph.svelte';
|
||||
import HowToModal from './_helpModal.svelte';
|
||||
import SettingModal from './_settingModal.svelte';
|
||||
|
||||
const { open: openModal, close: closeModal } = getContext('simple-modal');
|
||||
|
||||
|
@ -78,9 +79,21 @@
|
|||
function openHowTo() {
|
||||
openModal(
|
||||
HowToModal,
|
||||
{},
|
||||
{
|
||||
closeButton: false,
|
||||
styleWindow: { background: '#25294A', width: '800px' },
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
function openSetting() {
|
||||
openModal(
|
||||
SettingModal,
|
||||
{
|
||||
setManualInput,
|
||||
settings,
|
||||
closeImportModal,
|
||||
},
|
||||
{
|
||||
closeButton: false,
|
||||
|
@ -111,6 +124,7 @@
|
|||
counter3.readLocalData();
|
||||
counter4.readLocalData();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
|
@ -131,18 +145,30 @@
|
|||
<Icon size={0.8} path={mdiDatabaseImport} />
|
||||
{$t('wish.autoImport')}
|
||||
</Button>
|
||||
<Button on:click={openHowTo} className="hidden md:block">
|
||||
<Icon size={0.8} path={mdiHelpCircle} />
|
||||
{$t('wish.helpAndSetting')}
|
||||
{#if settings.manualInput}
|
||||
<Button on:click={openHowTo} className="mr-2 hidden md:block">
|
||||
<Icon size={0.8} path={mdiHelpCircle} />
|
||||
{$t('wish.helps')}
|
||||
</Button>
|
||||
{/if}
|
||||
<Button on:click={openSetting} className="hidden md:block">
|
||||
<Icon size={0.8} path={mdiCog} />
|
||||
{$t('wish.settings')}
|
||||
</Button>
|
||||
<div class="md:hidden flex flex-wrap justify-center">
|
||||
<Button className="m-1" on:click={openImport}>
|
||||
<Icon size={0.8} path={mdiDatabaseImport} />
|
||||
{$t('wish.autoImport')}
|
||||
</Button>
|
||||
<Button className="m-1" on:click={openHowTo}>
|
||||
<Icon size={0.8} path={mdiHelpCircle} />
|
||||
{$t('wish.helpAndSetting')}
|
||||
{#if settings.manualInput}
|
||||
<Button className="m-1" on:click={openHowTo}>
|
||||
<Icon size={0.8} path={mdiHelpCircle} />
|
||||
{$t('wish.helps')}
|
||||
</Button>
|
||||
{/if}
|
||||
<Button className="m-1" on:click={openSetting}>
|
||||
<Icon size={0.8} path={mdiCog} />
|
||||
{$t('wish.settings')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 75 KiB |
BIN
static/images/events/update16.jpg
Normal file
BIN
static/images/events/update16.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 172 KiB |
88
static/images/locales/pt.svg
Normal file
88
static/images/locales/pt.svg
Normal file
|
@ -0,0 +1,88 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
|
||||
<svg id="svg378" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="512" width="512" version="1" y="0" x="0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata id="metadata3194">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="flag" stroke-width="1pt">
|
||||
<rect id="rect552" fill-rule="evenodd" height="512" width="512" y="0" x="0" fill="#229e45"/>
|
||||
<g id="g3551" transform="matrix(.74806 0 0 .74806 65.576 64.496)">
|
||||
<path id="path554" d="m261.72 455.71 307.29-199.44-309.15-199.98-308.3 200.46 310.16 198.96z" fill-rule="evenodd" fill="#f8e509"/>
|
||||
<path id="path557" d="m293.25 149.98c0 41.878-34.418 75.827-76.874 75.827-42.457 0-76.874-33.949-76.874-75.827s34.418-75.827 76.874-75.827c42.457 0 76.874 33.949 76.874 75.827z" fill-rule="evenodd" transform="matrix(1.6911 0 0 1.7117 -100.3 -.71516)" fill="#2b49a3"/>
|
||||
<polygon id="polygon559" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.5567 0 0 1.5877 -132.89 162.78)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon560" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.5567 0 0 1.5877 -45.771 184.84)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon561" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.3448 0 0 1.3716 -34.894 172.87)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon562" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.3204 0 0 1.3467 58.669 162.88)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon563" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.5567 0 0 1.5877 -84.912 110.55)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon564" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.5567 0 0 1.5877 -192.18 70.278)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon565" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.5567 0 0 1.5877 -179.28 123.85)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon566" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.3751 0 0 1.4025 -3.9188 70.499)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon567" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.083 0 0 1.1046 55.481 137.43)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon568" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 -79.913 190.38)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon569" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.84693 0 0 .79301 167.62 231.47)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon570" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 -79.913 190.38)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon571" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 -79.913 190.38)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon572" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 -37.226 190.37)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon573" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 -42.53 204.57)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon574" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 46.108 178.72)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon575" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 20.098 178.71)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon576" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.65125 0 0 .66422 38.233 212.26)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon577" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0393 0 0 1.06 120.35 213.95)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon578" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.86091 0 0 .88028 139.46 236.14)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon579" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.80183 0 0 .81855 163.18 242.54)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon580" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.77230 0 0 .78768 199.27 220.26)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon581" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.0086 0 0 .97287 105.45 240.62)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon582" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.91998 0 0 .97287 125.85 252.28)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon583" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.77230 0 0 .78768 139.93 245.86)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon584" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.77230 0 0 .78768 121.49 245.86)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon585" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.77230 0 0 .78768 90.179 218.48)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon586" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(.65415 0 0 .66718 120.67 287.26)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<polygon id="polygon587" d="m 228.54263,107.67979 -2.58769,-1.46504 -2.67388,1.30112 0.5937,-2.91377 -2.06371,-2.14093 2.95462,-0.33577 1.39843,-2.624291 1.23236,2.706261 2.92799,0.51903 -2.19299,2.00832 z" fill-rule="evenodd" transform="matrix(1.5567 0 0 1.5877 -132.89 97.877)" points="228.54 107.68 225.96 106.22 223.28 107.52 223.88 104.6 221.81 102.46 224.77 102.12 226.16 99.501 227.4 102.21 230.32 102.73 228.13 104.74" fill="#ffffef"/>
|
||||
<path id="path726" d="m387.05 302.7c1.9812-5.1813 4.537-12.995 5.8942-20.167-69.048-60.656-146.02-91.728-243.28-85.335-3.4867 6.6859-6.2778 13.683-8.6308 21.256 115.24-10.994 199.71 40.026 246.02 84.246z" stroke-opacity=".50314" fill-rule="evenodd" fill="#fff"/>
|
||||
<path id="path790" d="m356.01 268.6 2.4671 1.3471c-0.38704 0.87468-0.49104 1.6398-0.31543 2.292 0.18244 0.659 0.63597 1.2324 1.3589 1.722 0.76726 0.52378 1.4527 0.75315 2.0562 0.69153 0.6104-0.0616 1.0656-0.31153 1.3606-0.74801 0.18584-0.27901 0.26257-0.57342 0.22847-0.87981-0.0273-0.3064-0.19608-0.6727-0.50468-1.0955-0.21313-0.28585-0.73316-0.89008-1.5584-1.811-1.0605-1.1828-1.6931-2.1807-1.8977-2.9938-0.28303-1.1434-0.11083-2.1824 0.52003-3.1187 0.40749-0.60252 0.9548-1.051 1.6436-1.3437 0.69905-0.29441 1.4612-0.36117 2.283-0.20198 0.82692 0.1609 1.6965 0.54945 2.6001 1.1657 1.48 1.0048 2.3734 2.0866 2.6786 3.2437 0.31201 1.1605 0.12105 2.2971-0.57459 3.4097l-2.4501-1.5114c0.30691-0.67783 0.38193-1.2632 0.22166-1.7562-0.15005-0.49468-0.56095-0.96882-1.2327-1.4241-0.69053-0.469-1.3282-0.69495-1.9113-0.67612-0.3768 0.012-0.66665 0.17117-0.87296 0.47757-0.18926 0.28071-0.23188 0.6008-0.13129 0.96026 0.13129 0.45702 0.6803 1.2153 1.6556 2.2766 0.97185 1.0595 1.6351 1.9256 1.988 2.5966 0.36146 0.66928 0.52515 1.3659 0.49105 2.0883-0.0239 0.72062-0.28986 1.4549-0.79283 2.203-0.45694 0.67954-1.0724 1.1845-1.8465 1.5217-0.77408 0.33721-1.601 0.41937-2.4842 0.24306-0.87808-0.17972-1.8295-0.61792-2.8525-1.3146-1.4902-1.0099-2.404-2.1328-2.7382-3.3635-0.32906-1.2358-0.12787-2.571 0.6104-4.0002z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
<path id="path791" d="m344.31 260.92 2.52 1.2444c-0.35124 0.88837-0.42455 1.6586-0.22336 2.3022 0.21142 0.65044 0.68371 1.2067 1.4271 1.6672 0.78942 0.49126 1.4816 0.69324 2.0818 0.60765 0.6104-0.0873 1.0554-0.35261 1.3299-0.80107 0.17732-0.28585 0.2404-0.58369 0.19437-0.88837-0.0392-0.30639-0.22336-0.66585-0.55072-1.0766-0.22335-0.2773-0.76384-0.85756-1.6283-1.7459-1.1066-1.14-1.7783-2.1122-2.0153-2.915-0.32906-1.1314-0.19778-2.1756 0.39215-3.1375 0.38534-0.61792 0.91389-1.0869 1.5891-1.407 0.68882-0.3218 1.4476-0.42107 2.2745-0.29612 0.83375 0.13009 1.7169 0.4827 2.6445 1.0612 1.5209 0.94314 2.4552 1.989 2.8064 3.1324 0.35805 1.1485 0.21312 2.2902-0.43478 3.4302l-2.5115-1.4122c0.27963-0.6881 0.33248-1.2752 0.15175-1.7613-0.1705-0.48954-0.60016-0.94657-1.2873-1.3745-0.71099-0.44162-1.3572-0.64017-1.9369-0.59738-0.3768 0.0257-0.65984 0.19856-0.85421 0.51351-0.17561 0.28756-0.20801 0.60594-0.0921 0.96197 0.14834 0.45189 0.72804 1.1879 1.7442 2.2098 1.0128 1.0185 1.7118 1.8572 2.0903 2.5128 0.38875 0.65387 0.57971 1.3437 0.57459 2.066 0.007 0.72234-0.23188 1.4652-0.70246 2.2355-0.42966 0.69324-1.0281 1.2256-1.7851 1.5953-0.76044 0.36802-1.5857 0.4827-2.474 0.34234-0.88149-0.14378-1.8499-0.54603-2.9019-1.1982-1.5277-0.9517-2.4859-2.0352-2.8695-3.2522-0.38192-1.2222-0.23358-2.5624 0.44672-4.0191z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
<path id="path792" d="m329.83 257.04 7.4168-12.196 9.0076 5.5202-1.2549 2.0643-6.5523-4.0173-1.647 2.7028 6.0988 3.7383-1.2498 2.054-6.0988-3.7366-2.017 3.319 6.7859 4.1594-1.2515 2.0557-9.2377-5.664z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
<path id="path795" d="m308.74 239.72 1.0997-2.1413 5.5055 2.85-2.595 5.058c-0.80476 0.24306-1.8158 0.30126-3.04 0.17289-1.2123-0.1318-2.3393-0.46558-3.381-1.0048-1.3231-0.68468-2.3342-1.5559-3.0332-2.6206-0.69565-1.0698-1.0281-2.2474-0.99232-3.5381 0.0392-1.2975 0.36999-2.5538 0.99573-3.7726 0.67688-1.3231 1.5601-2.3536 2.641-3.0982 1.0759-0.74117 2.2915-1.1109 3.6368-1.1109 1.0281-0.003 2.1449 0.31153 3.3538 0.93287 1.572 0.81477 2.6274 1.7802 3.1645 2.8996 0.54901 1.1177 0.64961 2.3245 0.30349 3.6236l-2.7809-0.83702c0.14151-0.71548 0.058-1.3813-0.25405-1.9941-0.30179-0.61792-0.82181-1.116-1.5567-1.4977-1.1185-0.57855-2.1875-0.68296-3.2156-0.31153-1.0196 0.36973-1.8874 1.253-2.6036 2.6514-0.77578 1.508-1.0247 2.8123-0.74509 3.9146 0.28304 1.0938 0.96333 1.9222 2.0477 2.4837 0.53366 0.27558 1.1219 0.44847 1.763 0.51693 0.65132 0.0668 1.2447 0.0496 1.7868-0.0514l0.82693-1.6124-2.9275-1.5131z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
<path id="path804" d="m216.76 216.91 2.0733-14.135 4.2523 0.6299 1.1441 10.017 3.9352-9.2688 4.2676 0.6299-2.0716 14.137-2.6411-0.39026 1.6334-11.128-4.4279 10.715-2.7365-0.40567-1.156-11.539-1.6317 11.126-2.6411-0.38856z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
<path id="path805" d="m202.38 215.24 1.3299-14.229 10.506 0.99278-0.22165 2.4066-7.647-0.72062-0.29667 3.1546 7.1133 0.66927-0.22336 2.3981-7.115-0.67099-0.35976 3.8718 7.9129 0.74459-0.22165 2.3998-10.777-1.0168z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
<g id="g812" transform="matrix(1.397 -.89423 .89074 1.4025 -199.05 128.1)" stroke-opacity=".50196">
|
||||
<path id="path810" d="m154.79 154.48c0.49-0.725 1.01-1.26 1.56-1.605 0.406-0.253 0.847-0.429 1.319-0.529 0.476-0.098 0.928-0.103 1.356-0.016 0.57 0.112 1.145 0.364 1.724 0.755 1.048 0.71 1.666 1.602 1.853 2.676 0.192 1.078-0.105 2.196-0.888 3.354-0.777 1.148-1.698 1.837-2.763 2.064-1.062 0.225-2.116-0.016-3.16-0.723-1.059-0.716-1.681-1.607-1.87-2.673-0.187-1.07 0.103-2.171 0.869-3.303z" fill="#309e3a"/>
|
||||
<path id="path811" d="m156.31 155.43c-0.545 0.805-0.773 1.543-0.683 2.212 0.091 0.666 0.424 1.193 0.997 1.58 0.572 0.387 1.181 0.499 1.824 0.336 0.649-0.165 1.252-0.66 1.811-1.485 0.551-0.815 0.783-1.545 0.696-2.189-0.085-0.642-0.423-1.163-1.015-1.564-0.592-0.4-1.207-0.519-1.846-0.357-0.636 0.159-1.231 0.648-1.784 1.467z" fill="#f7ffff"/>
|
||||
</g>
|
||||
<g id="g815" transform="matrix(1.383 -.91592 .91234 1.3884 -199.32 133.77)" stroke-opacity=".50196">
|
||||
<path id="path808" d="m160.44 163.42 4.814-7.115 3.023 2.046c0.761 0.515 1.269 0.952 1.524 1.314 0.261 0.36 0.384 0.774 0.37 1.241s-0.163 0.91-0.448 1.331c-0.361 0.534-0.817 0.869-1.367 1.006-0.548 0.134-1.165 0.035-1.851-0.297 0.188 0.391 0.31 0.764 0.363 1.116 0.058 0.354 0.07 0.924 0.039 1.71l-0.07 1.975-1.718-1.162 0.009-2.251c0.006-0.802-0.012-1.321-0.051-1.555-0.038-0.238-0.115-0.434-0.232-0.589-0.115-0.157-0.337-0.348-0.668-0.571l-0.29-0.197-2.01 2.97-1.437-0.972z" fill="#309e3a"/>
|
||||
<path id="path809" d="m164.66 160.29 1.063 0.719c0.689 0.467 1.139 0.729 1.35 0.787 0.211 0.057 0.413 0.048 0.606-0.029s0.362-0.222 0.507-0.435c0.162-0.24 0.228-0.476 0.196-0.709-0.025-0.234-0.141-0.45-0.348-0.646-0.106-0.095-0.45-0.34-1.032-0.734l-1.121-0.758-1.221 1.805z" fill="#fff"/>
|
||||
</g>
|
||||
<g id="g818" transform="matrix(1.4175 -.86112 .85776 1.4231 -194.72 119.26)" stroke-opacity=".50196">
|
||||
<path id="path806" d="m172.42 161.16 2.626 1.776c0.592 0.401 1.012 0.751 1.261 1.052 0.334 0.405 0.544 0.866 0.629 1.381 0.086 0.515 0.052 1.053-0.101 1.615-0.152 0.558-0.452 1.17-0.903 1.836-0.396 0.586-0.811 1.041-1.243 1.367-0.529 0.397-1.065 0.644-1.613 0.741-0.412 0.075-0.877 0.036-1.393-0.115-0.385-0.114-0.843-0.351-1.374-0.71l-2.702-1.828 4.813-7.115z" fill="#309e3a"/>
|
||||
<path id="path807" d="m173.05 163.33-3.188 4.713 1.073 0.725c0.4 0.272 0.706 0.445 0.914 0.52 0.272 0.099 0.532 0.131 0.778 0.095 0.25-0.034 0.53-0.177 0.841-0.429 0.314-0.254 0.657-0.656 1.029-1.206s0.609-1.006 0.712-1.366c0.102-0.36 0.121-0.681 0.058-0.965-0.063-0.283-0.209-0.544-0.438-0.784-0.17-0.181-0.548-0.47-1.134-0.866l-0.645-0.437z" fill="#fff"/>
|
||||
</g>
|
||||
<g id="g824" transform="matrix(1.5511 -.58458 .58229 1.5572 -164.55 46.058)" stroke-opacity=".50196">
|
||||
<path id="path800" d="m200.75 190.69 4.813-7.115 2.306 1.56c0.873 0.591 1.419 1.012 1.636 1.263 0.335 0.382 0.519 0.846 0.551 1.391 0.034 0.542-0.141 1.096-0.524 1.662-0.295 0.437-0.622 0.751-0.983 0.941-0.359 0.191-0.72 0.288-1.082 0.294-0.357 0.004-0.68-0.052-0.97-0.168-0.388-0.164-0.908-0.466-1.558-0.906l-0.936-0.634-1.816 2.684-1.437-0.972z" fill="#309e3a"/>
|
||||
<path id="path801" d="m206.19 185.75-1.366 2.019 0.786 0.532c0.567 0.383 0.97 0.602 1.211 0.656 0.242 0.055 0.469 0.039 0.683-0.047 0.217-0.084 0.397-0.231 0.539-0.442 0.175-0.259 0.244-0.523 0.206-0.794-0.039-0.272-0.16-0.507-0.364-0.706-0.15-0.149-0.483-0.398-1.001-0.748l-0.694-0.47z" fill="#fff"/>
|
||||
</g>
|
||||
<g id="g827" transform="matrix(1.6028 -.42116 .41952 1.6091 -143.19 2.8883)" stroke-opacity=".50196">
|
||||
<path id="path798" d="m207.39 195.18 4.813-7.114 3.024 2.046c0.761 0.514 1.269 0.952 1.524 1.313 0.261 0.361 0.384 0.774 0.37 1.241s-0.163 0.911-0.448 1.331c-0.361 0.534-0.817 0.869-1.367 1.006-0.548 0.134-1.165 0.035-1.851-0.296 0.188 0.391 0.31 0.763 0.363 1.115 0.058 0.355 0.07 0.925 0.039 1.71l-0.07 1.976-1.718-1.162 0.009-2.251c0.005-0.803-0.012-1.321-0.051-1.556-0.038-0.237-0.115-0.433-0.232-0.588-0.115-0.158-0.337-0.348-0.668-0.572l-0.29-0.197-2.01 2.971-1.437-0.973z" fill="#309e3a"/>
|
||||
<path id="path799" d="m211.6 192.05 1.063 0.719c0.689 0.466 1.138 0.728 1.349 0.785 0.211 0.058 0.413 0.049 0.607-0.028 0.193-0.076 0.362-0.222 0.506-0.435 0.162-0.24 0.228-0.476 0.197-0.709-0.025-0.234-0.142-0.449-0.348-0.646-0.106-0.095-0.45-0.339-1.032-0.733l-1.121-0.759-1.221 1.806z" fill="#fff"/>
|
||||
</g>
|
||||
<g id="g830" transform="matrix(1.5864 -.47997 .47809 1.5926 -149.72 20.414)" stroke-opacity=".50196">
|
||||
<path id="path796" d="m216.64 196.32c0.491-0.725 1.011-1.26 1.559-1.605 0.408-0.253 0.847-0.43 1.321-0.529 0.476-0.098 0.928-0.103 1.355-0.017 0.571 0.112 1.145 0.364 1.724 0.756 1.049 0.709 1.666 1.601 1.854 2.676 0.191 1.077-0.105 2.195-0.889 3.353-0.777 1.149-1.698 1.837-2.762 2.065-1.062 0.225-2.116-0.017-3.161-0.724-1.058-0.715-1.681-1.606-1.87-2.672-0.187-1.07 0.103-2.171 0.869-3.303z" fill="#309e3a"/>
|
||||
<path id="path797" d="m218.16 197.28c-0.545 0.805-0.773 1.542-0.683 2.212 0.092 0.665 0.424 1.192 0.997 1.58 0.573 0.387 1.18 0.499 1.824 0.335 0.649-0.164 1.253-0.659 1.811-1.484 0.552-0.816 0.784-1.545 0.696-2.19-0.084-0.641-0.423-1.163-1.015-1.563-0.592-0.401-1.207-0.52-1.845-0.357-0.636 0.159-1.231 0.648-1.785 1.467z" fill="#fff"/>
|
||||
</g>
|
||||
<g id="g833" transform="matrix(1.6454 -.19485 .19409 1.6519 -103.71 -53.916)" stroke-opacity=".50196">
|
||||
<path id="path793" d="m230.03 210.5 4.813-7.115 3.024 2.046c0.76 0.515 1.268 0.952 1.524 1.314 0.26 0.36 0.384 0.774 0.37 1.241s-0.164 0.91-0.448 1.331c-0.361 0.534-0.817 0.869-1.368 1.006-0.548 0.134-1.164 0.035-1.85-0.297 0.188 0.391 0.309 0.764 0.363 1.116 0.057 0.355 0.07 0.924 0.039 1.71l-0.071 1.975-1.717-1.162 0.008-2.25c0.005-0.804-0.011-1.322-0.051-1.556-0.037-0.237-0.115-0.434-0.232-0.589-0.114-0.157-0.337-0.348-0.667-0.571l-0.291-0.197-2.009 2.97-1.437-0.972z" fill="#309e3a"/>
|
||||
<path id="path794" d="m234.24 207.36 1.063 0.719c0.689 0.467 1.139 0.728 1.35 0.786 0.21 0.058 0.413 0.048 0.607-0.028 0.193-0.077 0.361-0.222 0.506-0.436 0.162-0.239 0.227-0.475 0.197-0.708-0.026-0.234-0.142-0.45-0.348-0.646-0.106-0.095-0.45-0.34-1.033-0.734l-1.12-0.758-1.222 1.805z" fill="#fff"/>
|
||||
</g>
|
||||
<g id="g836" transform="matrix(1.6568 0 0 1.6633 -60.955 -99.344)" stroke-opacity=".50196">
|
||||
<path id="path788" d="m259.17 225.1c0.49-0.725 1.01-1.26 1.56-1.605 0.407-0.253 0.847-0.429 1.32-0.529 0.477-0.097 0.928-0.103 1.355-0.017 0.571 0.113 1.146 0.365 1.725 0.757 1.048 0.709 1.666 1.601 1.854 2.676 0.191 1.077-0.106 2.194-0.89 3.353-0.777 1.148-1.697 1.837-2.761 2.065-1.063 0.224-2.116-0.017-3.162-0.724-1.057-0.716-1.681-1.607-1.87-2.673-0.187-1.07 0.103-2.171 0.869-3.303z" fill="#309e3a"/>
|
||||
<path id="path789" d="m260.69 226.05c-0.545 0.806-0.773 1.543-0.684 2.212 0.093 0.666 0.425 1.192 0.997 1.58 0.573 0.387 1.181 0.499 1.825 0.336 0.649-0.165 1.253-0.659 1.811-1.485 0.551-0.815 0.783-1.545 0.695-2.189-0.085-0.642-0.423-1.163-1.015-1.564s-1.207-0.52-1.845-0.357c-0.636 0.159-1.23 0.649-1.784 1.467z" fill="#fff"/>
|
||||
</g>
|
||||
<path id="path872" d="m241.76 219.84 2.2915-10.031 7.4083 1.7083-0.38534 1.6946-5.3895-1.241-0.51321 2.2235 5.0195 1.1571-0.38874 1.6877-5.0127-1.1537-0.62574 2.7284 5.5805 1.2855-0.38533 1.6912-7.5992-1.7511z" stroke-opacity=".50196" fill="#309e3a"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 25 KiB |
134
static/images/locales/zh.svg
Normal file
134
static/images/locales/zh.svg
Normal file
|
@ -0,0 +1,134 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="-5 -5 10.24 10.24"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="cn.svg">
|
||||
<metadata
|
||||
id="metadata23">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1215"
|
||||
inkscape:window-height="776"
|
||||
id="namedview21"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.1660156"
|
||||
inkscape:cx="256"
|
||||
inkscape:cy="256"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<title
|
||||
id="title4">Flag of the People's Republic of China</title>
|
||||
<defs
|
||||
id="defs8">
|
||||
<polygon
|
||||
id="s"
|
||||
points="488533,-158734 -301930,415571 0,-513674 301930,415571 -488533,-158734 "
|
||||
transform="scale(1.94676e-6,1.94676e-6)"
|
||||
style="fill:#ffde00" />
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath3010">
|
||||
<rect
|
||||
style="fill:#000000;stroke:none"
|
||||
id="rect3012"
|
||||
width="26.666668"
|
||||
height="20"
|
||||
x="-5"
|
||||
y="-15.400001" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath3000">
|
||||
<rect
|
||||
style="fill:#000000;stroke:none"
|
||||
id="rect3002"
|
||||
width="19.999998"
|
||||
height="19.999998"
|
||||
x="-5"
|
||||
y="-15.4" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
id="flag"
|
||||
transform="matrix(0.51200002,0,0,0.51200002,-2.44,2.8848002)"
|
||||
clip-path="url(#clipPath3000)"
|
||||
inkscape:label="#g3000">
|
||||
<rect
|
||||
style="fill:#de2910"
|
||||
id="rect6"
|
||||
height="20"
|
||||
width="30"
|
||||
y="-15.4"
|
||||
x="-5" />
|
||||
<use
|
||||
height="20"
|
||||
width="30"
|
||||
y="0"
|
||||
x="0"
|
||||
id="use11"
|
||||
transform="matrix(3,0,0,3,0,-10.4)"
|
||||
xlink:href="#s" />
|
||||
<use
|
||||
height="20"
|
||||
width="30"
|
||||
y="0"
|
||||
x="0"
|
||||
id="use13"
|
||||
transform="matrix(-0.51449575,-0.85749293,0.85749293,-0.51449575,5,-13.4)"
|
||||
xlink:href="#s" />
|
||||
<use
|
||||
height="20"
|
||||
width="30"
|
||||
y="0"
|
||||
x="0"
|
||||
id="use15"
|
||||
transform="matrix(-0.14142135,-0.98994949,0.98994949,-0.14142135,7,-11.4)"
|
||||
xlink:href="#s" />
|
||||
<use
|
||||
height="20"
|
||||
width="30"
|
||||
y="0"
|
||||
x="0"
|
||||
id="use17"
|
||||
transform="matrix(0.27472113,-0.96152395,0.96152395,0.27472113,7,-8.4)"
|
||||
xlink:href="#s" />
|
||||
<use
|
||||
height="20"
|
||||
width="30"
|
||||
y="0"
|
||||
x="0"
|
||||
id="use19"
|
||||
transform="matrix(0.62469505,-0.78086881,0.78086881,0.62469505,5,-6.4)"
|
||||
xlink:href="#s" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
Loading…
Add table
Reference in a new issue