Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🎉 happy birthday LibreChat #1768

Merged
merged 5 commits into from
Feb 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ DOMAIN_SERVER=http://localhost:3080

NO_INDEX=true

SHOW_BIRTHDAY_ICON=true

#===============#
# Debug Logging #
#===============#
Expand Down
9 changes: 9 additions & 0 deletions api/server/routes/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ const emailLoginEnabled =
process.env.ALLOW_EMAIL_LOGIN === undefined || isEnabled(process.env.ALLOW_EMAIL_LOGIN);

router.get('/', async function (req, res) {
const isBirthday = () => {
const today = new Date();
return today.getMonth() === 1 && today.getDate() === 11;
};

try {
const payload = {
appTitle: process.env.APP_TITLE || 'LibreChat',
Expand All @@ -33,6 +38,10 @@ router.get('/', async function (req, res) {
!!process.env.EMAIL_PASSWORD &&
!!process.env.EMAIL_FROM,
checkBalance: isEnabled(process.env.CHECK_BALANCE),
showBirthdayIcon:
isBirthday() ||
isEnabled(process.env.SHOW_BIRTHDAY_ICON) ||
process.env.SHOW_BIRTHDAY_ICON === '',
};

if (typeof process.env.CUSTOM_FOOTER === 'string') {
Expand Down
55 changes: 35 additions & 20 deletions client/src/components/Chat/Landing.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import type { ReactNode } from 'react';
import { useGetEndpointsQuery } from 'librechat-data-provider/react-query';
import { useGetEndpointsQuery, useGetStartupConfig } from 'librechat-data-provider/react-query';
import { EModelEndpoint } from 'librechat-data-provider';
import { icons } from './Menus/Endpoints/Icons';
import { useChatContext } from '~/Providers';
import { getEndpointField } from '~/utils';
import { useLocalize } from '~/hooks';
import { BirthdayIcon } from '~/components/svg';
import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '~/components/ui/';

export default function Landing({ Header }: { Header?: ReactNode }) {
const { conversation } = useChatContext();
const { data: endpointsConfig } = useGetEndpointsQuery();
const { data: startupConfig } = useGetStartupConfig();

const localize = useLocalize();
let { endpoint } = conversation ?? {};
Expand All @@ -27,26 +30,38 @@ export default function Landing({ Header }: { Header?: ReactNode }) {
const Icon = icons[iconKey];

return (
<div className="relative h-full">
<div className="absolute left-0 right-0">{Header && Header}</div>
<div className="flex h-full flex-col items-center justify-center">
<div className="mb-3 h-[72px] w-[72px]">
<div className="gizmo-shadow-stroke relative flex h-full items-center justify-center rounded-full bg-white text-black">
{endpoint &&
Icon &&
Icon({
size: 41,
context: 'landing',
className: 'h-2/3 w-2/3',
endpoint: endpoint,
iconURL: iconURL,
})}
<TooltipProvider delayDuration={50}>
<Tooltip>
<div className="relative h-full">
<div className="absolute left-0 right-0">{Header && Header}</div>
<div className="flex h-full flex-col items-center justify-center">
<div className="relative mb-3 h-[72px] w-[72px]">
<div className="gizmo-shadow-stroke relative flex h-full items-center justify-center rounded-full bg-white text-black">
{endpoint &&
Icon &&
Icon({
size: 41,
context: 'landing',
className: 'h-2/3 w-2/3',
endpoint: endpoint,
iconURL: iconURL,
})}
<TooltipTrigger>
{(startupConfig?.showBirthdayIcon ?? false) && (
<BirthdayIcon className="absolute bottom-12 right-5" />
)}
</TooltipTrigger>
<TooltipContent side="top" sideOffset={85} className="left-[-20%]">
{localize('com_ui_happy_birthday')}
</TooltipContent>
</div>
</div>
<div className="mb-5 text-2xl font-medium dark:text-white">
{localize('com_nav_welcome_message')}
</div>
</div>
</div>
<div className="mb-5 text-2xl font-medium dark:text-white">
{localize('com_nav_welcome_message')}
</div>
</div>
</div>
</Tooltip>
</TooltipProvider>
);
}
64 changes: 64 additions & 0 deletions client/src/components/svg/BirthdayIcon.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import React from 'react';
import { cn } from '~/utils/';

export default function BirthdayIcon({ className = '' }) {
return (
<svg
version="1.1"
viewBox="0 0 233.33 290"
xmlns="http://www.w3.org/2000/svg"
xmlnsXlink="http://www.w3.org/1999/xlink"
className={cn('h-14 w-14', className)}
>
<defs>
<linearGradient
id="linearGradient1842"
x1="163.92"
x2="173.66"
y1="22.212"
y2="-6.5784"
gradientTransform="translate(.10391 .050143)"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#640a62" offset="0" />
<stop stopColor="#852283" offset=".49917" />
<stop stopColor="#640a62" offset="1" />
</linearGradient>
</defs>
<g>
<path
transform="matrix(.43416 .90084 -.89966 .4366 0 0)"
d="m259.29-126.03a232.2 237.56 0 0 1-17.412 231.34l-193.32-131.59z"
fill="url(#linearGradient1842)"
/>
<path
transform="matrix(.6967 .051926 -.051926 .6967 35.578 23.196)"
d="m50.818 31.415c-1.4654 2.4749-10.838 2.4195-12.997 4.3204-2.1584 1.9009-3.288 11.206-5.9282 12.347-2.6402 1.1409-10.191-4.4132-13.054-4.1441-2.8636 0.26917-9.2466 7.133-12.053 6.5041-2.8066-0.62889-5.6503-9.5602-8.1252-11.026-2.4749-1.4654-11.673 0.33572-13.574-1.8227s1.0482-11.056-0.0927-13.696c-1.1409-2.6402-9.6412-6.5898-9.9104-9.4533-0.26917-2.8636 7.3463-8.328 7.9752-11.135 0.62889-2.8066-3.9265-10.998-2.4612-13.473 1.4654-2.4749 10.838-2.4195 12.997-4.3204 2.1584-1.9009 3.288-11.206 5.9282-12.347 2.6402-1.1409 10.191 4.4132 13.054 4.1441 2.8636-0.26917 9.2466-7.133 12.053-6.5041 2.8066 0.62889 5.6503 9.5602 8.1252 11.026s11.673-0.33572 13.574 1.8227c1.9009 2.1584-1.0482 11.056 0.0927 13.696 1.1409 2.6402 9.6412 6.5898 9.9104 9.4533 0.26917 2.8635-7.3463 8.328-7.9752 11.135-0.62889 2.8066 3.9265 10.998 2.4612 13.473z"
fill="#ff9d78"
stroke="#f29472"
strokeWidth="4.7877"
/>
<circle cx="170.36" cy="215.76" r="12.903" fill="#cfffff" />
<path
d="m220.77 174.77c-88.526 101.03-191.21 85.731-209.5 82.142-2.2101-2e-5 -2.6686 0.42426-3.437 2.0021l-1.7042 7.5028c0.056197 2.3603 0.37544 2.6428 1.9121 3.5409 18.396 3.3746 130.27 19.488 223.46-86.881 0.64011-1.5095 0.46653-3.1324-0.59137-4.7337l-5.1558-3.6482c-1.586-0.8743-3.9524-0.94332-4.9837 0.0751z"
color="#000000"
fill="#ff9d78"
stroke="#f29472"
strokeLinejoin="round"
strokeWidth="2.8913"
/>
<g fill="#cfffff">
<circle cx="72.684" cy="99.47" r="12.903" />
<circle cx="99.144" cy="172.32" r="12.903" />
<circle cx="59.617" cy="214.78" r="12.903" />
<circle cx="135.4" cy="118.42" r="12.903" />
<path
transform="rotate(38.66)"
d="m254.21-1.9608a12.903 12.903 0 0 1-6.4852 11.194 12.903 12.903 0 0 1-12.937-0.0582 12.903 12.903 0 0 1-6.3843-11.252l12.903 0.1161z"
/>
<path d="m29.476 158.16a12.903 12.903 0 0 0-3.6562 0.5293l-3.3691 23.189a12.903 12.903 0 0 0 7.0254 2.0879 12.903 12.903 0 0 0 12.904-12.904 12.903 12.903 0 0 0-12.904-12.902z" />
</g>
</g>
</svg>
);
}
1 change: 1 addition & 0 deletions client/src/components/svg/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ export { default as UserIcon } from './UserIcon';
export { default as NewChatIcon } from './NewChatIcon';
export { default as ExperimentIcon } from './ExperimentIcon';
export { default as GoogleIconChat } from './GoogleIconChat';
export { default as BirthdayIcon } from './BirthdayIcon';
1 change: 1 addition & 0 deletions client/src/localization/languages/Ar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
export default {
com_ui_balance: 'الرصيد',
com_ui_examples: 'أمثلة',
com_ui_happy_birthday: 'إنه عيد ميلادي الأول!',
com_ui_new_chat: 'دردشة جديدة',
com_ui_example_quantum_computing: 'شرح الحوسبة الكمومية ببساطة',
com_ui_example_10_year_old_b_day: 'هل لديك أفكار إبداعية لعيد ميلاد طفل عمره 10 سنوات؟',
Expand Down
1 change: 1 addition & 0 deletions client/src/localization/languages/Br.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
export default {
com_ui_examples: 'Exemplos',
com_ui_new_chat: 'Novo Chat',
com_ui_happy_birthday: 'É meu primeiro aniversário!',
com_ui_example_quantum_computing: 'Explique a computação quântica em termos simples',
com_ui_example_10_year_old_b_day:
'Tem alguma ideia criativa para o aniversário de uma criança de 10 anos?',
Expand Down
61 changes: 39 additions & 22 deletions client/src/localization/languages/De.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
export default {
com_ui_examples: 'Beispiele',
com_ui_new_chat: 'Neuer Chat',
com_ui_happy_birthday: 'Es ist mein erster Geburtstag!',
com_ui_example_quantum_computing: 'Erkläre Quantencomputing in einfachen Worten',
com_ui_example_10_year_old_b_day: 'Hast du eine kreative Idee für den Geburtstag eines 10-Jährigen?',
com_ui_example_10_year_old_b_day:
'Hast du eine kreative Idee für den Geburtstag eines 10-Jährigen?',
com_ui_example_http_in_js: 'Wie stelle ich eine HTTP-Anfrage in Javascript?',
com_ui_capabilities: 'Funktionen',
com_ui_capability_remember: 'Erinnert sich daran, was der Benutzer zu einem früheren Zeitpunkt in der Konversation gesagt hat',
com_ui_capability_remember:
'Erinnert sich daran, was der Benutzer zu einem früheren Zeitpunkt in der Konversation gesagt hat',
com_ui_capability_correction: 'Ermöglicht es dem Benutzer, nachträgliche Korrekturen vorzunehmen',
com_ui_capability_decline_requests: 'Ermöglicht es, unangemessene Anfragen abzulehnen',
com_ui_limitations: 'Beschränkungen',
Expand All @@ -29,13 +32,15 @@ export default {
com_ui_showing: 'Zeigen',
com_ui_of: 'von',
com_ui_entries: 'Einträge',
com_ui_pay_per_call: 'Alle KI-Chats an einem Ort. Bezahle pro API-Abruf nutzungsbasiert und nicht pro Monat',
com_ui_pay_per_call:
'Alle KI-Chats an einem Ort. Bezahle pro API-Abruf nutzungsbasiert und nicht pro Monat',
com_ui_new_footer: 'Alle KI-Chats an einem Ort.',
com_ui_enter: 'Eingabe',
com_ui_submit: 'Abschicken',
com_ui_upload_success: 'Erfolgreich hochgeladene Datei',
com_ui_upload_error: 'Beim Hochladen deiner Datei ist ein Fehler aufgetreten',
com_ui_upload_invalid: 'Ungültige Datei zum Hochladen. Muss ein Bild sein, das nicht größer als 2 MB ist',
com_ui_upload_invalid:
'Ungültige Datei zum Hochladen. Muss ein Bild sein, das nicht größer als 2 MB ist',
com_ui_cancel: 'Abbrechen',
com_ui_save: 'Speichern',
com_ui_save_submit: 'Speichern & Absenden',
Expand Down Expand Up @@ -121,10 +126,10 @@ export default {
com_endpoint_bing_to_enable_sydney: 'Um Sydney zu aktivieren',
com_endpoint_bing_jailbreak: 'Jailbreak',
com_endpoint_bing_context_placeholder:
'Bing kann bis zu 7k Token für \'context\' verwenden, auf die es in der Konversation Bezug nehmen kann. Der genaue Grenzwert ist nicht bekannt, aber mehr als 7k Token können zu Fehlern führen.',
com_endpoint_bing_system_message_placeholder:
'WARNUNG: Der Missbrauch dieser Funktion kann dazu führen, dass Ihnen die Nutzung von Bing untersagt wird! Klicken Sie auf \'Systemnachricht\', um vollständige Anweisungen und die Standardnachricht zu erhalten, d.h. die als sicher geltende Voreinstellung \'Sydney\'.',
com_endpoint_system_message: 'System Nachricht',
'Bing kann bis zu 7k Token für \'context\' verwenden, auf die es in der Konversation Bezug nehmen kann. Der genaue Grenzwert ist nicht bekannt, aber mehr als 7k Token können zu Fehlern führen.',
com_endpoint_bing_system_message_placeholder:
'WARNUNG: Der Missbrauch dieser Funktion kann dazu führen, dass Ihnen die Nutzung von Bing untersagt wird! Klicken Sie auf \'Systemnachricht\', um vollständige Anweisungen und die Standardnachricht zu erhalten, d.h. die als sicher geltende Voreinstellung \'Sydney\'.',
com_endpoint_system_message: 'System Nachricht',
com_endpoint_message: 'Nachricht an',
com_endpoint_message_not_appendable: 'Bearbeite deine Nachricht oder generiere sie neu.',
com_endpoint_default_blank: 'Standard: leer',
Expand All @@ -145,7 +150,8 @@ com_endpoint_system_message: 'System Nachricht',
com_endpoint_google_maxoutputtokens:
' Maximale Anzahl von Token, die in der Antwort erzeugt werden können. Gib einen niedrigeren Wert für kürzere Antworten und einen höheren Wert für längere Antworten an.',
com_endpoint_google_custom_name_placeholder: 'Setze einen benutzerdefinierten Namen für Google',
com_endpoint_prompt_prefix_placeholder: 'Setze benutzerdefinierte Anweisungen oder Kontext. Ignoriert, wenn leer.',
com_endpoint_prompt_prefix_placeholder:
'Setze benutzerdefinierte Anweisungen oder Kontext. Ignoriert, wenn leer.',
com_endpoint_custom_name: 'Benutzerdefinierter Name',
com_endpoint_prompt_prefix: 'Benutzerdefinierte Anweisungen',
com_endpoint_temperature: 'Temperatur (Kreativität)',
Expand Down Expand Up @@ -190,13 +196,18 @@ com_endpoint_system_message: 'System Nachricht',
com_endpoint_plug_set_custom_instructions_for_gpt_placeholder:
'Setzt benutzerdefinierte Anweisungen, die in die System Nachricht aufgenommen werden. Standardmäßig: keine',
com_endpoint_import: 'Importieren',
com_endpoint_set_custom_name: 'Lege einen benutzerdefinierten Namen fest, für den Fall, dass du diese Vorgabe finden kannst',
com_endpoint_set_custom_name:
'Lege einen benutzerdefinierten Namen fest, für den Fall, dass du diese Vorgabe finden kannst',
com_endpoint_preset_delete_confirm: 'Bist du sicher, dass du diese Vorgabe löschen willst?',
com_endpoint_preset_clear_all_confirm: "Bist du sicher, dass du alle deine Voreinstellungen löschen willst?",
com_endpoint_preset_clear_all_confirm:
'Bist du sicher, dass du alle deine Voreinstellungen löschen willst?',
com_endpoint_preset_import: 'Voreinstellung importiert!',
com_endpoint_preset_import_error: 'Beim Import deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es erneut.',
com_endpoint_preset_save_error: 'Es ist ein Fehler beim Speichern deiner Voreinstellung aufgetreten. Bitte versuche es noch einmal.',
com_endpoint_preset_delete_error: 'Beim Löschen deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.',
com_endpoint_preset_import_error:
'Beim Import deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es erneut.',
com_endpoint_preset_save_error:
'Es ist ein Fehler beim Speichern deiner Voreinstellung aufgetreten. Bitte versuche es noch einmal.',
com_endpoint_preset_delete_error:
'Beim Löschen deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.',
com_endpoint_preset_default_removed: 'ist nicht mehr die Standardeinstellung.',
com_endpoint_preset_default_item: 'Standard:',
com_endpoint_preset_default_none: 'Keine Standardeinstellung aktiv.',
Expand All @@ -222,7 +233,8 @@ com_endpoint_system_message: 'System Nachricht',
com_endpoint_presets_clear_warning:
'Bist du sicher, dass du alle Voreinstellungen löschen willst? Dies ist nicht umkehrbar.',
com_endpoint_not_implemented: 'Nicht implementiert',
com_endpoint_no_presets: 'Es gibt noch keine Voreinstellungen, verwende die Schaltfläche "Einstellungen", um eine Vorlage zu erstellen.',
com_endpoint_no_presets:
'Es gibt noch keine Voreinstellungen, verwende die Schaltfläche "Einstellungen", um eine Vorlage zu erstellen.',
com_endpoint_not_available: 'Kein Endpunkt verfügbar',
com_endpoint_view_options: 'Ansichtsoptionen',
com_endpoint_save_convo_as_preset: 'Konversation als Voreinstellung speichern',
Expand All @@ -244,18 +256,23 @@ com_endpoint_system_message: 'System Nachricht',
com_endpoint_config_google_service_key: 'Google Service Account Key',
com_endpoint_config_google_cloud_platform: '(von Google Cloud Platform)',
com_endpoint_config_google_api_key: 'Google API Key',
com_endpoint_config_google_gemini_api: "(Gemini API)",
com_endpoint_config_google_api_info: 'Um deinen Generative Language API-Schlüssel (für Gemini) zu erhalten,',
com_endpoint_config_google_gemini_api: '(Gemini API)',
com_endpoint_config_google_api_info:
'Um deinen Generative Language API-Schlüssel (für Gemini) zu erhalten,',
com_endpoint_config_key_import_json_key: 'Importiere Service Account JSON Key.',
com_endpoint_config_key_import_json_key_success: 'Erfolgreich importierter Service Account JSON Key',
com_endpoint_config_key_import_json_key_success:
'Erfolgreich importierter Service Account JSON Key',
com_endpoint_config_key_import_json_key_invalid:
'Ungültiger Service Account JSON Key, Hast du die richtige Datei importiert?',
com_endpoint_config_key_get_edge_key: 'Um dein Access Token für Bing zu erhalten, melde dich an bei',
com_endpoint_config_key_get_edge_key:
'Um dein Access Token für Bing zu erhalten, melde dich an bei',
com_endpoint_config_key_get_edge_key_dev_tool:
'Verwende Dev-Tools oder eine Erweiterung, während du auf der Website angemeldet bist, um den Inhalt des _U-Cookies zu kopieren. Wenn dies fehlschlägt, befolge die folgenden Anweisungen',
com_endpoint_config_key_edge_instructions: 'Anweisungen',
com_endpoint_config_key_edge_full_key_string: 'um die vollständigen Cookie-Strings zu übermitteln.',
com_endpoint_config_key_chatgpt: 'Um dein Zugangstoken für ChatGPT \'Gratis Version\' zu erhalten, melde dich bei',
com_endpoint_config_key_edge_full_key_string:
'um die vollständigen Cookie-Strings zu übermitteln.',
com_endpoint_config_key_chatgpt:
'Um dein Zugangstoken für ChatGPT \'Gratis Version\' zu erhalten, melde dich bei',
com_endpoint_config_key_chatgpt_then_visit: 'danach besuche',
com_endpoint_config_key_chatgpt_copy_token: 'Kopiere das Zugangstoken.',
com_endpoint_config_key_google_need_to: 'Du musst',
Expand Down Expand Up @@ -312,4 +329,4 @@ com_endpoint_system_message: 'System Nachricht',
com_nav_setting_account: 'Konto',
com_nav_language: 'Sprache',
com_nav_lang_auto: 'Automatische Erkennung',
};
};
1 change: 1 addition & 0 deletions client/src/localization/languages/Eng.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
export default {
com_ui_examples: 'Examples',
com_ui_new_chat: 'New Chat',
com_ui_happy_birthday: 'It\'s my 1st birthday!',
com_ui_example_quantum_computing: 'Explain quantum computing in simple terms',
com_ui_example_10_year_old_b_day: 'Got any creative ideas for a 10 year old\'s birthday?',
com_ui_example_http_in_js: 'How do I make an HTTP request in Javascript?',
Expand Down
1 change: 1 addition & 0 deletions client/src/localization/languages/Es.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
export default {
com_ui_examples: 'Ejemplos',
com_ui_new_chat: 'Nuevo Chat',
com_ui_happy_birthday: '¡Es mi primer cumpleaños!',
com_ui_example_quantum_computing: 'Explicar la computación cuántica en términos simples',
com_ui_example_10_year_old_b_day:
'¿Tienes alguna idea creativa para el cumpleaños de un niño de 10 años?',
Expand Down
1 change: 1 addition & 0 deletions client/src/localization/languages/Fr.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
export default {
com_ui_examples: 'Exemples',
com_ui_new_chat: 'Nouvelle conversation',
com_ui_happy_birthday: 'C\'est mon premier anniversaire !',
com_ui_example_quantum_computing: 'Expliquer l\'informatique quantique en termes simples',
com_ui_example_10_year_old_b_day:
'Tu as des idées créatives pour l\'anniversaire d\'un enfant de 10 ans ?',
Expand Down
1 change: 1 addition & 0 deletions client/src/localization/languages/Id.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
export default {
com_ui_examples: 'Contoh',
com_ui_new_chat: 'Chat Baru',
com_ui_happy_birthday: 'Ini ulang tahun pertamaku!',
com_ui_example_quantum_computing: 'Jelaskan komputasi kuantum dengan istilah yang sederhana',
com_ui_example_10_year_old_b_day: 'Ada ide kreatif untuk ulang tahun anak 10 tahun?',
com_ui_example_http_in_js: 'Bagaimana cara membuat permintaan HTTP dalam Javascript?',
Expand Down
1 change: 1 addition & 0 deletions client/src/localization/languages/It.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
export default {
com_ui_examples: 'Esempi',
com_ui_new_chat: 'Nuova Chat',
com_ui_happy_birthday: 'È il mio primo compleanno!',
com_ui_example_quantum_computing: 'Spiega l\'informatica quantistica in termini semplici',
com_ui_example_10_year_old_b_day:
'Hai qualche idea creativa per il compleanno di un bambino di 10 anni?',
Expand Down
Loading
Loading