Felix Zieger
commited on
Commit
·
2d83648
1
Parent(s):
a64b653
updates
Browse files- src/components/game/LanguageSelector.tsx +1 -0
- src/components/game/WelcomeScreen.tsx +13 -11
- src/components/game/leaderboard/ScoresTable.tsx +2 -0
- src/contexts/LanguageContext.tsx +2 -2
- src/i18n/translations/de.ts +1 -1
- src/i18n/translations/index.ts +3 -1
- src/i18n/translations/pt.ts +178 -0
- src/lib/words-food.ts +46 -1
- src/lib/words-sports.ts +43 -0
- src/lib/words-standard.ts +229 -0
- supabase/functions/generate-daily-challenge/index.ts +220 -225
- supabase/functions/generate-themed-word/index.ts +11 -7
- supabase/functions/generate-word/index.ts +6 -0
- supabase/functions/guess-word/index.ts +5 -0
src/components/game/LanguageSelector.tsx
CHANGED
@@ -15,6 +15,7 @@ const languages: { code: Language; name: string; flag: string }[] = [
|
|
15 |
{ code: 'de', name: 'Deutsch', flag: '🇩🇪' },
|
16 |
{ code: 'it', name: 'Italiano', flag: '🇮🇹' },
|
17 |
{ code: 'es', name: 'Español', flag: '🇪🇸' },
|
|
|
18 |
];
|
19 |
|
20 |
|
|
|
15 |
{ code: 'de', name: 'Deutsch', flag: '🇩🇪' },
|
16 |
{ code: 'it', name: 'Italiano', flag: '🇮🇹' },
|
17 |
{ code: 'es', name: 'Español', flag: '🇪🇸' },
|
18 |
+
{ code: 'pt', name: 'Português', flag: '🇵🇹' },
|
19 |
];
|
20 |
|
21 |
|
src/components/game/WelcomeScreen.tsx
CHANGED
@@ -56,23 +56,25 @@ export const WelcomeScreen = ({ onStartDaily: onStartDaily, onStartNew: onStartN
|
|
56 |
/>
|
57 |
</motion.div>
|
58 |
|
59 |
-
<motion.div
|
60 |
-
initial={{ opacity: 0 }}
|
61 |
-
animate={{ opacity: 1 }}
|
62 |
-
transition={{ delay: 0.1 }}
|
63 |
-
className="max-w-2xl mx-auto text-center mt-8"
|
64 |
-
>
|
65 |
-
<ContestSection />
|
66 |
-
</motion.div>
|
67 |
-
|
68 |
<motion.div
|
69 |
initial={{ opacity: 0 }}
|
70 |
animate={{ opacity: 1 }}
|
71 |
transition={{ delay: 0.2 }}
|
72 |
className="max-w-2xl mx-auto text-center mt-8"
|
73 |
>
|
74 |
-
<
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
77 |
<Dialog open={showHighScores} onOpenChange={setShowHighScores}>
|
78 |
<DialogContent className="max-h-[90vh] overflow-y-auto sm:max-w-[600px]">
|
|
|
56 |
/>
|
57 |
</motion.div>
|
58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
<motion.div
|
60 |
initial={{ opacity: 0 }}
|
61 |
animate={{ opacity: 1 }}
|
62 |
transition={{ delay: 0.2 }}
|
63 |
className="max-w-2xl mx-auto text-center mt-8"
|
64 |
>
|
65 |
+
<div className="mt-12 text-sm text-gray-500 space-y-2">
|
66 |
+
<p>
|
67 |
+
Made by{" "}
|
68 |
+
<a href="https://www.linkedin.com/in/sandro-mikautadze/" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">Sandro</a>,{" "}
|
69 |
+
<a href="https://www.linkedin.com/in/alessandro-pranzo/" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">Alessandro</a>,{" "}
|
70 |
+
<a href="https://www.linkedin.com/in/mattia-martino-528363225/" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline"> Mattia</a>,{" "}
|
71 |
+
<a href="https://www.linkedin.com/in/michael-sheroubi/" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">Michael</a>,{" "}
|
72 |
+
<a href="https://www.linkedin.com/in/michael-sheroubi/" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">Emiliano</a>, and{" "}
|
73 |
+
<a href="https://felixzieger.de/" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">Felix</a>{" "}
|
74 |
+
</p>
|
75 |
+
</div>
|
76 |
+
</motion.div >
|
77 |
+
|
78 |
|
79 |
<Dialog open={showHighScores} onOpenChange={setShowHighScores}>
|
80 |
<DialogContent className="max-h-[90vh] overflow-y-auto sm:max-w-[600px]">
|
src/components/game/leaderboard/ScoresTable.tsx
CHANGED
@@ -56,6 +56,8 @@ const getLanguageEmoji = (language: string) => {
|
|
56 |
return '🇮🇹';
|
57 |
case 'es':
|
58 |
return '🇪🇸';
|
|
|
|
|
59 |
default:
|
60 |
return '🌐';
|
61 |
}
|
|
|
56 |
return '🇮🇹';
|
57 |
case 'es':
|
58 |
return '🇪🇸';
|
59 |
+
case 'pt':
|
60 |
+
return '🇵🇹';
|
61 |
default:
|
62 |
return '🌐';
|
63 |
}
|
src/contexts/LanguageContext.tsx
CHANGED
@@ -8,7 +8,7 @@ interface LanguageContextType {
|
|
8 |
|
9 |
export const LanguageContext = createContext<LanguageContextType>({
|
10 |
language: 'en',
|
11 |
-
setLanguage: () => {},
|
12 |
});
|
13 |
|
14 |
interface LanguageProviderProps {
|
@@ -21,7 +21,7 @@ export const LanguageProvider = ({ children }: LanguageProviderProps) => {
|
|
21 |
useEffect(() => {
|
22 |
const savedLang = localStorage.getItem('language') as Language;
|
23 |
console.log('[LanguageContext] Initial load - Saved language:', savedLang);
|
24 |
-
if (savedLang && ['en', 'fr', 'de', 'it', 'es'].includes(savedLang)) {
|
25 |
setLanguage(savedLang);
|
26 |
}
|
27 |
}, []);
|
|
|
8 |
|
9 |
export const LanguageContext = createContext<LanguageContextType>({
|
10 |
language: 'en',
|
11 |
+
setLanguage: () => { },
|
12 |
});
|
13 |
|
14 |
interface LanguageProviderProps {
|
|
|
21 |
useEffect(() => {
|
22 |
const savedLang = localStorage.getItem('language') as Language;
|
23 |
console.log('[LanguageContext] Initial load - Saved language:', savedLang);
|
24 |
+
if (savedLang && ['en', 'fr', 'de', 'it', 'es', 'pt'].includes(savedLang)) {
|
25 |
setLanguage(savedLang);
|
26 |
}
|
27 |
}, []);
|
src/i18n/translations/de.ts
CHANGED
@@ -6,7 +6,7 @@ export const de = {
|
|
6 |
buildSubtitle: "Fügt abwechselnd Wörter hinzu, um einen Satz zu bilden",
|
7 |
startSentence: "Beginne deinen Satz...",
|
8 |
inputPlaceholder: "Gib EIN Wort ein...",
|
9 |
-
addWord: "
|
10 |
makeGuess: "Raten",
|
11 |
aiThinking: "KI denkt nach...",
|
12 |
aiDelayed: "Die KI ist derzeit beschäftigt. Bitte versuche es gleich noch einmal.",
|
|
|
6 |
buildSubtitle: "Fügt abwechselnd Wörter hinzu, um einen Satz zu bilden",
|
7 |
startSentence: "Beginne deinen Satz...",
|
8 |
inputPlaceholder: "Gib EIN Wort ein...",
|
9 |
+
addWord: "Hinzufügen",
|
10 |
makeGuess: "Raten",
|
11 |
aiThinking: "KI denkt nach...",
|
12 |
aiDelayed: "Die KI ist derzeit beschäftigt. Bitte versuche es gleich noch einmal.",
|
src/i18n/translations/index.ts
CHANGED
@@ -3,13 +3,15 @@ import { fr } from './fr';
|
|
3 |
import { de } from './de';
|
4 |
import { it } from './it';
|
5 |
import { es } from './es';
|
|
|
6 |
|
7 |
export const translations = {
|
8 |
en,
|
9 |
fr,
|
10 |
de,
|
11 |
it,
|
12 |
-
es
|
|
|
13 |
} as const;
|
14 |
|
15 |
export type Language = keyof typeof translations;
|
|
|
3 |
import { de } from './de';
|
4 |
import { it } from './it';
|
5 |
import { es } from './es';
|
6 |
+
import { pt } from './pt';
|
7 |
|
8 |
export const translations = {
|
9 |
en,
|
10 |
fr,
|
11 |
de,
|
12 |
it,
|
13 |
+
es,
|
14 |
+
pt,
|
15 |
} as const;
|
16 |
|
17 |
export type Language = keyof typeof translations;
|
src/i18n/translations/pt.ts
ADDED
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const pt = {
|
2 |
+
game: {
|
3 |
+
title: "Think in Sync",
|
4 |
+
round: "Rodada",
|
5 |
+
buildDescription: "Construam uma frase juntos",
|
6 |
+
buildSubtitle: "Adicionem palavras alternadamente para criar uma frase",
|
7 |
+
startSentence: "Comece a construir sua frase...",
|
8 |
+
inputPlaceholder: "Insira UMA palavra...",
|
9 |
+
addWord: "Adicionar palavra",
|
10 |
+
makeGuess: "Adivinhar",
|
11 |
+
aiThinking: "A IA está pensando...",
|
12 |
+
aiDelayed: "A IA está ocupada no momento. Por favor, tente novamente mais tarde.",
|
13 |
+
invalidWord: "Palavra inválida",
|
14 |
+
cantUseTargetWord: "Não use a palavra secreta",
|
15 |
+
shorterWord: "Use uma palavra mais curta",
|
16 |
+
lettersOnly: "Por favor, use apenas letras",
|
17 |
+
singleWordOnly: "Por favor, insira apenas uma palavra",
|
18 |
+
leaveGameTitle: "Sair do jogo?",
|
19 |
+
leaveGameDescription: "Seu progresso atual será perdido. Tem certeza de que deseja sair?",
|
20 |
+
cancel: "Cancelar",
|
21 |
+
confirm: "Confirmar",
|
22 |
+
describeWord: "Seu objetivo é descrever a palavra",
|
23 |
+
nextRound: "Próxima Rodada",
|
24 |
+
playAgain: "Jogar Novamente",
|
25 |
+
saveScore: "Salvar Pontuação",
|
26 |
+
playNewWords: "Jogar novas palavras",
|
27 |
+
review: {
|
28 |
+
title: "Resumo do Jogo",
|
29 |
+
successfulRounds: "Rodadas Bem-sucedidas",
|
30 |
+
description: "Aqui estão seus resultados:",
|
31 |
+
playAgain: "Jogar as mesmas palavras novamente",
|
32 |
+
playNewWords: "Jogar novas palavras",
|
33 |
+
saveScore: "Salvar Pontuação",
|
34 |
+
shareGame: "Compartilhar",
|
35 |
+
urlCopied: "URL copiada!",
|
36 |
+
urlCopiedDesc: "Compartilhe esta URL com amigos para que joguem com as mesmas palavras",
|
37 |
+
urlCopyError: "Erro ao copiar a URL",
|
38 |
+
urlCopyErrorDesc: "Por favor, tente copiar a URL manualmente",
|
39 |
+
youWin: "Você ganhou!",
|
40 |
+
youLost: "Você perdeu!",
|
41 |
+
friendScore: (score: number, avgWords: string) =>
|
42 |
+
`A pessoa que te desafiou completou ${score} rodadas com sucesso com uma média de ${avgWords} palavras.`,
|
43 |
+
word: "Palavra",
|
44 |
+
yourWords: "Você",
|
45 |
+
friendWords: "Amigo",
|
46 |
+
result: "Resultado",
|
47 |
+
details: "Detalhes",
|
48 |
+
yourDescription: "Sua Descrição",
|
49 |
+
friendDescription: "Descrição do Amigo",
|
50 |
+
aiGuessed: "A IA adivinhou",
|
51 |
+
words: "Palavras"
|
52 |
+
},
|
53 |
+
invitation: {
|
54 |
+
title: "Convite para o Jogo",
|
55 |
+
description: "Ei, você foi convidado para jogar! Jogue agora para ver como se sai com as mesmas palavras!"
|
56 |
+
},
|
57 |
+
error: {
|
58 |
+
title: "Não foi possível iniciar o jogo",
|
59 |
+
description: "Por favor, tente novamente mais tarde."
|
60 |
+
}
|
61 |
+
},
|
62 |
+
leaderboard: {
|
63 |
+
title: "Maiores Pontuações",
|
64 |
+
yourScore: "Sua Pontuação",
|
65 |
+
roundCount: "rodadas",
|
66 |
+
wordsPerRound: "palavras por rodada",
|
67 |
+
enterName: "Insira seu nome",
|
68 |
+
submitting: "Enviando...",
|
69 |
+
submit: "Enviar Pontuação",
|
70 |
+
rank: "Posição",
|
71 |
+
player: "Jogador",
|
72 |
+
roundsColumn: "Rodadas",
|
73 |
+
avgWords: "Média de Palavras",
|
74 |
+
noScores: "Ainda não há pontuações",
|
75 |
+
previous: "Anterior",
|
76 |
+
next: "Próximo",
|
77 |
+
success: "Pontuação enviada com sucesso!",
|
78 |
+
theme: "Tema",
|
79 |
+
actions: "Ações",
|
80 |
+
playSameWords: "Jogar com as mesmas palavras",
|
81 |
+
scoreUpdated: "Pontuação atualizada!",
|
82 |
+
scoreUpdatedDesc: "Sua pontuação anterior para este jogo foi atualizada",
|
83 |
+
scoreSubmitted: "Pontuação enviada!",
|
84 |
+
scoreSubmittedDesc: "Sua pontuação foi adicionada ao placar",
|
85 |
+
modes: {
|
86 |
+
daily: "Desafio Diário",
|
87 |
+
"all-time": "Histórico"
|
88 |
+
},
|
89 |
+
error: {
|
90 |
+
invalidName: "Por favor, insira um nome válido",
|
91 |
+
noRounds: "Você deve completar pelo menos uma rodada",
|
92 |
+
alreadySubmitted: "Pontuação já enviada",
|
93 |
+
newHighScore: "Nova Maior Pontuação!",
|
94 |
+
beatRecord: "Você superou seu recorde anterior de {score}!",
|
95 |
+
notHigher: "Pontuação de {current} não é superior à sua melhor pontuação de {best}",
|
96 |
+
submitError: "Erro ao enviar a pontuação"
|
97 |
+
}
|
98 |
+
},
|
99 |
+
guess: {
|
100 |
+
title: "Suposição da IA",
|
101 |
+
goalDescription: "Seu objetivo era descrever a palavra",
|
102 |
+
providedDescription: "Você forneceu a descrição",
|
103 |
+
aiGuessedDescription: "Com base nesta descrição, a IA adivinhou",
|
104 |
+
correct: "Isso está correto!",
|
105 |
+
incorrect: "Isso está incorreto.",
|
106 |
+
nextRound: "Próxima Rodada",
|
107 |
+
playAgain: "Jogar Novamente",
|
108 |
+
viewLeaderboard: "Ver Placar",
|
109 |
+
cheatingDetected: "Trapaça detectada!"
|
110 |
+
},
|
111 |
+
themes: {
|
112 |
+
title: "Escolha um Tema",
|
113 |
+
subtitle: "Selecione um tema para a palavra que a IA tentará adivinhar",
|
114 |
+
standard: "Padrão",
|
115 |
+
technology: "Tecnologia",
|
116 |
+
sports: "Esportes",
|
117 |
+
food: "Comida",
|
118 |
+
custom: "Tema Personalizado",
|
119 |
+
customPlaceholder: "Insira seu tema personalizado...",
|
120 |
+
continue: "Continuar",
|
121 |
+
generating: "Gerando...",
|
122 |
+
pressKey: "Pressione",
|
123 |
+
playing: "Tema"
|
124 |
+
},
|
125 |
+
welcome: {
|
126 |
+
title: "Think in Sync",
|
127 |
+
subtitle: "Forme uma equipe com a IA para criar uma pista e deixe outra IA adivinhar sua palavra secreta!",
|
128 |
+
startButton: "Iniciar jogo",
|
129 |
+
startDailyButton: "Desafio Diário",
|
130 |
+
startNewButton: "Novo Jogo",
|
131 |
+
dailyLeaderboard: "Placar diário",
|
132 |
+
howToPlay: "Como jogar",
|
133 |
+
leaderboard: "Placar",
|
134 |
+
credits: "Criado durante o",
|
135 |
+
likeGameText: "Se você quiser apoiar este jogo",
|
136 |
+
contest: {
|
137 |
+
prize: "Estamos preparando algo...",
|
138 |
+
terms: "Descubra mais",
|
139 |
+
howTo: "Para se antecipar ao que planejamos:",
|
140 |
+
conditions: [
|
141 |
+
"Jogue Pense em Sincronia usando a lista de palavras padrão",
|
142 |
+
"Defina seu nome no placar igual ao seu nome de usuário no Hugging Face",
|
143 |
+
"Curta nosso projeto no Hugging Face"
|
144 |
+
],
|
145 |
+
deadline: "Em breve anunciaremos os detalhes aqui",
|
146 |
+
prizes: {
|
147 |
+
title: "Compita pelos 5 primeiros lugares e ganhe:",
|
148 |
+
list: [
|
149 |
+
"🥇 1º: 50€",
|
150 |
+
"🥈 2º: 20€",
|
151 |
+
"🥉 3º: 10€",
|
152 |
+
"🎖️ 4º e 5º: 10€ cada"
|
153 |
+
]
|
154 |
+
},
|
155 |
+
fairPlay: "🚨 O jogo limpo está sendo monitorado. Qualquer trapaça resultará em desclassificação!"
|
156 |
+
},
|
157 |
+
likeOnHuggingface: "Curta no Hugging Face"
|
158 |
+
},
|
159 |
+
howToPlay: {
|
160 |
+
setup: {
|
161 |
+
title: "Preparação",
|
162 |
+
description: "Escolha um tema e obtenha uma palavra secreta que a IA tentará adivinhar."
|
163 |
+
},
|
164 |
+
goal: {
|
165 |
+
title: "Objetivo",
|
166 |
+
description: "Construa frases junto com a IA que descrevam sua palavra sem usá-la diretamente."
|
167 |
+
},
|
168 |
+
rules: {
|
169 |
+
title: "Regras",
|
170 |
+
items: [
|
171 |
+
"Adicione palavras alternadamente para construir frases descritivas",
|
172 |
+
"Não use a palavra secreta ou suas variações",
|
173 |
+
"Seja criativo e descritivo",
|
174 |
+
"A IA tentará adivinhar sua palavra após cada frase"
|
175 |
+
]
|
176 |
+
}
|
177 |
+
}
|
178 |
+
};
|
src/lib/words-food.ts
CHANGED
@@ -201,6 +201,48 @@ export const spanishFoodWords = [
|
|
201 |
"MERMELADA"
|
202 |
];
|
203 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
204 |
export const getRandomFoodWord = (language: string = 'en') => {
|
205 |
let wordList;
|
206 |
switch (language) {
|
@@ -216,8 +258,11 @@ export const getRandomFoodWord = (language: string = 'en') => {
|
|
216 |
case 'es':
|
217 |
wordList = spanishFoodWords;
|
218 |
break;
|
|
|
|
|
|
|
219 |
default:
|
220 |
wordList = englishFoodWords;
|
221 |
}
|
222 |
return wordList[Math.floor(Math.random() * wordList.length)];
|
223 |
-
};
|
|
|
201 |
"MERMELADA"
|
202 |
];
|
203 |
|
204 |
+
export const portugueseFoodWords = [
|
205 |
+
"PIZZA",
|
206 |
+
"PASTA",
|
207 |
+
"PÃO",
|
208 |
+
"QUEIJO",
|
209 |
+
"MAÇÃ",
|
210 |
+
"BANANA",
|
211 |
+
"LARANJA",
|
212 |
+
"CENOURA",
|
213 |
+
"BATATA",
|
214 |
+
"TOMATE",
|
215 |
+
"FRANGO",
|
216 |
+
"CARNE",
|
217 |
+
"PEIXE",
|
218 |
+
"ARROZ",
|
219 |
+
"SOPA",
|
220 |
+
"SALADA",
|
221 |
+
"BOLO",
|
222 |
+
"BOLACHA",
|
223 |
+
"CHOCOLATE",
|
224 |
+
"MEL",
|
225 |
+
"UVAS",
|
226 |
+
"LIMÃO",
|
227 |
+
"PIMENTA",
|
228 |
+
"CEBOLA",
|
229 |
+
"ALHO",
|
230 |
+
"COUVE",
|
231 |
+
"BRÓCOLIS",
|
232 |
+
"ESPINAFRE",
|
233 |
+
"COGUMELO",
|
234 |
+
"ABÓBORA",
|
235 |
+
"ABOBRINHA",
|
236 |
+
"PIMENTÃO",
|
237 |
+
"MILHO",
|
238 |
+
"ABACATE",
|
239 |
+
"IOGURTE",
|
240 |
+
"NOZES",
|
241 |
+
"CEREAIS",
|
242 |
+
"CREME",
|
243 |
+
"GELEIA"
|
244 |
+
];
|
245 |
+
|
246 |
export const getRandomFoodWord = (language: string = 'en') => {
|
247 |
let wordList;
|
248 |
switch (language) {
|
|
|
258 |
case 'es':
|
259 |
wordList = spanishFoodWords;
|
260 |
break;
|
261 |
+
case 'pt':
|
262 |
+
wordList = portugueseFoodWords;
|
263 |
+
break;
|
264 |
default:
|
265 |
wordList = englishFoodWords;
|
266 |
}
|
267 |
return wordList[Math.floor(Math.random() * wordList.length)];
|
268 |
+
};
|
src/lib/words-sports.ts
CHANGED
@@ -213,6 +213,46 @@ export const spanishSportsWords = [
|
|
213 |
"LACROSSE"
|
214 |
];
|
215 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
export const getRandomSportsWord = (language: string = 'en') => {
|
217 |
let wordList;
|
218 |
switch (language) {
|
@@ -228,6 +268,9 @@ export const getRandomSportsWord = (language: string = 'en') => {
|
|
228 |
case 'es':
|
229 |
wordList = spanishSportsWords;
|
230 |
break;
|
|
|
|
|
|
|
231 |
default:
|
232 |
wordList = englishSportsWords;
|
233 |
}
|
|
|
213 |
"LACROSSE"
|
214 |
];
|
215 |
|
216 |
+
export const portugueseSportsWords = [
|
217 |
+
"FUTEBOL",
|
218 |
+
"TÊNIS",
|
219 |
+
"GOLFE",
|
220 |
+
"BEISEBOL",
|
221 |
+
"BASQUETEBOL",
|
222 |
+
"VÓLEI",
|
223 |
+
"HÓQUEI",
|
224 |
+
"RÚGUEBI",
|
225 |
+
"CRÍQUETE",
|
226 |
+
"NATAÇÃO",
|
227 |
+
"CORRIDA",
|
228 |
+
"CICLISMO",
|
229 |
+
"ESQUI",
|
230 |
+
"BOXE",
|
231 |
+
"PATINAÇÃO",
|
232 |
+
"SURFE",
|
233 |
+
"ESCALADA",
|
234 |
+
"MERGULHO",
|
235 |
+
"VELA",
|
236 |
+
"LUTA",
|
237 |
+
"GINÁSTICA",
|
238 |
+
"ESGRIMA",
|
239 |
+
"MOTOCICLISMO",
|
240 |
+
"TIRO",
|
241 |
+
"HIPISMO",
|
242 |
+
"ANDEBOL",
|
243 |
+
"SNOWBOARD",
|
244 |
+
"POLO AQUÁTICO",
|
245 |
+
"TRIÁTLO",
|
246 |
+
"HALTEROFILISMO",
|
247 |
+
"JUDÔ",
|
248 |
+
"TAEKWONDO",
|
249 |
+
"SKATEBOARD",
|
250 |
+
"WINDSURF",
|
251 |
+
"BADMINTON",
|
252 |
+
"REMO",
|
253 |
+
"LACROSSE"
|
254 |
+
];
|
255 |
+
|
256 |
export const getRandomSportsWord = (language: string = 'en') => {
|
257 |
let wordList;
|
258 |
switch (language) {
|
|
|
268 |
case 'es':
|
269 |
wordList = spanishSportsWords;
|
270 |
break;
|
271 |
+
case 'pt':
|
272 |
+
wordList = portugueseSportsWords;
|
273 |
+
break;
|
274 |
default:
|
275 |
wordList = englishSportsWords;
|
276 |
}
|
src/lib/words-standard.ts
CHANGED
@@ -1,3 +1,5 @@
|
|
|
|
|
|
1 |
export const englishWords = [
|
2 |
"DOG",
|
3 |
"CAT",
|
@@ -1112,6 +1114,230 @@ export const spanishWords = [
|
|
1112 |
"CÁMARA"
|
1113 |
];
|
1114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1115 |
export const getRandomWord = (language: string = 'en') => {
|
1116 |
let wordList;
|
1117 |
switch (language) {
|
@@ -1127,6 +1353,9 @@ export const getRandomWord = (language: string = 'en') => {
|
|
1127 |
case 'es':
|
1128 |
wordList = spanishWords;
|
1129 |
break;
|
|
|
|
|
|
|
1130 |
default:
|
1131 |
wordList = englishWords;
|
1132 |
}
|
|
|
1 |
+
import { portugueseFoodWords } from "./words-food";
|
2 |
+
|
3 |
export const englishWords = [
|
4 |
"DOG",
|
5 |
"CAT",
|
|
|
1114 |
"CÁMARA"
|
1115 |
];
|
1116 |
|
1117 |
+
export const portugueseWords = [
|
1118 |
+
"CÃO",
|
1119 |
+
"GATO",
|
1120 |
+
"SOL",
|
1121 |
+
"CHUVA",
|
1122 |
+
"ÁRVORE",
|
1123 |
+
"ESTRELA",
|
1124 |
+
"LUA",
|
1125 |
+
"PEIXE",
|
1126 |
+
"PÁSSARO",
|
1127 |
+
"NUVEM",
|
1128 |
+
"CÉU",
|
1129 |
+
"VENTO",
|
1130 |
+
"NEVE",
|
1131 |
+
"FLOR",
|
1132 |
+
"BORBOLETA",
|
1133 |
+
"ÁGUA",
|
1134 |
+
"OCEANO",
|
1135 |
+
"RIO",
|
1136 |
+
"MONTANHA",
|
1137 |
+
"FLORESTA",
|
1138 |
+
"CASA",
|
1139 |
+
"VELA",
|
1140 |
+
"JARDIM",
|
1141 |
+
"PONTE",
|
1142 |
+
"ILHA",
|
1143 |
+
"BRISA",
|
1144 |
+
"LUZ",
|
1145 |
+
"TROVÃO",
|
1146 |
+
"ARCO-ÍRIS",
|
1147 |
+
"SORRISO",
|
1148 |
+
"AMIGO",
|
1149 |
+
"FAMÍLIA",
|
1150 |
+
"MAÇÃ",
|
1151 |
+
"BANANA",
|
1152 |
+
"CARRO",
|
1153 |
+
"BARCO",
|
1154 |
+
"BOLA",
|
1155 |
+
"BOLO",
|
1156 |
+
"RÃ",
|
1157 |
+
"CAVALO",
|
1158 |
+
"LEÃO",
|
1159 |
+
"MACACO",
|
1160 |
+
"AVIÃO",
|
1161 |
+
"TREM",
|
1162 |
+
"DOCE",
|
1163 |
+
"PIPA",
|
1164 |
+
"BALÃO",
|
1165 |
+
"PARQUE",
|
1166 |
+
"PRAIA",
|
1167 |
+
"BRINQUEDO",
|
1168 |
+
"LIVRO",
|
1169 |
+
"BOLHA",
|
1170 |
+
"CONCHA",
|
1171 |
+
"CANETA",
|
1172 |
+
"GELO",
|
1173 |
+
"CHAPÉU",
|
1174 |
+
"SAPATO",
|
1175 |
+
"RELÓGIO",
|
1176 |
+
"CAMA",
|
1177 |
+
"XÍCARA",
|
1178 |
+
"CHAVE",
|
1179 |
+
"PORTA",
|
1180 |
+
"FRANGO",
|
1181 |
+
"PATO",
|
1182 |
+
"OVELHA",
|
1183 |
+
"VACA",
|
1184 |
+
"PORCO",
|
1185 |
+
"CABRA",
|
1186 |
+
"RAPOSA",
|
1187 |
+
"URSO",
|
1188 |
+
"VEADO",
|
1189 |
+
"CORUJA",
|
1190 |
+
"OVO",
|
1191 |
+
"NINHO",
|
1192 |
+
"PEDRA",
|
1193 |
+
"FOLHA",
|
1194 |
+
"PINCEL",
|
1195 |
+
"DENTE",
|
1196 |
+
"MÃO",
|
1197 |
+
"PÉS",
|
1198 |
+
"OLHO",
|
1199 |
+
"NARIZ",
|
1200 |
+
"ORELHA",
|
1201 |
+
"BOCA",
|
1202 |
+
"CRIANÇA",
|
1203 |
+
"CAPA DE CHUVA",
|
1204 |
+
"ESCADA",
|
1205 |
+
"JANELA",
|
1206 |
+
"MÉDICO",
|
1207 |
+
"ENFERMEIRA",
|
1208 |
+
"PROFESSOR",
|
1209 |
+
"ESTUDANTE",
|
1210 |
+
"LÁPIS",
|
1211 |
+
"MESA",
|
1212 |
+
"CADEIRA",
|
1213 |
+
"LÂMPADA",
|
1214 |
+
"ESPELHO",
|
1215 |
+
"TIGELA",
|
1216 |
+
"PRATO",
|
1217 |
+
"COLHER",
|
1218 |
+
"GARFO",
|
1219 |
+
"FACA",
|
1220 |
+
"COPO",
|
1221 |
+
"CANECA",
|
1222 |
+
"RÉGUA",
|
1223 |
+
"PAPEL",
|
1224 |
+
"CESTA",
|
1225 |
+
"TAPETE",
|
1226 |
+
"SOFÁ",
|
1227 |
+
"TELEVISÃO",
|
1228 |
+
"RÁDIO",
|
1229 |
+
"BATERIA",
|
1230 |
+
"VELA", // duplicado
|
1231 |
+
"CERCA",
|
1232 |
+
"CAIXA DE CORREIO",
|
1233 |
+
"TIJOLO",
|
1234 |
+
"LANTERNA",
|
1235 |
+
"RODA",
|
1236 |
+
"SINO",
|
1237 |
+
"GUARDA-CHUVA",
|
1238 |
+
"CAMINHÃO",
|
1239 |
+
"MOTOCICLETA",
|
1240 |
+
"BICICLETA",
|
1241 |
+
"FOGÃO",
|
1242 |
+
"GELADEIRA",
|
1243 |
+
"MICRO-ONDAS",
|
1244 |
+
"MÁQUINA DE LAVAR",
|
1245 |
+
"SECADORA",
|
1246 |
+
"FORNO",
|
1247 |
+
"VENTILADOR",
|
1248 |
+
"PINCEI", // pincel de pintura
|
1249 |
+
"BALDE",
|
1250 |
+
"ESPONJA",
|
1251 |
+
"SABÃO",
|
1252 |
+
"TOALHA",
|
1253 |
+
"TECIDO",
|
1254 |
+
"TESOURA",
|
1255 |
+
"FITA",
|
1256 |
+
"FITA", // FITA (pode ser “LAÇO” para diferenciar)
|
1257 |
+
"LINHA",
|
1258 |
+
"AGULHA",
|
1259 |
+
"BOTÃO",
|
1260 |
+
"ZÍPER",
|
1261 |
+
"PANTUFA",
|
1262 |
+
"CASACO",
|
1263 |
+
"LUVAS SEM DEDOS",
|
1264 |
+
"CACHECOL",
|
1265 |
+
"LUVAS",
|
1266 |
+
"CALÇAS",
|
1267 |
+
"CAMISA",
|
1268 |
+
"JAQUETA",
|
1269 |
+
"VESTIDO",
|
1270 |
+
"SAIA",
|
1271 |
+
"MEIA",
|
1272 |
+
"BOTA",
|
1273 |
+
"SANDÁLIA",
|
1274 |
+
"CHAPÉU", // duplicado
|
1275 |
+
"BONÉ",
|
1276 |
+
"MÁSCARA",
|
1277 |
+
"RELÓGIO", // duplicado
|
1278 |
+
"COLAR",
|
1279 |
+
"PULSEIRA",
|
1280 |
+
"ANEL",
|
1281 |
+
"BRINCO",
|
1282 |
+
"MOCHILA",
|
1283 |
+
"MALA",
|
1284 |
+
"BILHETE",
|
1285 |
+
"PASSAPORTE",
|
1286 |
+
"MAPA",
|
1287 |
+
"BÚSSOLA",
|
1288 |
+
"TOCHA",
|
1289 |
+
"LANTERNA",
|
1290 |
+
"FOGUEIRA",
|
1291 |
+
"PIQUENIQUE",
|
1292 |
+
"BANCO",
|
1293 |
+
"CERCA", // duplicado
|
1294 |
+
"PORTÃO",
|
1295 |
+
"PLACA",
|
1296 |
+
"SEMAFÓRO",
|
1297 |
+
"CALÇADA",
|
1298 |
+
"LANTERNA", // duplicado
|
1299 |
+
"BALÃO", // duplicado
|
1300 |
+
"CARTÃO POSTAL",
|
1301 |
+
"SELO",
|
1302 |
+
"CARTA",
|
1303 |
+
"ENVELOPE",
|
1304 |
+
"ESTACIONAMENTO",
|
1305 |
+
"RUA",
|
1306 |
+
"RODOVIA",
|
1307 |
+
"PONTE", // duplicado
|
1308 |
+
"TÚNEL",
|
1309 |
+
"ESTÁTUA",
|
1310 |
+
"FONTE",
|
1311 |
+
"TORRE",
|
1312 |
+
"CASTELO",
|
1313 |
+
"PIRÂMIDE",
|
1314 |
+
"PLANETA",
|
1315 |
+
"GALÁXIA",
|
1316 |
+
"SATÉLITE",
|
1317 |
+
"ASTRONAUTA",
|
1318 |
+
"TELESCÓPIO",
|
1319 |
+
"MICROSCÓPIO",
|
1320 |
+
"ÍMÃ",
|
1321 |
+
"BATERIA", // duplicado
|
1322 |
+
"LÂMPADA",
|
1323 |
+
"TOMADA",
|
1324 |
+
"TOMADA", // PLUG (pode ser “PLUGUE,” mas “TOMADA” também é comum)
|
1325 |
+
"CABO",
|
1326 |
+
"INTERRUPTOR",
|
1327 |
+
"CIRCUITO",
|
1328 |
+
"ROBOT",
|
1329 |
+
"COMPUTADOR",
|
1330 |
+
"MOUSE",
|
1331 |
+
"TECLADO",
|
1332 |
+
"TELA",
|
1333 |
+
"IMPRESSORA",
|
1334 |
+
"ALTO-FALANTE",
|
1335 |
+
"FONES DE OUVIDO",
|
1336 |
+
"TELEFONE",
|
1337 |
+
"CÂMERA"
|
1338 |
+
];
|
1339 |
+
|
1340 |
+
|
1341 |
export const getRandomWord = (language: string = 'en') => {
|
1342 |
let wordList;
|
1343 |
switch (language) {
|
|
|
1353 |
case 'es':
|
1354 |
wordList = spanishWords;
|
1355 |
break;
|
1356 |
+
case 'pt':
|
1357 |
+
wordList = portugueseWords;
|
1358 |
+
break;
|
1359 |
default:
|
1360 |
wordList = englishWords;
|
1361 |
}
|
supabase/functions/generate-daily-challenge/index.ts
CHANGED
@@ -8,224 +8,215 @@ const corsHeaders = {
|
|
8 |
};
|
9 |
|
10 |
const wordTranslations: Record<string, Record<string, string>> = {
|
11 |
-
"CAT": { de: "KATZE", fr: "CHAT", it: "GATTO", es: "GATO" },
|
12 |
-
"DOG": { de: "HUND", fr: "CHIEN", it: "CANE", es: "PERRO" },
|
13 |
-
"SUN": { de: "SONNE", fr: "SOLEIL", it: "SOLE", es: "SOL" },
|
14 |
-
"RAIN": { de: "REGEN", fr: "PLUIE", it: "PIOGGIA", es: "LLUVIA" },
|
15 |
-
"TREE": { de: "BAUM", fr: "ARBRE", it: "ALBERO", es: "ÁRBOL" },
|
16 |
-
"STAR": { de: "STERN", fr: "ÉTOILE", it: "STELLA", es: "ESTRELLA" },
|
17 |
-
"MOON": { de: "MOND", fr: "LUNE", it: "LUNA", es: "LUNA" },
|
18 |
-
"FISH": { de: "FISCH", fr: "POISSON", it: "PESCE", es: "PEZ" },
|
19 |
-
"BIRD": { de: "VOGEL", fr: "OISEAU", it: "UCCELLO", es: "PÁJARO" },
|
20 |
-
"CLOUD": { de: "WOLKE", fr: "NUAGE", it: "NUVOLA", es: "NUBE" },
|
21 |
-
"SKY": { de: "HIMMEL", fr: "CIEL", it: "CIELO", es: "CIELO" },
|
22 |
-
"WIND": { de: "WIND", fr: "VENT", it: "VENTO", es: "VIENTO" },
|
23 |
-
"SNOW": { de: "SCHNEE", fr: "NEIGE", it: "NEVE", es: "NIEVE" },
|
24 |
-
"FLOWER": { de: "BLUME", fr: "FLEUR", it: "FIORE", es: "FLOR" },
|
25 |
-
"BUTTERFLY": { de: "SCHMETTERLING", fr: "PAPILLON", it: "FARFALLA", es: "MARIPOSA" },
|
26 |
-
"WATER": { de: "WASSER", fr: "EAU", it: "ACQUA", es: "AGUA" },
|
27 |
-
"OCEAN": { de: "OZEAN", fr: "OCÉAN", it: "OCEANO", es: "OCÉANO" },
|
28 |
-
"RIVER": { de: "FLUSS", fr: "FLEUVE", it: "FIUME", es: "RÍO" },
|
29 |
-
"MOUNTAIN": { de: "BERG", fr: "MONTAGNE", it: "MONTAGNA", es: "MONTAÑA" },
|
30 |
-
"FOREST": { de: "WALD", fr: "FORÊT", it: "FORESTA", es: "BOSQUE" },
|
31 |
-
"HOUSE": { de: "HAUS", fr: "MAISON", it: "CASA", es: "CASA" },
|
32 |
-
"CANDLE": { de: "KERZE", fr: "BOUGIE", it: "CANDELA", es: "VELA" },
|
33 |
-
"GARDEN": { de: "GARTEN", fr: "JARDIN", it: "GIARDINO", es: "JARDÍN" },
|
34 |
-
"BRIDGE": { de: "BRÜCKE", fr: "PONT", it: "PONTE", es: "PUENTE" },
|
35 |
-
"ISLAND": { de: "INSEL", fr: "ÎLE", it: "ISOLA", es: "ISLA" },
|
36 |
-
"BREEZE": { de: "BRISE", fr: "BRISE", it: "BREZZA", es: "BRISA" },
|
37 |
-
"LIGHT": { de: "LICHT", fr: "LUMIÈRE", it: "LUCE", es: "LUZ" },
|
38 |
-
"THUNDER": { de: "DONNER", fr: "TONNERRE", it: "TUONO", es: "TRUENO" },
|
39 |
-
"RAINBOW": { de: "REGENBOGEN", fr: "ARC-EN-CIEL", it: "ARCOBALENO", es: "ARCOÍRIS" },
|
40 |
-
"SMILE": { de: "LÄCHELN", fr: "SOURIRE", it: "SORRISO", es: "SONRISA" },
|
41 |
-
"FRIEND": { de: "FREUND", fr: "AMI", it: "AMICO", es: "AMIGO" },
|
42 |
-
"FAMILY": { de: "FAMILIE", fr: "FAMILLE", it: "FAMIGLIA", es: "FAMILIA" },
|
43 |
-
"APPLE": { de: "APFEL", fr: "POMME", it: "MELA", es: "MANZANA" },
|
44 |
-
"BANANA": { de: "BANANE", fr: "BANANE", it: "BANANA", es: "BANANA" },
|
45 |
-
"CAR": { de: "AUTO", fr: "VOITURE", it: "AUTO", es: "COCHE" },
|
46 |
-
"BOAT": { de: "BOOT", fr: "BATEAU", it: "BARCA", es: "BARCO" },
|
47 |
-
"BALL": { de: "BALL", fr: "BALLE", it: "PALLA", es: "PELOTA" },
|
48 |
-
"CAKE": { de: "KUCHEN", fr: "GÂTEAU", it: "TORTA", es: "PASTEL" },
|
49 |
-
"FROG": { de: "FROSCH", fr: "GRENOUILLE", it: "RANA", es: "RANA" },
|
50 |
-
"HORSE": { de: "PFERD", fr: "CHEVAL", it: "CAVALLO", es: "CABALLO" },
|
51 |
-
"LION": { de: "LÖWE", fr: "LION", it: "LEONE", es: "LEÓN" },
|
52 |
-
"MONKEY": { de: "AFFE", fr: "SINGE", it: "SCIMMIA", es: "MONO" },
|
53 |
-
"PANDA": { de: "PANDA", fr: "PANDA", it: "PANDA", es: "PANDA" },
|
54 |
-
"PLANE": { de: "FLUGZEUG", fr: "AVION", it: "AEREO", es: "AVIÓN" },
|
55 |
-
"TRAIN": { de: "ZUG", fr: "TRAIN", it: "TRENO", es: "TREN" },
|
56 |
-
"CANDY": { de: "SÜSSIGKEIT", fr: "BONBON", it: "CARAMELLA", es: "CARAMELO" },
|
57 |
-
"KITE": { de: "DRACHEN", fr: "CERF-VOLANT", it: "AQUILONE", es: "COMETA" },
|
58 |
-
"BALLOON": { de: "BALLON", fr: "BALLON", it: "PALLONCINO", es: "GLOBO" },
|
59 |
-
"PARK": { de: "PARK", fr: "PARC", it: "PARCO", es: "PARQUE" },
|
60 |
-
"BEACH": { de: "STRAND", fr: "PLAGE", it: "SPIAGGIA", es: "PLAYA" },
|
61 |
-
"TOY": { de: "SPIELZEUG", fr: "JOUET", it: "GIOCATTOLO", es: "JUGUETE" },
|
62 |
-
"BOOK": { de: "BUCH", fr: "LIVRE", it: "LIBRO", es: "LIBRO" },
|
63 |
-
"BUBBLE": { de: "BLASE", fr: "BULLE", it: "BOLLA", es: "BURBUJA" },
|
64 |
-
"SHELL": { de: "MUSCHEL", fr: "COQUILLAGE", it: "CONCHIGLIA", es: "CONCHA" },
|
65 |
-
"PEN": { de: "STIFT", fr: "STYLO", it: "PENNA", es: "BOLÍGRAFO" },
|
66 |
-
"ICE": { de: "EIS", fr: "GLACE", it: "GHIACCIO", es: "HIELO" },
|
67 |
-
"HAT": { de: "HUT", fr: "CHAPEAU", it: "CAPPELLO", es: "SOMBRERO" },
|
68 |
-
"SHOE": { de: "SCHUH", fr: "CHAUSSURE", it: "SCARPA", es: "ZAPATO" },
|
69 |
-
"CLOCK": { de: "UHR", fr: "HORLOGE", it: "OROLOGIO", es: "RELOJ" },
|
70 |
-
"BED": { de: "BETT", fr: "LIT", it: "LETTO", es: "CAMA" },
|
71 |
-
"CUP": { de: "TASSE", fr: "TASSE", it: "Tazza", es: "TazA" },
|
72 |
-
"KEY": { de: "SCHLÜSSEL", fr: "CLÉ", it: "CHIAVE", es: "LLAVE" },
|
73 |
-
"DOOR": { de: "TÜR", fr: "PORTE", it: "PORTA", es: "PUERTA" },
|
74 |
-
"CHICKEN": { de: "HÜHNCHEN", fr: "POULET", it: "POLLO", es: "POLLO" },
|
75 |
-
"DUCK": { de: "ENTE", fr: "CANARD", it: "ANATRA", es: "PATO" },
|
76 |
-
"SHEEP": { de: "SCHAF", fr: "MOUTON", it: "PECORA", es: "OVEJA" },
|
77 |
-
"COW": { de: "KUH", fr: "VACHE", it: "MUCCA", es: "VACA" },
|
78 |
-
"PIG": { de: "SCHWEIN", fr: "COCHON", it: "MAIALE", es: "CERDO" },
|
79 |
-
"GOAT": { de: "ZIEGE", fr: "CHÈVRE", it: "CAPRA", es: "CABRA" },
|
80 |
-
"FOX": { de: "FUCHS", fr: "RENARD", it: "VOLPE", es: "ZORRO" },
|
81 |
-
"BEAR": { de: "BÄR", fr: "OURS", it: "ORSO", es: "OSO" },
|
82 |
-
"DEER": { de: "REH", fr: "CERF", it: "CERVO", es: "CIERVO" },
|
83 |
-
"OWL": { de: "EULE", fr: "HIBOU", it: "GUFO", es: "BÚHO" },
|
84 |
-
"EGG": { de: "EI", fr: "ŒUF", it: "UOVO", es: "HUEVO" },
|
85 |
-
"NEST": { de: "NEST", fr: "NID", it: "NIDO", es: "NIDO" },
|
86 |
-
"ROCK": { de: "STEIN", fr: "ROCHE", it: "ROCCIA", es: "ROCA" },
|
87 |
-
"LEAF": { de: "BLATT", fr: "FEUILLE", it: "FOGLIA", es: "HOJA" },
|
88 |
-
"BRUSH": { de: "PINSEL", fr: "BROSSE", it: "PENNELLO", es: "Pincel" },
|
89 |
-
"TOOTH": { de: "ZAHN", fr: "DENT", it: "DENTE", es: "DIENTE" },
|
90 |
-
"HAND": { de: "HAND", fr: "MAIN", it: "MANO", es: "MANO" },
|
91 |
-
"FEET": { de: "FÜSSE", fr: "PIEDS", it: "PIEDI", es: "PIES" },
|
92 |
-
"EYE": { de: "AUGE", fr: "ŒIL", it: "OCCHIO", es: "OJO" },
|
93 |
-
"NOSE": { de: "NASE", fr: "NEZ", it: "NASO", es: "NARIZ" },
|
94 |
-
"EAR": { de: "OHR", fr: "OREILLE", it: "ORECCHIO", es: "OREJA" },
|
95 |
-
"MOUTH": { de: "MUND", fr: "BOUCHE", it: "BOCCA", es: "BOCA" },
|
96 |
-
"CHILD": { de: "KIND", fr: "ENFANT", it: "BAMBINO", es: "NIÑO" },
|
97 |
-
"RAINCOAT": { de: "REGENMANTEL", fr: "IMPERMÉABLE", it: "IMPERMEABILE", es: "IMPERMEABLE" },
|
98 |
-
"LADDER": { de: "LEITER", fr: "ÉCHELLE", it: "SCALA", es: "ESCALERA" },
|
99 |
-
"WINDOW": { de: "FENSTER", fr: "FENÊTRE", it: "FINESTRA", es: "VENTANA" },
|
100 |
-
"DOCTOR": { de: "ARZT", fr: "MÉDECIN", it: "MEDICO", es: "MÉDICO" },
|
101 |
-
"NURSE": { de: "KRANKENSCHWESTER", fr: "INFIRMIÈRE", it: "INFERMIERA", es: "ENFERMERA" },
|
102 |
-
"TEACHER": { de: "LEHRER", fr: "ENSEIGNANT", it: "INSEGNANTE", es: "MAESTRO" },
|
103 |
-
"STUDENT": { de: "STUDENT", fr: "ÉTUDIANT", it: "STUDENTE", es: "ESTUDIANTE" },
|
104 |
-
"PENCIL": { de: "BLEISTIFT", fr: "CRAYON", it: "MATITA", es: "LÁPIZ" },
|
105 |
-
"TABLE": { de: "TISCH", fr: "TABLE", it: "Tavolo", es: "MESA" },
|
106 |
-
"CHAIR": { de: "STUHL", fr: "CHAISE", it: "SEDIA", es: "SILLA" },
|
107 |
-
"LAMP": { de: "LAMPE", fr: "LAMPE", it: "LAMPADA", es: "LÁMPARA" },
|
108 |
-
"MIRROR": { de: "SPIEGEL", fr: "MIROIR", it: "SPECCHIO", es: "ESPEJO" },
|
109 |
-
"BOWL": { de: "SCHÜSSEL", fr: "BOL", it: "CIOTOLA", es: "CUENCO" },
|
110 |
-
"PLATE": { de: "TELLER", fr: "ASSIETTE", it: "PIATTO", es: "PLATO" },
|
111 |
-
"SPOON": { de: "LÖFFEL", fr: "CUILLÈRE", it: "CUCCHIAIO", es: "CUCHARA" },
|
112 |
-
"FORK": { de: "GABEL", fr: "FOURCHETTE", it: "FORCHETTA", es: "TENEDOR" },
|
113 |
-
"KNIFE": { de: "MESSER", fr: "COUTEAU", it: "COLTELLO", es: "CUCHILLO" },
|
114 |
-
"GLASS": { de: "GLAS", fr: "VERRE", it: "BICCHIERE", es: "VASO" },
|
115 |
-
"STRAW": { de: "STROHHALM", fr: "PAILLE", it: "CANNUCCIA", es: "PAJITA" },
|
116 |
-
"RULER": { de: "LINEAL", fr: "RÈGLE", it: "RIGHELLO", es: "REGLA" },
|
117 |
-
"PAPER": { de: "PAPIER", fr: "PAPIER", it: "CARTA", es: "PAPEL" },
|
118 |
-
"BASKET": { de: "KORB", fr: "PANIER", it: "CESTINO", es: "CESTA" },
|
119 |
-
"CARPET": { de: "TEPPICH", fr: "TAPIS", it: "TAPPETO", es: "ALFOMBRA" },
|
120 |
-
"SOFA": { de: "SOFA", fr: "CANAPÉ", it: "DIVANO", es: "SOFÁ" },
|
121 |
-
"TELEVISION": { de: "FERNSEHER", fr: "TÉLÉVISION", it: "TELEVISIONE", es: "TELEVISIÓN" },
|
122 |
-
"RADIO": { de: "RADIO", fr: "RADIO", it: "RADIO", es: "RADIO" },
|
123 |
-
"BATTERY": { de: "BATTERIE", fr: "PILE", it: "BATTERIA", es: "BATERÍA" },
|
124 |
-
"FENCE": { de: "ZAUN", fr: "CLÔTURE", it: "RECINTO", es: "VALLA" },
|
125 |
-
"MAILBOX": { de: "BRIEFKASTEN", fr: "BOÎTE AUX LETTRES", it: "CASSETTA POSTALE", es: "BUZÓN" },
|
126 |
-
"BRICK": { de: "BACKSTEIN", fr: "BRIQUE", it: "MATTONE", es: "LADRILLO" },
|
127 |
-
"LANTERN": { de: "LATERNE", fr: "LANTERNE", it: "LANTERNA", es: "FAROL" },
|
128 |
-
"WHEEL": { de: "RAD", fr: "ROUE", it: "RUOTA", es: "RUEDA" },
|
129 |
-
"BELL": { de: "GLOCKE", fr: "CLoche", it: "CAMPANA", es: "CAMPANA" },
|
130 |
-
"UMBRELLA": { de: "REGENSCHIRM", fr: "PARAPLUIE", it: "OMBRELLO", es: "PARAGUAS" },
|
131 |
-
"TRUCK": { de: "LASTWAGEN", fr: "CAMION", it: "CAMION", es: "CAMIÓN" },
|
132 |
-
"MOTORCYCLE": { de: "MOTORRAD", fr: "MOTO", it: "MOTOCICLETTA", es: "MOTOCICLETA" },
|
133 |
-
"BICYCLE": { de: "FAHRRAD", fr: "VÉLO", it: "BICICLETTA", es: "BICICLETA" },
|
134 |
-
"STOVE": { de: "HERD", fr: "CUISINIÈRE", it: "FORNELLO", es: "ESTUFA" },
|
135 |
-
"REFRIGERATOR": { de: "KÜHLSCHRANK", fr: "RÉFRIGÉRATEUR", it: "FRIGORIFERO", es: "REFRIGERADOR" },
|
136 |
-
"MICROWAVE": { de: "MIKROWELLE", fr: "MICRO-ONDES", it: "MICROONDE", es: "MICROONDAS" },
|
137 |
-
"WASHER": { de: "WASCHMASCHINE", fr: "LAVE-LINGE", it: "LAVATRICE", es: "LAVADORA" },
|
138 |
-
"DRYER": { de: "TROCKNER", fr: "SÈCHE-LINGE", it: "ASCUGATRICE", es: "SECADORA" },
|
139 |
-
"FURNACE": { de: "OFEN", fr: "FOURNAISE", it: "FORNACE", es: "HORNO" },
|
140 |
-
"FAN": { de: "VENTILATOR", fr: "VENTILATEUR", it: "VENTILATORE", es: "VENTILADOR" },
|
141 |
-
"PAINTBRUSH": { de: "PINSEL", fr: "PINCEAU", it: "PENNELLO", es: "Pincel" },
|
142 |
-
"BUCKET": { de: "EIMER", fr: "SEAU", it: "SECCHIO", es: "CUBO" },
|
143 |
-
"SPONGE": { de: "SCHWAMM", fr: "ÉPONGE", it: "SPUGNA", es: "ESPONJA" },
|
144 |
-
"SOAP": { de: "SEIFE", fr: "SAVON", it: "SAPONE", es: "JABÓN" },
|
145 |
-
"TOWEL": { de: "HANDTUCH", fr: "SERVIETTE", it: "ASCIUGAMANO", es: "TOALLA" },
|
146 |
-
"CLOTH": { de: "STOFF", fr: "TISSU", it: "STOFFA", es: "TELA" },
|
147 |
-
"SCISSORS": { de: "SCHERE", fr: "CISEAUX", it: "FORBICI", es: "TIJERAS" },
|
148 |
-
|
149 |
-
"
|
150 |
-
"
|
151 |
-
"
|
152 |
-
"
|
153 |
-
|
154 |
-
"
|
155 |
-
"
|
156 |
-
"
|
157 |
-
"
|
158 |
-
"
|
159 |
-
"
|
160 |
-
"
|
161 |
-
"
|
162 |
-
"
|
163 |
-
"
|
164 |
-
"
|
165 |
-
"
|
166 |
-
"
|
167 |
-
"
|
168 |
-
"
|
169 |
-
|
170 |
-
"
|
171 |
-
"
|
172 |
-
"
|
173 |
-
"
|
174 |
-
|
175 |
-
"
|
176 |
-
"
|
177 |
-
"
|
178 |
-
"
|
179 |
-
"
|
180 |
-
"
|
181 |
-
"
|
182 |
-
|
183 |
-
"
|
184 |
-
"
|
185 |
-
|
186 |
-
"
|
187 |
-
"
|
188 |
-
"
|
189 |
-
"
|
190 |
-
|
191 |
-
|
192 |
-
"
|
193 |
-
"
|
194 |
-
"
|
195 |
-
"
|
196 |
-
"
|
197 |
-
"
|
198 |
-
"
|
199 |
-
"
|
200 |
-
"
|
201 |
-
"
|
202 |
-
"
|
203 |
-
"
|
204 |
-
"
|
205 |
-
"
|
206 |
-
"
|
207 |
-
"
|
208 |
-
"
|
209 |
-
"
|
210 |
-
"
|
211 |
-
"
|
212 |
-
"
|
213 |
-
"
|
214 |
-
"
|
215 |
-
"
|
216 |
-
"
|
217 |
-
"
|
218 |
-
"
|
219 |
-
"
|
220 |
-
"COMPUTER": { de: "COMPUTER", fr: "ORDINATEUR", it: "COMPUTER", es: "ORDENADOR" },
|
221 |
-
"MOUSE": { de: "MAUS", fr: "SOURIS", it: "MOUSE", es: "RATÓN" },
|
222 |
-
"KEYBOARD": { de: "TASTATUR", fr: "CLAVIER", it: "TASTIERA", es: "TECLADO" },
|
223 |
-
"SCREEN": { de: "BILDSCHIRM", fr: "ÉCRAN", it: "SCHERMO", es: "PANTALLA" },
|
224 |
-
"PRINTER": { de: "DRUCKER", fr: "IMPRIMANTE", it: "STAMPANTE", es: "IMPRESORA" },
|
225 |
-
"SPEAKER": { de: "LAUTSPRECHER", fr: "HAUT-PARLEUR", it: "ALTOPARLANTE", es: "ALTAVOZ" },
|
226 |
-
"HEADPHONE": { de: "KOPFHÖRER", fr: "CASQUE", it: "CUFFIE", es: "AURICULARES" },
|
227 |
-
"PHONE": { de: "TELEFON", fr: "TÉLÉPHONE", it: "TELEFONO", es: "TELÉFONO" },
|
228 |
-
// "CAMERA": { de: "KAMERA", fr: "APPAREIL PHOTO", it: "FOTOCAMERA", es: "CÁMARA" },
|
229 |
};
|
230 |
|
231 |
// Helper function to translate a word to target language
|
@@ -245,15 +236,11 @@ function generateTranslatedWords(englishWords: string[], targetLang: string): st
|
|
245 |
|
246 |
function generateEnglishRandomWords(count: number): string[] {
|
247 |
const words: string[] = [];
|
248 |
-
|
249 |
const englishWords = Object.keys(wordTranslations);
|
250 |
-
|
251 |
-
// Create a copy of the word list to avoid duplicates
|
252 |
const availableWords = [...englishWords];
|
253 |
|
254 |
for (let i = 0; i < count; i++) {
|
255 |
if (availableWords.length === 0) {
|
256 |
-
// If we run out of unique words, reset the available words
|
257 |
availableWords.push(...englishWords);
|
258 |
}
|
259 |
const randomIndex = Math.floor(Math.random() * availableWords.length);
|
@@ -282,10 +269,18 @@ serve(async (req) => {
|
|
282 |
try {
|
283 |
console.log('Starting daily challenge generation...');
|
284 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
285 |
// Initialize Supabase client
|
286 |
-
const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
|
287 |
-
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
|
288 |
const supabase = createClient(supabaseUrl, supabaseKey);
|
|
|
289 |
|
290 |
// Deactivate current active challenges
|
291 |
console.log('Deactivating current active challenges...');
|
@@ -301,7 +296,7 @@ serve(async (req) => {
|
|
301 |
|
302 |
// Generate one set of English words
|
303 |
const selectedEnglishWords = generateEnglishRandomWords(10);
|
304 |
-
const languages = ['en', 'de', 'fr', 'it', 'es'];
|
305 |
const challenges: Challenge[] = [];
|
306 |
|
307 |
for (const language of languages) {
|
|
|
8 |
};
|
9 |
|
10 |
const wordTranslations: Record<string, Record<string, string>> = {
|
11 |
+
"CAT": { de: "KATZE", fr: "CHAT", it: "GATTO", es: "GATO", pt: "GATO" },
|
12 |
+
"DOG": { de: "HUND", fr: "CHIEN", it: "CANE", es: "PERRO", pt: "CÃO" },
|
13 |
+
"SUN": { de: "SONNE", fr: "SOLEIL", it: "SOLE", es: "SOL", pt: "SOL" },
|
14 |
+
"RAIN": { de: "REGEN", fr: "PLUIE", it: "PIOGGIA", es: "LLUVIA", pt: "CHUVA" },
|
15 |
+
"TREE": { de: "BAUM", fr: "ARBRE", it: "ALBERO", es: "ÁRBOL", pt: "ÁRVORE" },
|
16 |
+
"STAR": { de: "STERN", fr: "ÉTOILE", it: "STELLA", es: "ESTRELLA", pt: "ESTRELA" },
|
17 |
+
"MOON": { de: "MOND", fr: "LUNE", it: "LUNA", es: "LUNA", pt: "LUA" },
|
18 |
+
"FISH": { de: "FISCH", fr: "POISSON", it: "PESCE", es: "PEZ", pt: "PEIXE" },
|
19 |
+
"BIRD": { de: "VOGEL", fr: "OISEAU", it: "UCCELLO", es: "PÁJARO", pt: "PÁSSARO" },
|
20 |
+
"CLOUD": { de: "WOLKE", fr: "NUAGE", it: "NUVOLA", es: "NUBE", pt: "NUVEM" },
|
21 |
+
"SKY": { de: "HIMMEL", fr: "CIEL", it: "CIELO", es: "CIELO", pt: "CÉU" },
|
22 |
+
"WIND": { de: "WIND", fr: "VENT", it: "VENTO", es: "VIENTO", pt: "VENTO" },
|
23 |
+
"SNOW": { de: "SCHNEE", fr: "NEIGE", it: "NEVE", es: "NIEVE", pt: "NEVE" },
|
24 |
+
"FLOWER": { de: "BLUME", fr: "FLEUR", it: "FIORE", es: "FLOR", pt: "FLOR" },
|
25 |
+
"BUTTERFLY": { de: "SCHMETTERLING", fr: "PAPILLON", it: "FARFALLA", es: "MARIPOSA", pt: "BORBOLETA" },
|
26 |
+
"WATER": { de: "WASSER", fr: "EAU", it: "ACQUA", es: "AGUA", pt: "ÁGUA" },
|
27 |
+
"OCEAN": { de: "OZEAN", fr: "OCÉAN", it: "OCEANO", es: "OCÉANO", pt: "OCEANO" },
|
28 |
+
"RIVER": { de: "FLUSS", fr: "FLEUVE", it: "FIUME", es: "RÍO", pt: "RIO" },
|
29 |
+
"MOUNTAIN": { de: "BERG", fr: "MONTAGNE", it: "MONTAGNA", es: "MONTAÑA", pt: "MONTANHA" },
|
30 |
+
"FOREST": { de: "WALD", fr: "FORÊT", it: "FORESTA", es: "BOSQUE", pt: "FLORESTA" },
|
31 |
+
"HOUSE": { de: "HAUS", fr: "MAISON", it: "CASA", es: "CASA", pt: "CASA" },
|
32 |
+
"CANDLE": { de: "KERZE", fr: "BOUGIE", it: "CANDELA", es: "VELA", pt: "VELA" },
|
33 |
+
"GARDEN": { de: "GARTEN", fr: "JARDIN", it: "GIARDINO", es: "JARDÍN", pt: "JARDIM" },
|
34 |
+
"BRIDGE": { de: "BRÜCKE", fr: "PONT", it: "PONTE", es: "PUENTE", pt: "PONTE" },
|
35 |
+
"ISLAND": { de: "INSEL", fr: "ÎLE", it: "ISOLA", es: "ISLA", pt: "ILHA" },
|
36 |
+
"BREEZE": { de: "BRISE", fr: "BRISE", it: "BREZZA", es: "BRISA", pt: "BRISA" },
|
37 |
+
"LIGHT": { de: "LICHT", fr: "LUMIÈRE", it: "LUCE", es: "LUZ", pt: "LUZ" },
|
38 |
+
"THUNDER": { de: "DONNER", fr: "TONNERRE", it: "TUONO", es: "TRUENO", pt: "TROVÃO" },
|
39 |
+
"RAINBOW": { de: "REGENBOGEN", fr: "ARC-EN-CIEL", it: "ARCOBALENO", es: "ARCOÍRIS", pt: "ARCO-ÍRIS" },
|
40 |
+
"SMILE": { de: "LÄCHELN", fr: "SOURIRE", it: "SORRISO", es: "SONRISA", pt: "SORRISO" },
|
41 |
+
"FRIEND": { de: "FREUND", fr: "AMI", it: "AMICO", es: "AMIGO", pt: "AMIGO" },
|
42 |
+
"FAMILY": { de: "FAMILIE", fr: "FAMILLE", it: "FAMIGLIA", es: "FAMILIA", pt: "FAMÍLIA" },
|
43 |
+
"APPLE": { de: "APFEL", fr: "POMME", it: "MELA", es: "MANZANA", pt: "MAÇÃ" },
|
44 |
+
"BANANA": { de: "BANANE", fr: "BANANE", it: "BANANA", es: "BANANA", pt: "BANANA" },
|
45 |
+
"CAR": { de: "AUTO", fr: "VOITURE", it: "AUTO", es: "COCHE", pt: "CARRO" },
|
46 |
+
"BOAT": { de: "BOOT", fr: "BATEAU", it: "BARCA", es: "BARCO", pt: "BARCO" },
|
47 |
+
"BALL": { de: "BALL", fr: "BALLE", it: "PALLA", es: "PELOTA", pt: "BOLA" },
|
48 |
+
"CAKE": { de: "KUCHEN", fr: "GÂTEAU", it: "TORTA", es: "PASTEL", pt: "BOLO" },
|
49 |
+
"FROG": { de: "FROSCH", fr: "GRENOUILLE", it: "RANA", es: "RANA", pt: "SAPO" },
|
50 |
+
"HORSE": { de: "PFERD", fr: "CHEVAL", it: "CAVALLO", es: "CABALLO", pt: "CAVALO" },
|
51 |
+
"LION": { de: "LÖWE", fr: "LION", it: "LEONE", es: "LEÓN", pt: "LEÃO" },
|
52 |
+
"MONKEY": { de: "AFFE", fr: "SINGE", it: "SCIMMIA", es: "MONO", pt: "MACACO" },
|
53 |
+
"PANDA": { de: "PANDA", fr: "PANDA", it: "PANDA", es: "PANDA", pt: "PANDA" },
|
54 |
+
"PLANE": { de: "FLUGZEUG", fr: "AVION", it: "AEREO", es: "AVIÓN", pt: "AVIÃO" },
|
55 |
+
"TRAIN": { de: "ZUG", fr: "TRAIN", it: "TRENO", es: "TREN", pt: "TREM" },
|
56 |
+
"CANDY": { de: "SÜSSIGKEIT", fr: "BONBON", it: "CARAMELLA", es: "CARAMELO", pt: "DOCE" },
|
57 |
+
"KITE": { de: "DRACHEN", fr: "CERF-VOLANT", it: "AQUILONE", es: "COMETA", pt: "PIPA" },
|
58 |
+
"BALLOON": { de: "BALLON", fr: "BALLON", it: "PALLONCINO", es: "GLOBO", pt: "BALÃO" },
|
59 |
+
"PARK": { de: "PARK", fr: "PARC", it: "PARCO", es: "PARQUE", pt: "PARQUE" },
|
60 |
+
"BEACH": { de: "STRAND", fr: "PLAGE", it: "SPIAGGIA", es: "PLAYA", pt: "PRAIA" },
|
61 |
+
"TOY": { de: "SPIELZEUG", fr: "JOUET", it: "GIOCATTOLO", es: "JUGUETE", pt: "BRINQUEDO" },
|
62 |
+
"BOOK": { de: "BUCH", fr: "LIVRE", it: "LIBRO", es: "LIBRO", pt: "LIVRO" },
|
63 |
+
"BUBBLE": { de: "BLASE", fr: "BULLE", it: "BOLLA", es: "BURBUJA", pt: "BOLHA" },
|
64 |
+
"SHELL": { de: "MUSCHEL", fr: "COQUILLAGE", it: "CONCHIGLIA", es: "CONCHA", pt: "CONCHA" },
|
65 |
+
"PEN": { de: "STIFT", fr: "STYLO", it: "PENNA", es: "BOLÍGRAFO", pt: "CANETA" },
|
66 |
+
"ICE": { de: "EIS", fr: "GLACE", it: "GHIACCIO", es: "HIELO", pt: "GELO" },
|
67 |
+
"HAT": { de: "HUT", fr: "CHAPEAU", it: "CAPPELLO", es: "SOMBRERO", pt: "CHAPÉU" },
|
68 |
+
"SHOE": { de: "SCHUH", fr: "CHAUSSURE", it: "SCARPA", es: "ZAPATO", pt: "SAPATO" },
|
69 |
+
"CLOCK": { de: "UHR", fr: "HORLOGE", it: "OROLOGIO", es: "RELOJ", pt: "RELÓGIO" },
|
70 |
+
"BED": { de: "BETT", fr: "LIT", it: "LETTO", es: "CAMA", pt: "CAMA" },
|
71 |
+
"CUP": { de: "TASSE", fr: "TASSE", it: "Tazza", es: "TazA", pt: "XÍCARA" },
|
72 |
+
"KEY": { de: "SCHLÜSSEL", fr: "CLÉ", it: "CHIAVE", es: "LLAVE", pt: "CHAVE" },
|
73 |
+
"DOOR": { de: "TÜR", fr: "PORTE", it: "PORTA", es: "PUERTA", pt: "PORTA" },
|
74 |
+
"CHICKEN": { de: "HÜHNCHEN", fr: "POULET", it: "POLLO", es: "POLLO", pt: "FRANGO" },
|
75 |
+
"DUCK": { de: "ENTE", fr: "CANARD", it: "ANATRA", es: "PATO", pt: "PATO" },
|
76 |
+
"SHEEP": { de: "SCHAF", fr: "MOUTON", it: "PECORA", es: "OVEJA", pt: "OVELHA" },
|
77 |
+
"COW": { de: "KUH", fr: "VACHE", it: "MUCCA", es: "VACA", pt: "VACA" },
|
78 |
+
"PIG": { de: "SCHWEIN", fr: "COCHON", it: "MAIALE", es: "CERDO", pt: "PORCO" },
|
79 |
+
"GOAT": { de: "ZIEGE", fr: "CHÈVRE", it: "CAPRA", es: "CABRA", pt: "CABRA" },
|
80 |
+
"FOX": { de: "FUCHS", fr: "RENARD", it: "VOLPE", es: "ZORRO", pt: "RAPOSA" },
|
81 |
+
"BEAR": { de: "BÄR", fr: "OURS", it: "ORSO", es: "OSO", pt: "URSO" },
|
82 |
+
"DEER": { de: "REH", fr: "CERF", it: "CERVO", es: "CIERVO", pt: "VEADO" },
|
83 |
+
"OWL": { de: "EULE", fr: "HIBOU", it: "GUFO", es: "BÚHO", pt: "CORUJA" },
|
84 |
+
"EGG": { de: "EI", fr: "ŒUF", it: "UOVO", es: "HUEVO", pt: "OVO" },
|
85 |
+
"NEST": { de: "NEST", fr: "NID", it: "NIDO", es: "NIDO", pt: "NINHO" },
|
86 |
+
"ROCK": { de: "STEIN", fr: "ROCHE", it: "ROCCIA", es: "ROCA", pt: "PEDRA" },
|
87 |
+
"LEAF": { de: "BLATT", fr: "FEUILLE", it: "FOGLIA", es: "HOJA", pt: "FOLHA" },
|
88 |
+
"BRUSH": { de: "PINSEL", fr: "BROSSE", it: "PENNELLO", es: "Pincel", pt: "Pincel" },
|
89 |
+
"TOOTH": { de: "ZAHN", fr: "DENT", it: "DENTE", es: "DIENTE", pt: "DENTE" },
|
90 |
+
"HAND": { de: "HAND", fr: "MAIN", it: "MANO", es: "MANO", pt: "MÃO" },
|
91 |
+
"FEET": { de: "FÜSSE", fr: "PIEDS", it: "PIEDI", es: "PIES", pt: "PÉS" },
|
92 |
+
"EYE": { de: "AUGE", fr: "ŒIL", it: "OCCHIO", es: "OJO", pt: "OLHO" },
|
93 |
+
"NOSE": { de: "NASE", fr: "NEZ", it: "NASO", es: "NARIZ", pt: "NARIZ" },
|
94 |
+
"EAR": { de: "OHR", fr: "OREILLE", it: "ORECCHIO", es: "OREJA", pt: "ORELHA" },
|
95 |
+
"MOUTH": { de: "MUND", fr: "BOUCHE", it: "BOCCA", es: "BOCA", pt: "BOCA" },
|
96 |
+
"CHILD": { de: "KIND", fr: "ENFANT", it: "BAMBINO", es: "NIÑO", pt: "CRIANÇA" },
|
97 |
+
"RAINCOAT": { de: "REGENMANTEL", fr: "IMPERMÉABLE", it: "IMPERMEABILE", es: "IMPERMEABLE", pt: "IMPERMEÁVEL" },
|
98 |
+
"LADDER": { de: "LEITER", fr: "ÉCHELLE", it: "SCALA", es: "ESCALERA", pt: "ESCADA" },
|
99 |
+
"WINDOW": { de: "FENSTER", fr: "FENÊTRE", it: "FINESTRA", es: "VENTANA", pt: "JANELA" },
|
100 |
+
"DOCTOR": { de: "ARZT", fr: "MÉDECIN", it: "MEDICO", es: "MÉDICO", pt: "MÉDICO" },
|
101 |
+
"NURSE": { de: "KRANKENSCHWESTER", fr: "INFIRMIÈRE", it: "INFERMIERA", es: "ENFERMERA", pt: "ENFERMEIRA" },
|
102 |
+
"TEACHER": { de: "LEHRER", fr: "ENSEIGNANT", it: "INSEGNANTE", es: "MAESTRO", pt: "PROFESSOR" },
|
103 |
+
"STUDENT": { de: "STUDENT", fr: "ÉTUDIANT", it: "STUDENTE", es: "ESTUDIANTE", pt: "ESTUDANTE" },
|
104 |
+
"PENCIL": { de: "BLEISTIFT", fr: "CRAYON", it: "MATITA", es: "LÁPIZ", pt: "LÁPIS" },
|
105 |
+
"TABLE": { de: "TISCH", fr: "TABLE", it: "Tavolo", es: "MESA", pt: "MESA" },
|
106 |
+
"CHAIR": { de: "STUHL", fr: "CHAISE", it: "SEDIA", es: "SILLA", pt: "CADEIRA" },
|
107 |
+
"LAMP": { de: "LAMPE", fr: "LAMPE", it: "LAMPADA", es: "LÁMPARA", pt: "LÂMPADA" },
|
108 |
+
"MIRROR": { de: "SPIEGEL", fr: "MIROIR", it: "SPECCHIO", es: "ESPEJO", pt: "ESPELHO" },
|
109 |
+
"BOWL": { de: "SCHÜSSEL", fr: "BOL", it: "CIOTOLA", es: "CUENCO", pt: "TIGELA" },
|
110 |
+
"PLATE": { de: "TELLER", fr: "ASSIETTE", it: "PIATTO", es: "PLATO", pt: "PRATO" },
|
111 |
+
"SPOON": { de: "LÖFFEL", fr: "CUILLÈRE", it: "CUCCHIAIO", es: "CUCHARA", pt: "COLHER" },
|
112 |
+
"FORK": { de: "GABEL", fr: "FOURCHETTE", it: "FORCHETTA", es: "TENEDOR", pt: "GARFO" },
|
113 |
+
"KNIFE": { de: "MESSER", fr: "COUTEAU", it: "COLTELLO", es: "CUCHILLO", pt: "FACA" },
|
114 |
+
"GLASS": { de: "GLAS", fr: "VERRE", it: "BICCHIERE", es: "VASO", pt: "COPO" },
|
115 |
+
"STRAW": { de: "STROHHALM", fr: "PAILLE", it: "CANNUCCIA", es: "PAJITA", pt: "CANUDO" },
|
116 |
+
"RULER": { de: "LINEAL", fr: "RÈGLE", it: "RIGHELLO", es: "REGLA", pt: "RÉGUA" },
|
117 |
+
"PAPER": { de: "PAPIER", fr: "PAPIER", it: "CARTA", es: "PAPEL", pt: "PAPEL" },
|
118 |
+
"BASKET": { de: "KORB", fr: "PANIER", it: "CESTINO", es: "CESTA", pt: "CESTA" },
|
119 |
+
"CARPET": { de: "TEPPICH", fr: "TAPIS", it: "TAPPETO", es: "ALFOMBRA", pt: "TAPETE" },
|
120 |
+
"SOFA": { de: "SOFA", fr: "CANAPÉ", it: "DIVANO", es: "SOFÁ", pt: "SOFÁ" },
|
121 |
+
"TELEVISION": { de: "FERNSEHER", fr: "TÉLÉVISION", it: "TELEVISIONE", es: "TELEVISIÓN", pt: "TELEVISÃO" },
|
122 |
+
"RADIO": { de: "RADIO", fr: "RADIO", it: "RADIO", es: "RADIO", pt: "RÁDIO" },
|
123 |
+
"BATTERY": { de: "BATTERIE", fr: "PILE", it: "BATTERIA", es: "BATERÍA", pt: "BATERIA" },
|
124 |
+
"FENCE": { de: "ZAUN", fr: "CLÔTURE", it: "RECINTO", es: "VALLA", pt: "CERCA" },
|
125 |
+
"MAILBOX": { de: "BRIEFKASTEN", fr: "BOÎTE AUX LETTRES", it: "CASSETTA POSTALE", es: "BUZÓN", pt: "CAIXA DE CORREIO" },
|
126 |
+
"BRICK": { de: "BACKSTEIN", fr: "BRIQUE", it: "MATTONE", es: "LADRILLO", pt: "Tijolo" },
|
127 |
+
"LANTERN": { de: "LATERNE", fr: "LANTERNE", it: "LANTERNA", es: "FAROL", pt: "LANTERNA" },
|
128 |
+
"WHEEL": { de: "RAD", fr: "ROUE", it: "RUOTA", es: "RUEDA", pt: "RODA" },
|
129 |
+
"BELL": { de: "GLOCKE", fr: "CLoche", it: "CAMPANA", es: "CAMPANA", pt: "SINO" },
|
130 |
+
"UMBRELLA": { de: "REGENSCHIRM", fr: "PARAPLUIE", it: "OMBRELLO", es: "PARAGUAS", pt: "GUARDA-CHUVA" },
|
131 |
+
"TRUCK": { de: "LASTWAGEN", fr: "CAMION", it: "CAMION", es: "CAMIÓN", pt: "CAMINHÃO" },
|
132 |
+
"MOTORCYCLE": { de: "MOTORRAD", fr: "MOTO", it: "MOTOCICLETTA", es: "MOTOCICLETA", pt: "MOTOCICLETA" },
|
133 |
+
"BICYCLE": { de: "FAHRRAD", fr: "VÉLO", it: "BICICLETTA", es: "BICICLETA", pt: "BICICLETA" },
|
134 |
+
"STOVE": { de: "HERD", fr: "CUISINIÈRE", it: "FORNELLO", es: "ESTUFA", pt: "FOGÃO" },
|
135 |
+
"REFRIGERATOR": { de: "KÜHLSCHRANK", fr: "RÉFRIGÉRATEUR", it: "FRIGORIFERO", es: "REFRIGERADOR", pt: "GELADEIRA" },
|
136 |
+
"MICROWAVE": { de: "MIKROWELLE", fr: "MICRO-ONDES", it: "MICROONDE", es: "MICROONDAS", pt: "MICRO-ONDAS" },
|
137 |
+
"WASHER": { de: "WASCHMASCHINE", fr: "LAVE-LINGE", it: "LAVATRICE", es: "LAVADORA", pt: "MÁQUINA DE LAVAR" },
|
138 |
+
"DRYER": { de: "TROCKNER", fr: "SÈCHE-LINGE", it: "ASCUGATRICE", es: "SECADORA", pt: "SECADORA" },
|
139 |
+
"FURNACE": { de: "OFEN", fr: "FOURNAISE", it: "FORNACE", es: "HORNO", pt: "FORNALHA" },
|
140 |
+
"FAN": { de: "VENTILATOR", fr: "VENTILATEUR", it: "VENTILATORE", es: "VENTILADOR", pt: "VENTILADOR" },
|
141 |
+
"PAINTBRUSH": { de: "PINSEL", fr: "PINCEAU", it: "PENNELLO", es: "Pincel", pt: "Pincel" },
|
142 |
+
"BUCKET": { de: "EIMER", fr: "SEAU", it: "SECCHIO", es: "CUBO", pt: "BALDE" },
|
143 |
+
"SPONGE": { de: "SCHWAMM", fr: "ÉPONGE", it: "SPUGNA", es: "ESPONJA", pt: "ESPONJA" },
|
144 |
+
"SOAP": { de: "SEIFE", fr: "SAVON", it: "SAPONE", es: "JABÓN", pt: "SABÃO" },
|
145 |
+
"TOWEL": { de: "HANDTUCH", fr: "SERVIETTE", it: "ASCIUGAMANO", es: "TOALLA", pt: "TOALHA" },
|
146 |
+
"CLOTH": { de: "STOFF", fr: "TISSU", it: "STOFFA", es: "TELA", pt: "TECIDO" },
|
147 |
+
"SCISSORS": { de: "SCHERE", fr: "CISEAUX", it: "FORBICI", es: "TIJERAS", pt: "TESOURA" },
|
148 |
+
"RIBBON": { de: "BAND", fr: "RUBAN", it: "NASTRO", es: "CINTA", pt: "FITA" },
|
149 |
+
"THREAD": { de: "FADEN", fr: "FIL", it: "FILO", es: "HILO", pt: "LINHA" },
|
150 |
+
"NEEDLE": { de: "NADEL", fr: "AIGUILLE", it: "AGO", es: "AGUJA", pt: "AGULHA" },
|
151 |
+
"BUTTON": { de: "KNOPF", fr: "BOUTON", it: "BOTTONE", es: "BOTÓN", pt: "BOTÃO" },
|
152 |
+
"SLIPPER": { de: "HAUSSCHUH", fr: "PANTOUFLE", it: "PANTOFOLE", es: "PANTUFLA", pt: "PANTOFO" },
|
153 |
+
"COAT": { de: "MANTEL", fr: "MANTEAU", it: "CAPPOTTO", es: "ABRIGO", pt: "CASACO" },
|
154 |
+
"MITTEN": { de: "FAUSTHANDSCHUH", fr: "MOUFLE", it: "GUANTO", es: "MANOPLA", pt: "LUVA" },
|
155 |
+
"SCARF": { de: "SCHAL", fr: "ÉCHARPE", it: "SCIARPA", es: "BUFANDA", pt: "CACHECOL" },
|
156 |
+
"GLOVE": { de: "HANDSCHUH", fr: "GANT", it: "GUANTO", es: "GUANTE", pt: "LUVA" },
|
157 |
+
"PANTS": { de: "HOSE", fr: "PANTALON", it: "PANTALONI", es: "PANTALONES", pt: "CALÇAS" },
|
158 |
+
"SHIRT": { de: "HEMD", fr: "CHEMISE", it: "CAMICIA", es: "CAMISA", pt: "CAMISA" },
|
159 |
+
"JACKET": { de: "JACKE", fr: "VESTE", it: "GIACCA", es: "CHAQUETA", pt: "JAQUETA" },
|
160 |
+
"DRESS": { de: "KLEID", fr: "ROBE", it: "VESTITO", es: "VESTIDO", pt: "VESTIDO" },
|
161 |
+
"SKIRT": { de: "ROCK", fr: "JUPE", it: "GONNA", es: "FALDA", pt: "SAIA" },
|
162 |
+
"SOCK": { de: "SOCKE", fr: "CHAUSSETTE", it: "CALZINO", es: "CALCETÍN", pt: "MEIA" },
|
163 |
+
"BOOT": { de: "STIEFEL", fr: "BOTTE", it: "STIVALE", es: "BOTA", pt: "BOTA" },
|
164 |
+
"SANDAL": { de: "SANDALE", fr: "SANDALE", it: "SANDALO", es: "SANDALIA", pt: "SANDÁLIA" },
|
165 |
+
"CAP": { de: "MÜTZE", fr: "CASQUETTE", it: "BERRETTO", es: "GORRA", pt: "BONÉ" },
|
166 |
+
"MASK": { de: "MASKE", fr: "MASQUE", it: "MASCHERA", es: "MÁSCARA", pt: "MÁSCARA" },
|
167 |
+
"WATCH": { de: "UHR", fr: "MONTRE", it: "OROLOGIO", es: "RELOJ", pt: "RELÓGIO" },
|
168 |
+
"NECKLACE": { de: "HALSKETTE", fr: "COLLER", it: "COLLANA", es: "COLLAR", pt: "COLAR" },
|
169 |
+
"BRACELET": { de: "ARMBAND", fr: "BRACELET", it: "BRACCIALE", es: "PULSERA", pt: "PULSEIRA" },
|
170 |
+
"RING": { de: "RING", fr: "BAGUE", it: "ANELLO", es: "ANILLO", pt: "ANEL" },
|
171 |
+
"BACKPACK": { de: "RUCKSACK", fr: "SAC À DOS", it: "ZAINO", es: "MOCHILA", pt: "MOCHILA" },
|
172 |
+
"SUITCASE": { de: "KOFFER", fr: "VALISE", it: "VALIGIA", es: "MALETA", pt: "MALA" },
|
173 |
+
"TICKET": { de: "TICKET", fr: "BILLET", it: "BIGLIETTO", es: "BILLETE", pt: "BILHETE" },
|
174 |
+
"PASSPORT": { de: "REISEPASS", fr: "PASSEPORT", it: "PASSAPORTO", es: "PASAPORTE", pt: "PASSAPORTE" },
|
175 |
+
"MAP": { de: "KARTE", fr: "CARTE", it: "MAPP", es: "MAPA", pt: "MAPA" },
|
176 |
+
"COMPASS": { de: "KOMPASS", fr: "BOUSSOLE", it: "BUSSOLA", es: "BRÚJULA", pt: "BÚSSOLA" },
|
177 |
+
"TORCH": { de: "FACKEL", fr: "TORCHE", it: "TORCIA", es: "ANTORCHA", pt: "TOCHA" },
|
178 |
+
"CAMPFIRE": { de: "LAGERFEUER", fr: "FEU DE CAMP", it: "FALÒ", es: "FOGATA", pt: "FOGUEIRA" },
|
179 |
+
"TENT": { de: "ZELT", fr: "TENTE", it: "TENDA", es: "TIENDA DE CAMPAÑA", pt: "BARRACA" },
|
180 |
+
"PICNIC": { de: "PICKNICK", fr: "PIQUE-NIQUE", it: "PICNIC", es: "PICNIC", pt: "PIQUENIQUE" },
|
181 |
+
"BENCH": { de: "BANK", fr: "BANC", it: "PANCHINA", es: "BANCO", pt: "BANCO" },
|
182 |
+
"GATE": { de: "TOR", fr: "PORTAIL", it: "CANCELLO", es: "PORTÓN", pt: "PORTÃO" },
|
183 |
+
"SIGN": { de: "SCHILD", fr: "PANNEAU", it: "SEGNALE", es: "SEÑAL", pt: "PLACA" },
|
184 |
+
"SIDEWALK": { de: "BÜRGERSTEIG", fr: "TROTTOIR", it: "MARCIAPIEDE", es: "ACERA", pt: "CALÇADA" },
|
185 |
+
"POSTCARD": { de: "POSTKARTE", fr: "CARTE POSTALE", it: "CARTOLINA", es: "POSTAL", pt: "CARTÃO-POSTAL" },
|
186 |
+
"STAMP": { de: "BRIEFMARKE", fr: "TIMBRE", it: "FRANCOBOLLO", es: "SELLO", pt: "SELO" },
|
187 |
+
"LETTER": { de: "BRIEF", fr: "LETTRE", it: "LETTERA", es: "CARTA", pt: "CARTA" },
|
188 |
+
"ENVELOPE": { de: "UMSCHLAG", fr: "ENVELOPPE", it: "BUSTA", es: "SOBRE", pt: "ENVELOPE" },
|
189 |
+
"PARKING": { de: "PARKPLATZ", fr: "PARKING", it: "PARCHEGGIO", es: "ESTACIONAMIENTO", pt: "ESTACIONAMENTO" },
|
190 |
+
"STREET": { de: "STRAßE", fr: "RUE", it: "STRADA", es: "CALLE", pt: "RUA" },
|
191 |
+
"HIGHWAY": { de: "AUTOBAHN", fr: "AUTOROUTE", it: "AUTOSTRADA", es: "AUTOPISTA", pt: "AUTOESTRADA" },
|
192 |
+
"TUNNEL": { de: "TUNNEL", fr: "TUNNEL", it: "GALLERIA", es: "TÚNEL", pt: "TÚNEL" },
|
193 |
+
"STATUE": { de: "STATUE", fr: "STATUE", it: "STATUA", es: "ESTATUA", pt: "ESTÁTUA" },
|
194 |
+
"FOUNTAIN": { de: "BRUNNEN", fr: "FONTAINE", it: "FONTANA", es: "FUENTE", pt: "FONTE" },
|
195 |
+
"TOWER": { de: "TURM", fr: "TOUR", it: "TORRE", es: "TORRE", pt: "TORRE" },
|
196 |
+
"CASTLE": { de: "SCHLOSS", fr: "CHÂTEAU", it: "CASTELLO", es: "CASTILLO", pt: "CASTELO" },
|
197 |
+
"PYRAMID": { de: "PYRAMIDE", fr: "PYRAMIDE", it: "PIRAMIDE", es: "PIRÁMIDE", pt: "PIRÂMIDE" },
|
198 |
+
"PLANET": { de: "PLANET", fr: "PLANÈTE", it: "PIANETA", es: "PLANETA", pt: "PLANETA" },
|
199 |
+
"GALAXY": { de: "GALAXIE", fr: "GALAXIE", it: "GALASSIA", es: "GALAXIA", pt: "GALÁXIA" },
|
200 |
+
"SATELLITE": { de: "SATELLIT", fr: "SATELLITE", it: "SATELLITE", es: "SATÉLITE", pt: "SATÉLITE" },
|
201 |
+
"ASTRONAUT": { de: "ASTRONAUT", fr: "ASTRONAUTE", it: "ASTRONAUTA", es: "ASTRONAUTA", pt: "ASTRONAUTA" },
|
202 |
+
"TELESCOPE": { de: "TELESCOP", fr: "TÉLESCOPE", it: "TELESCOPIO", es: "TELESCOPIO", pt: "TELESCÓPIO" },
|
203 |
+
"MICROSCOPE": { de: "MIKROSKOP", fr: "MICROSCOPE", it: "MICROSCOPIO", es: "MICROSCOPIO", pt: "MICROSCÓPIO" },
|
204 |
+
"MAGNET": { de: "MAGNET", fr: "AIMANT", it: "MAGNETE", es: "IMÁN", pt: "ÍMAN" },
|
205 |
+
"BULB": { de: "GLÜHBIRNE", fr: "AMPOULE", it: "LAMPADINA", es: "BOMBILLA", pt: "LÂMPADA" },
|
206 |
+
"SOCKET": { de: "STECKDOSE", fr: "PRISE", it: "PRESA", es: "ENCHUFE", pt: "TOMADA" },
|
207 |
+
"PLUG": { de: "STECKER", fr: "FICHE", it: "SPINA", es: "CLAVIJA", pt: "PLUGUE" },
|
208 |
+
"WIRE": { de: "DRAHT", fr: "FIL", it: "FILO", es: "CABLE", pt: "FIO" },
|
209 |
+
"SWITCH": { de: "SCHALTER", fr: "INTERRUPTEUR", it: "INTERRUTTORE", es: "INTERRUPTOR", pt: "INTERRUPTOR" },
|
210 |
+
"CIRCUIT": { de: "SCHALTUNG", fr: "CIRCUIT", it: "CIRCUITO", es: "CIRCUITO", pt: "CIRCUITO" },
|
211 |
+
"ROBOT": { de: "ROBOTER", fr: "ROBOT", it: "ROBOT", es: "ROBOT", pt: "ROBÔ" },
|
212 |
+
"COMPUTER": { de: "COMPUTER", fr: "ORDINATEUR", it: "COMPUTER", es: "ORDENADOR", pt: "COMPUTADOR" },
|
213 |
+
"MOUSE": { de: "MAUS", fr: "SOURIS", it: "MOUSE", es: "RATÓN", pt: "MOUSE" },
|
214 |
+
"KEYBOARD": { de: "TASTATUR", fr: "CLAVIER", it: "TASTIERA", es: "TECLADO", pt: "TECLADO" },
|
215 |
+
"SCREEN": { de: "BILDSCHIRM", fr: "ÉCRAN", it: "SCHERMO", es: "PANTALLA", pt: "TELA" },
|
216 |
+
"PRINTER": { de: "DRUCKER", fr: "IMPRIMANTE", it: "STAMPANTE", es: "IMPRESORA", pt: "IMPRESSORA" },
|
217 |
+
"SPEAKER": { de: "LAUTSPRECHER", fr: "HAUT-PARLEUR", it: "ALTOPARLANTE", es: "ALTAVOZ", pt: "ALTO-FALANTE" },
|
218 |
+
"HEADPHONE": { de: "KOPFHÖRER", fr: "CASQUE", it: "CUFFIE", es: "AURICULARES", pt: "FONES DE OUVIDO" },
|
219 |
+
"PHONE": { de: "TELEFON", fr: "TÉLÉPHONE", it: "TELEFONO", es: "TELÉFONO", pt: "TELEFONE" }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
220 |
};
|
221 |
|
222 |
// Helper function to translate a word to target language
|
|
|
236 |
|
237 |
function generateEnglishRandomWords(count: number): string[] {
|
238 |
const words: string[] = [];
|
|
|
239 |
const englishWords = Object.keys(wordTranslations);
|
|
|
|
|
240 |
const availableWords = [...englishWords];
|
241 |
|
242 |
for (let i = 0; i < count; i++) {
|
243 |
if (availableWords.length === 0) {
|
|
|
244 |
availableWords.push(...englishWords);
|
245 |
}
|
246 |
const randomIndex = Math.floor(Math.random() * availableWords.length);
|
|
|
269 |
try {
|
270 |
console.log('Starting daily challenge generation...');
|
271 |
|
272 |
+
// Get environment variables
|
273 |
+
const supabaseUrl = Deno.env.get('SUPABASE_URL');
|
274 |
+
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY');
|
275 |
+
|
276 |
+
// Validate environment variables
|
277 |
+
if (!supabaseUrl || !supabaseKey) {
|
278 |
+
throw new Error('Missing required environment variables: SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY');
|
279 |
+
}
|
280 |
+
|
281 |
// Initialize Supabase client
|
|
|
|
|
282 |
const supabase = createClient(supabaseUrl, supabaseKey);
|
283 |
+
console.log('Supabase client initialized');
|
284 |
|
285 |
// Deactivate current active challenges
|
286 |
console.log('Deactivating current active challenges...');
|
|
|
296 |
|
297 |
// Generate one set of English words
|
298 |
const selectedEnglishWords = generateEnglishRandomWords(10);
|
299 |
+
const languages = ['en', 'de', 'fr', 'it', 'es', 'pt'];
|
300 |
const challenges: Challenge[] = [];
|
301 |
|
302 |
for (const language of languages) {
|
supabase/functions/generate-themed-word/index.ts
CHANGED
@@ -27,6 +27,10 @@ const languagePrompts = {
|
|
27 |
es: {
|
28 |
systemPrompt: "Estás ayudando a generar palabras para un juego de adivinanzas. Genera una sola palabra en español relacionada con el tema",
|
29 |
requirements: "La palabra debe ser:\n- Una sola palabra (sin espacios ni guiones)\n- Lo suficientemente común para que la gente la conozca\n- Lo suficientemente específica para ser interesante\n- Relacionada con el tema\n- Entre 4 y 12 letras\n- Un sustantivo\n- NO ser ninguna de estas palabras ya utilizadas:"
|
|
|
|
|
|
|
|
|
30 |
}
|
31 |
};
|
32 |
|
@@ -104,7 +108,7 @@ async function tryOpenRouter(theme: string, usedWords: string[], language: strin
|
|
104 |
}
|
105 |
|
106 |
const data = await response.json();
|
107 |
-
|
108 |
if (!data?.choices?.[0]?.message?.content) {
|
109 |
throw new Error('Invalid response from OpenRouter API');
|
110 |
}
|
@@ -131,7 +135,7 @@ serve(async (req) => {
|
|
131 |
} catch (mistralError) {
|
132 |
console.error('Mistral error:', mistralError);
|
133 |
console.log('Falling back to OpenRouter...');
|
134 |
-
|
135 |
try {
|
136 |
word = await tryOpenRouter(theme, usedWords, language);
|
137 |
console.log('Successfully generated word with OpenRouter:', word);
|
@@ -143,11 +147,11 @@ serve(async (req) => {
|
|
143 |
|
144 |
if (!word) {
|
145 |
return new Response(
|
146 |
-
JSON.stringify({
|
147 |
error: 'Failed to generate word with both Mistral and OpenRouter',
|
148 |
details: error?.message || 'Unknown error'
|
149 |
}),
|
150 |
-
{
|
151 |
status: 500,
|
152 |
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
153 |
}
|
@@ -161,11 +165,11 @@ serve(async (req) => {
|
|
161 |
} catch (error) {
|
162 |
console.error('Error generating themed word:', error);
|
163 |
return new Response(
|
164 |
-
JSON.stringify({
|
165 |
error: 'Error generating themed word',
|
166 |
-
details: error.message
|
167 |
}),
|
168 |
-
{
|
169 |
status: 500,
|
170 |
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
171 |
}
|
|
|
27 |
es: {
|
28 |
systemPrompt: "Estás ayudando a generar palabras para un juego de adivinanzas. Genera una sola palabra en español relacionada con el tema",
|
29 |
requirements: "La palabra debe ser:\n- Una sola palabra (sin espacios ni guiones)\n- Lo suficientemente común para que la gente la conozca\n- Lo suficientemente específica para ser interesante\n- Relacionada con el tema\n- Entre 4 y 12 letras\n- Un sustantivo\n- NO ser ninguna de estas palabras ya utilizadas:"
|
30 |
+
},
|
31 |
+
pt: {
|
32 |
+
systemPrompt: "Estás ajudando a gerar palavras para um jogo de adivinhação. Gere uma única palavra em português relacionada ao tema",
|
33 |
+
requirements: "A palavra deve ser:\n- Uma única palavra (sem espaços ou hífens)\n- Comum o suficiente para que as pessoas a conheçam\n- Específica o suficiente para ser interessante\n- Relacionada ao tema\n- Entre 4 e 12 letras\n- Um substantivo\n- NÃO ser nenhuma destas palavras já utilizadas:"
|
34 |
}
|
35 |
};
|
36 |
|
|
|
108 |
}
|
109 |
|
110 |
const data = await response.json();
|
111 |
+
|
112 |
if (!data?.choices?.[0]?.message?.content) {
|
113 |
throw new Error('Invalid response from OpenRouter API');
|
114 |
}
|
|
|
135 |
} catch (mistralError) {
|
136 |
console.error('Mistral error:', mistralError);
|
137 |
console.log('Falling back to OpenRouter...');
|
138 |
+
|
139 |
try {
|
140 |
word = await tryOpenRouter(theme, usedWords, language);
|
141 |
console.log('Successfully generated word with OpenRouter:', word);
|
|
|
147 |
|
148 |
if (!word) {
|
149 |
return new Response(
|
150 |
+
JSON.stringify({
|
151 |
error: 'Failed to generate word with both Mistral and OpenRouter',
|
152 |
details: error?.message || 'Unknown error'
|
153 |
}),
|
154 |
+
{
|
155 |
status: 500,
|
156 |
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
157 |
}
|
|
|
165 |
} catch (error) {
|
166 |
console.error('Error generating themed word:', error);
|
167 |
return new Response(
|
168 |
+
JSON.stringify({
|
169 |
error: 'Error generating themed word',
|
170 |
+
details: error.message
|
171 |
}),
|
172 |
+
{
|
173 |
status: 500,
|
174 |
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
175 |
}
|
supabase/functions/generate-word/index.ts
CHANGED
@@ -36,6 +36,12 @@ const languagePrompts = {
|
|
36 |
task: "Tu tarea es encontrar una frase para describir esta palabra sin usarla directamente.",
|
37 |
instruction: "Responde con una frase completa y gramaticalmente correcta que comience con",
|
38 |
noQuotes: "No añadas comillas ni backticks. Simplemente responde con la frase."
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
}
|
40 |
};
|
41 |
|
|
|
36 |
task: "Tu tarea es encontrar una frase para describir esta palabra sin usarla directamente.",
|
37 |
instruction: "Responde con una frase completa y gramaticalmente correcta que comience con",
|
38 |
noQuotes: "No añadas comillas ni backticks. Simplemente responde con la frase."
|
39 |
+
},
|
40 |
+
pt: {
|
41 |
+
systemPrompt: "Você está ajudando em um jogo de palavras. A palavra secreta é",
|
42 |
+
task: "Sua tarefa é encontrar uma frase para descrever esta palavra sem usá-la diretamente.",
|
43 |
+
instruction: "Responda com uma frase completa e gramaticalmente correta que comece com",
|
44 |
+
noQuotes: "Não adicione aspas nem backticks. Simplesmente responda com a frase."
|
45 |
}
|
46 |
};
|
47 |
|
supabase/functions/guess-word/index.ts
CHANGED
@@ -31,6 +31,11 @@ const languagePrompts = {
|
|
31 |
systemPrompt: "Estás ayudando en un juego de adivinanzas. Dada una descripción, adivina qué palabra única se está describiendo. La palabra descrita no estaba permitida en la descripción, así que no esperes verla.",
|
32 |
instruction: "Basándote en esta descripción",
|
33 |
responseInstruction: "Responde únicamente con la palabra que crees que se está describiendo, en letras mayúsculas. No añadas ninguna explicación ni puntuación."
|
|
|
|
|
|
|
|
|
|
|
34 |
}
|
35 |
};
|
36 |
|
|
|
31 |
systemPrompt: "Estás ayudando en un juego de adivinanzas. Dada una descripción, adivina qué palabra única se está describiendo. La palabra descrita no estaba permitida en la descripción, así que no esperes verla.",
|
32 |
instruction: "Basándote en esta descripción",
|
33 |
responseInstruction: "Responde únicamente con la palabra que crees que se está describiendo, en letras mayúsculas. No añadas ninguna explicación ni puntuación."
|
34 |
+
},
|
35 |
+
pt: {
|
36 |
+
systemPromp: "Estás ajudando em um jogo de adivinhação. Dada uma descrição, adivinha qual palavra única está sendo descrita. A palavra descrita não foi permitida na descrição, então não espere vê-la.",
|
37 |
+
instruction: "Com base nesta descrição",
|
38 |
+
responseInstruction: "Responda apenas com a palavra que você acredita estar sendo descrita, em letras maiúsculas. Não adicione nenhuma explicação nem pontuação."
|
39 |
}
|
40 |
};
|
41 |
|