diff --git a/app/[locale]/developers/tutorials/_components/modal.tsx b/app/[locale]/developers/tutorials/_components/modal.tsx index e109d0b97f7..c0e212e9639 100644 --- a/app/[locale]/developers/tutorials/_components/modal.tsx +++ b/app/[locale]/developers/tutorials/_components/modal.tsx @@ -15,7 +15,8 @@ import { useBreakpointValue } from "@/hooks/useBreakpointValue" const TutorialSubmitModal = ({ dir, -}: Pick, "dir">) => { + children, +}: Pick, "dir" | "children">) => { const [isModalOpen, setModalOpen] = useState(false) const modalSize = useBreakpointValue({ base: "xl", md: "md" } as const) @@ -65,7 +66,7 @@ const TutorialSubmitModal = ({ }) }} > - + {children} ) diff --git a/app/[locale]/developers/tutorials/_components/tutorials.tsx b/app/[locale]/developers/tutorials/_components/tutorials.tsx index e458bc72ac5..dd3d6e349e2 100644 --- a/app/[locale]/developers/tutorials/_components/tutorials.tsx +++ b/app/[locale]/developers/tutorials/_components/tutorials.tsx @@ -8,10 +8,20 @@ import React, { useMemo, useState, } from "react" -import { ExternalLink } from "lucide-react" +import { + ChevronDown, + ChevronUp, + Code, + ExternalLink, + GraduationCap, + Layers, + Search, + Trophy, + X, +} from "lucide-react" import { useLocale } from "next-intl" -import { ITutorial, Lang } from "@/lib/types" +import { ITutorial, Lang, SectionNavDetails } from "@/lib/types" import Emoji from "@/components/Emoji" import Translation from "@/components/Translation" @@ -19,6 +29,8 @@ import { getSkillTranslationId } from "@/components/TutorialMetadata" import TutorialTags from "@/components/TutorialTags" import { Button } from "@/components/ui/buttons/Button" import { Flex, FlexProps } from "@/components/ui/flex" +import Input from "@/components/ui/input" +import TabNav from "@/components/ui/TabNav" import { Tag, TagButton } from "@/components/ui/tag" import { cn } from "@/lib/utils/cn" @@ -33,6 +45,10 @@ import externalTutorials from "@/data/externalTutorials.json" import { DEFAULT_LOCALE } from "@/lib/constants" +import useTranslation from "@/hooks/useTranslation" + +const MAX_DEFAULT_TAGS = 12 + const FilterTag = forwardRef< HTMLButtonElement, { isActive: boolean; name: string } & ButtonHTMLAttributes @@ -53,7 +69,10 @@ const FilterTag = forwardRef< FilterTag.displayName = "FilterTag" -const Text = ({ className, ...props }: HTMLAttributes) => ( +const Text = ({ + className, + ...props +}: HTMLAttributes) => (

) @@ -80,11 +99,19 @@ const published = (locale: string, published: string) => { ) : null } +const SKILL_ICONS: Record = { + all: , + beginner: , + intermediate: , + advanced: , +} + type TutorialsListProps = { internalTutorials: ITutorial[] } const TutorialsList = ({ internalTutorials }: TutorialsListProps) => { + const { t } = useTranslation("page-developers-tutorials") const locale = useLocale() const effectiveLocale = internalTutorials.length > 0 ? locale : DEFAULT_LOCALE const filteredTutorialsByLang = useMemo( @@ -102,25 +129,105 @@ const TutorialsList = ({ internalTutorials }: TutorialsListProps) => { [filteredTutorialsByLang] ) + // Build skill level sections for TabNav (same pattern as events ContinentTabs) + const skillSections: SectionNavDetails[] = useMemo(() => { + const counts: Record = { + all: filteredTutorialsByLang.length, + } + filteredTutorialsByLang.forEach((tutorial) => { + if (tutorial.skill) + counts[tutorial.skill] = (counts[tutorial.skill] || 0) + 1 + }) + + return [ + { + key: "all", + label: `${t("page-tutorial-all")} (${counts.all})`, + icon: SKILL_ICONS.all, + }, + { + key: "beginner", + label: `${t("page-tutorial-beginner")} (${counts.beginner ?? 0})`, + icon: SKILL_ICONS.beginner, + }, + { + key: "intermediate", + label: `${t("page-tutorial-intermediate")} (${counts.intermediate ?? 0})`, + icon: SKILL_ICONS.intermediate, + }, + { + key: "advanced", + label: `${t("page-tutorial-advanced")} (${counts.advanced ?? 0})`, + icon: SKILL_ICONS.advanced, + }, + ] + }, [filteredTutorialsByLang, t]) + const [filteredTutorials, setFilteredTutorials] = useState( filteredTutorialsByLang ) const [selectedTags, setSelectedTags] = useState>([]) + const [selectedSkill, setSelectedSkill] = useState("all") + const [searchQuery, setSearchQuery] = useState("") + const [showAllTags, setShowAllTags] = useState(false) + + // Split tags into popular (top N by count) and niche (the rest) + const { popularTags, nicheTags } = useMemo(() => { + const eligible: Array<[string, number]> = [] + + Object.entries(allTags).forEach(([tagName, tagCount]) => { + const count = tagCount as number + if (count <= 1) return + eligible.push([tagName, count]) + }) + + // Sort by count descending for visual hierarchy + eligible.sort((a, b) => b[1] - a[1]) + + // Top tags shown by default, rest behind expander + const popular = eligible.slice(0, MAX_DEFAULT_TAGS) + const niche = eligible.slice(MAX_DEFAULT_TAGS) + return { popularTags: popular, nicheTags: niche } + }, [allTags]) + + // Combined filtering: skill + tags + search useEffect(() => { let tutorials = filteredTutorialsByLang + // Skill filter + if (selectedSkill !== "all") { + tutorials = tutorials.filter( + (tutorial) => tutorial.skill === selectedSkill + ) + } + + // Tag filter (AND logic) if (selectedTags.length) { tutorials = tutorials.filter((tutorial) => { return selectedTags.every((tag) => (tutorial.tags || []).includes(tag)) }) } + // Search filter (matches title, description, tags, author) + if (searchQuery.trim()) { + const query = searchQuery.toLowerCase().trim() + tutorials = tutorials.filter((tutorial) => { + const titleMatch = tutorial.title?.toLowerCase().includes(query) + const descMatch = tutorial.description?.toLowerCase().includes(query) + const tagMatch = (tutorial.tags || []).some((tag) => + tag.toLowerCase().includes(query) + ) + const authorMatch = tutorial.author?.toLowerCase().includes(query) + return titleMatch || descMatch || tagMatch || authorMatch + }) + } + setFilteredTutorials(tutorials) - }, [filteredTutorialsByLang, selectedTags]) + }, [filteredTutorialsByLang, selectedTags, selectedSkill, searchQuery]) const handleTagSelect = (tagName: string) => { - const tempSelectedTags = selectedTags + const tempSelectedTags = [...selectedTags] const index = tempSelectedTags.indexOf(tagName) if (index > -1) { @@ -139,47 +246,176 @@ const TutorialsList = ({ internalTutorials }: TutorialsListProps) => { }) } - setSelectedTags([...tempSelectedTags]) + setSelectedTags(tempSelectedTags) + } + + const handleSkillSelect = (key: string) => { + setSelectedSkill(key) + trackCustomEvent({ + eventCategory: "tutorial tags", + eventAction: "click", + eventName: `skill:${key}`, + }) + } + + const handleClearAll = () => { + setSelectedTags([]) + setSelectedSkill("all") + setSearchQuery("") + trackCustomEvent({ + eventCategory: "tutorial tags", + eventAction: "click", + eventName: "clear", + }) } + const hasActiveFilters = + selectedTags.length > 0 || + selectedSkill !== "all" || + searchQuery.trim() !== "" + + const visibleTags = showAllTags ? [...popularTags, ...nicheTags] : popularTags + return ( <> -

- - -
- {Object.entries(allTags).map(([tagName, tagCount], idx) => { - if ((tagCount as number) <= 1) return null - - const name = `${tagName} (${tagCount})` +
+ {/* Skill level TabNav + Search */} +
+ +
+ + setSearchQuery(e.target.value)} + className="w-full ps-9 text-sm" + /> + {searchQuery && ( + + )} +
+
+ + {/* Filter controls */} +
+ {/* Row 2: Topic tags */} +
+

+ +

+
+ {visibleTags.map(([tagName, tagCount]) => { const isActive = selectedTags.includes(tagName) return ( handleTagSelect(tagName)} - {...{ name, isActive }} + name={`${tagName} (${tagCount})`} + isActive={isActive} /> ) })} + + {/* Show more / Show less toggle */} + {nicheTags.length > 0 && ( + + )}
- {selectedTags.length > 0 && ( +
+ + {/* Row 3: Active filters summary (only when filters active) */} + {hasActiveFilters && ( +
+ + + + + {selectedSkill !== "all" && ( + setSelectedSkill("all")} + > + {t(`page-tutorial-${selectedSkill}`)} + + + )} + + {selectedTags.map((tag) => ( + handleTagSelect(tag)} + > + {tag} + + + ))} + + {searchQuery.trim() && ( + setSearchQuery("")} + > + “{searchQuery.trim()}” + + + )} + - )} - - +
+ )} +
+ + {/* Empty state */} {filteredTutorials.length === 0 && (
@@ -191,6 +427,8 @@ const TutorialsList = ({ internalTutorials }: TutorialsListProps) => {
)} + + {/* Tutorial cards */} {filteredTutorials.map((tutorial) => { return ( { )} - - - + {tutorial.skill && ( + + + + )} {tutorial.author} {tutorial.published ? ( - <> •{published(locale!, tutorial.published!)} + <> •{published(locale, tutorial.published!)} ) : null} {tutorial.timeToRead && ( <> diff --git a/app/[locale]/developers/tutorials/page.tsx b/app/[locale]/developers/tutorials/page.tsx index 94ebf11615c..4049c35358b 100644 --- a/app/[locale]/developers/tutorials/page.tsx +++ b/app/[locale]/developers/tutorials/page.tsx @@ -9,6 +9,7 @@ import { import type { CommitHistory, Lang, PageParams } from "@/lib/types" import FeedbackCard from "@/components/FeedbackCard" +import ContentHero, { ContentHeroProps } from "@/components/Hero/ContentHero" import I18nProvider from "@/components/I18nProvider" import MainArticle from "@/components/MainArticle" import { Skeleton, SkeletonCardContent } from "@/components/ui/skeleton" @@ -19,16 +20,34 @@ import { getTutorialsData } from "@/lib/utils/md" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" +import TutorialSubmitModal from "./_components/modal" import TutorialsPageJsonLD from "./page-jsonld" +import heroImg from "@/public/images/doge-computer.png" + const TutorialsList = dynamic(() => import("./_components/tutorials"), { ssr: false, loading: () => ( -
-
- {Array.from({ length: 30 }).map((_, index) => ( - - ))} +
+
+ {/* Skill tabs + search skeleton */} +
+
+ {Array.from({ length: 4 }).map((_, index) => ( + + ))} +
+ +
+ {/* Tag pills skeleton */} +
+ {Array.from({ length: 8 }).map((_, index) => ( + + ))} +
{Array.from({ length: 5 }).map((_, index) => ( @@ -37,15 +56,6 @@ const TutorialsList = dynamic(() => import("./_components/tutorials"), { ), }) -const TutorialSubmitModal = dynamic(() => import("./_components/modal"), { - ssr: false, - loading: () => ( -
- -
- ), -}) - const Page = async ({ params }: { params: PageParams }) => { const { locale } = params @@ -75,6 +85,18 @@ const Page = async ({ params }: { params: PageParams }) => { commitHistoryCache ) + const heroProps: ContentHeroProps = { + breadcrumbs: { slug: "developers/tutorials", startDepth: 1 }, + heroImg, + title: t("page-tutorial-title"), + description: t("page-tutorial-subtitle"), + buttons: [ + + {t("page-tutorial-submit-btn")} + , + ], + } + return ( <> { contributors={contributors} /> + -

- {t("page-tutorial-title")} -

-

- {t("page-tutorial-subtitle")} -

- - - diff --git a/src/intl/ar/page-developers-tutorials.json b/src/intl/ar/page-developers-tutorials.json index ce1686972aa..f2801c86593 100644 --- a/src/intl/ar/page-developers-tutorials.json +++ b/src/intl/ar/page-developers-tutorials.json @@ -1,4 +1,9 @@ { "page-find-wallet-try-removing": "حاول إزالة ميزة أو اثنين", - "page-find-wallet-clear": "إزالة المرشحات" + "page-find-wallet-clear": "إزالة المرشحات", + "page-tutorial-all": "الكل", + "page-tutorial-topics": "المواضيع", + "page-tutorial-search-placeholder": "ابحث في البرامج التعليمية...", + "page-tutorial-filtering-by": "تصفية حسب:", + "page-tutorial-more-tags": "+{count} المزيد" } diff --git a/src/intl/bn/page-developers-tutorials.json b/src/intl/bn/page-developers-tutorials.json index c7e3c1de247..45030db9c31 100644 --- a/src/intl/bn/page-developers-tutorials.json +++ b/src/intl/bn/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "উন্নত", "page-find-wallet-try-removing": "একটি বা দুটি বৈশিষ্ট্য সরানোর চেষ্টা করুন", "page-find-wallet-clear": "ফিল্টার বাদ দিন", + "page-tutorial-all": "সব", + "page-tutorial-topics": "বিষয়সমূহ", + "page-tutorial-search-placeholder": "টিউটোরিয়াল খুঁজুন...", + "page-tutorial-filtering-by": "ফিল্টার করা হচ্ছে:", + "page-tutorial-more-tags": "আরও +{count}টি", "page-tutorials-env-banner": ".env কমিট করবেন না! অনুগ্রহ করে নিশ্চিত করুন যে আপনি আপনার .env ফাইলটি কারো সাথে শেয়ার বা প্রকাশ করবেন না, কারণ এটি করলে আপনি আপনার গোপন তথ্য আপোস করছেন। আপনি যদি ভার্সন কন্ট্রোল ব্যবহার করেন, তাহলে আপনার .env একটি gitignore ফাইলে যোগ করুন।" } diff --git a/src/intl/cs/page-developers-tutorials.json b/src/intl/cs/page-developers-tutorials.json index 6a976776b47..c17ebb2a830 100644 --- a/src/intl/cs/page-developers-tutorials.json +++ b/src/intl/cs/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Další", "page-find-wallet-try-removing": "Zkuste odebrat funkci nebo dvě", "page-find-wallet-clear": "Zrušit filtry", - "page-tutorials-env-banner": "Nekomitujte .env! Ujistěte se prosím, že soubor .env nikdy s nikým nesdílíte ani jej nikde nezveřejňujete, protože tím ohrožujete své citlivé údaje. Pokud používáte systém pro správu verzí, přidejte soubor .env do souboru gitignore." + "page-tutorials-env-banner": "Nekomitujte .env! Ujistěte se prosím, že soubor .env nikdy s nikým nesdílíte ani jej nikde nezveřejňujete, protože tím ohrožujete své citlivé údaje. Pokud používáte systém pro správu verzí, přidejte soubor .env do souboru gitignore.", + "page-tutorial-all": "Vše", + "page-tutorial-topics": "Témata", + "page-tutorial-search-placeholder": "Hledat návody...", + "page-tutorial-filtering-by": "Filtrovat podle:", + "page-tutorial-more-tags": "+{count} další" } diff --git a/src/intl/de/page-developers-tutorials.json b/src/intl/de/page-developers-tutorials.json index 8e20e669d06..6836e67c6d7 100644 --- a/src/intl/de/page-developers-tutorials.json +++ b/src/intl/de/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Fortgeschritten", "page-find-wallet-try-removing": "Versuchen Sie ein oder zwei Funktionen zu entfernen", "page-find-wallet-clear": "Filter aufheben", - "page-tutorials-env-banner": "Führe .env nicht aus! Es wird dringend davon abgeraten, Deine persönlichen Daten, die in dieser Datei.env enthalten sind, auszustellen oder sie mit anderen Personen zu teilen, da dies die Vertraulichkeit Deiner persönlichen Daten gefährden könnte. Wenn eine Systemsteuerung schon vorhanden ist, füge in die Datei gitignore Deinen.env ein." + "page-tutorials-env-banner": "Führe .env nicht aus! Es wird dringend davon abgeraten, Deine persönlichen Daten, die in dieser Datei.env enthalten sind, auszustellen oder sie mit anderen Personen zu teilen, da dies die Vertraulichkeit Deiner persönlichen Daten gefährden könnte. Wenn eine Systemsteuerung schon vorhanden ist, füge in die Datei gitignore Deinen.env ein.", + "page-tutorial-all": "Alle", + "page-tutorial-topics": "Themen", + "page-tutorial-search-placeholder": "Tutorials suchen...", + "page-tutorial-filtering-by": "Gefiltert nach:", + "page-tutorial-more-tags": "+{count} weitere" } diff --git a/src/intl/en/page-developers-tutorials.json b/src/intl/en/page-developers-tutorials.json index d01e7b6c58c..6dbe0f42b90 100644 --- a/src/intl/en/page-developers-tutorials.json +++ b/src/intl/en/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Advanced", "page-find-wallet-try-removing": "Try removing a feature or two", "page-find-wallet-clear": "Clear filters", - "page-tutorials-env-banner": "Don't commit .env! Please make sure never to share or expose your .env file with anyone, as you are compromising your secrets in doing so. If you are using version control, add your .env to a gitignore file." + "page-tutorials-env-banner": "Don't commit .env! Please make sure never to share or expose your .env file with anyone, as you are compromising your secrets in doing so. If you are using version control, add your .env to a gitignore file.", + "page-tutorial-all": "All", + "page-tutorial-topics": "Topics", + "page-tutorial-search-placeholder": "Search tutorials...", + "page-tutorial-filtering-by": "Filtering by:", + "page-tutorial-more-tags": "+{count} more" } diff --git a/src/intl/es/page-developers-tutorials.json b/src/intl/es/page-developers-tutorials.json index 5af6b59aa1e..12aa974c8f9 100644 --- a/src/intl/es/page-developers-tutorials.json +++ b/src/intl/es/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Avanzado", "page-find-wallet-try-removing": "Intente eliminar una o dos características", "page-find-wallet-clear": "Limpiar filtros", - "page-tutorials-env-banner": "¡No corra riesgos! .env! Asegúrese de no compartir ni exponer nunca su archivo .env con nadie, ya que de lo contrario estará compartiendo sus secretos. Si está utilizando el control de la versión, añada su .env al archivo gitignore." + "page-tutorials-env-banner": "¡No corra riesgos! .env! Asegúrese de no compartir ni exponer nunca su archivo .env con nadie, ya que de lo contrario estará compartiendo sus secretos. Si está utilizando el control de la versión, añada su .env al archivo gitignore.", + "page-tutorial-all": "Todos", + "page-tutorial-topics": "Temas", + "page-tutorial-search-placeholder": "Buscar tutoriales...", + "page-tutorial-filtering-by": "Filtrando por:", + "page-tutorial-more-tags": "+{count} más" } diff --git a/src/intl/fr/page-developers-tutorials.json b/src/intl/fr/page-developers-tutorials.json index 909627d2104..3885b626233 100644 --- a/src/intl/fr/page-developers-tutorials.json +++ b/src/intl/fr/page-developers-tutorials.json @@ -17,5 +17,10 @@ "page-tutorial-advanced": "Avancé", "page-find-wallet-try-removing": "Essayez de supprimer une ou deux fonctionnalités", "page-find-wallet-clear": "Réinitialiser les filtres", - "page-tutorials-env-banner": "Ne pas exécuter l'.env! Il est vivement déconseillé d'exposer ses données personnelles figurant dans ce fichier.env ou de les partager avec d'autres personnes, car cela pourrait compromette la confidentialité de vos données personnelles. Si vous utilisez déjà un modèle de sécurité rigide, ajoutez votre.env au fichier gitignore." + "page-tutorials-env-banner": "Ne pas exécuter l'.env! Il est vivement déconseillé d'exposer ses données personnelles figurant dans ce fichier.env ou de les partager avec d'autres personnes, car cela pourrait compromette la confidentialité de vos données personnelles. Si vous utilisez déjà un modèle de sécurité rigide, ajoutez votre.env au fichier gitignore.", + "page-tutorial-all": "Tout", + "page-tutorial-topics": "Sujets", + "page-tutorial-search-placeholder": "Rechercher des tutoriels...", + "page-tutorial-filtering-by": "Filtrer par :", + "page-tutorial-more-tags": "+{count} de plus" } diff --git a/src/intl/hi/page-developers-tutorials.json b/src/intl/hi/page-developers-tutorials.json index 6e813daf405..22b37d13c00 100644 --- a/src/intl/hi/page-developers-tutorials.json +++ b/src/intl/hi/page-developers-tutorials.json @@ -12,5 +12,10 @@ "page-tutorials-meta-description": "जांचे गए इथेरियम समुदाय ट्यूटोरियल को विषय द्वारा ब्राउज़ करें और फ़िल्टर करें।", "page-tutorials-meta-title": "इथेरियम डेवलपमेंट ट्यूटोरियल", "page-find-wallet-try-removing": "एक या दो सुविधा हटाने की कोशिश करें", - "page-find-wallet-clear": "फ़िल्टर साफ़ करें" + "page-find-wallet-clear": "फ़िल्टर साफ़ करें", + "page-tutorial-all": "सभी", + "page-tutorial-topics": "विषय", + "page-tutorial-search-placeholder": "ट्यूटोरियल खोजें...", + "page-tutorial-filtering-by": "इसके द्वारा फ़िल्टर करें:", + "page-tutorial-more-tags": "+{count} और" } diff --git a/src/intl/id/page-developers-tutorials.json b/src/intl/id/page-developers-tutorials.json index 937cd56934d..93d24da0e24 100644 --- a/src/intl/id/page-developers-tutorials.json +++ b/src/intl/id/page-developers-tutorials.json @@ -16,5 +16,10 @@ "page-tutorial-intermediate": "Tingkat menengah", "page-tutorial-advanced": "Tingkat lanjut", "page-find-wallet-try-removing": "Cobalah menghapus satu atau dua fitur", - "page-find-wallet-clear": "Hapus filter" + "page-find-wallet-clear": "Hapus filter", + "page-tutorial-all": "Semua", + "page-tutorial-topics": "Topik", + "page-tutorial-search-placeholder": "Cari tutorial...", + "page-tutorial-filtering-by": "Memfilter berdasarkan:", + "page-tutorial-more-tags": "+{count} lainnya" } diff --git a/src/intl/it/page-developers-tutorials.json b/src/intl/it/page-developers-tutorials.json index 82d2e0f8de3..bfac88f3c87 100644 --- a/src/intl/it/page-developers-tutorials.json +++ b/src/intl/it/page-developers-tutorials.json @@ -17,5 +17,10 @@ "page-tutorial-advanced": "Argomenti avanzati", "page-find-wallet-try-removing": "Prova rimuovere una o due funzionalità", "page-find-wallet-clear": "Cancella filtri", - "page-tutorials-env-banner": "Non eseguire l'.env! Si sconsiglia vivamente d'esporre i propri dati personali contenuti nel file.env o di condividerli con altri, poiché questo potrebbe compromettere la segretezza dei tuoi dati personali. Se utilizzi già un modello per il controllo dei dati, aggiungi il tuo .env al file gitignore." + "page-tutorials-env-banner": "Non eseguire l'.env! Si sconsiglia vivamente d'esporre i propri dati personali contenuti nel file.env o di condividerli con altri, poiché questo potrebbe compromettere la segretezza dei tuoi dati personali. Se utilizzi già un modello per il controllo dei dati, aggiungi il tuo .env al file gitignore.", + "page-tutorial-all": "Tutti", + "page-tutorial-topics": "Argomenti", + "page-tutorial-search-placeholder": "Cerca tutorial...", + "page-tutorial-filtering-by": "Filtra per:", + "page-tutorial-more-tags": "+{count} altro" } diff --git a/src/intl/ja/page-developers-tutorials.json b/src/intl/ja/page-developers-tutorials.json index 655a5e90bf9..faa83fd0351 100644 --- a/src/intl/ja/page-developers-tutorials.json +++ b/src/intl/ja/page-developers-tutorials.json @@ -17,5 +17,10 @@ "page-tutorial-advanced": "上級", "page-find-wallet-try-removing": "機能を1つまたは2つ削除してみてください", "page-find-wallet-clear": "フィルタをクリア", - "page-tutorials-env-banner": ".env をコミットしないでください!.envファイルを他人と共有したり公開したりすると、シークレットの情報が漏洩することになるので、決して共有したり公開したりしないようにしてください。バージョン管理を使用している場合は、.envgitignoreファイルに追加してください。" + "page-tutorials-env-banner": ".env をコミットしないでください!.envファイルを他人と共有したり公開したりすると、シークレットの情報が漏洩することになるので、決して共有したり公開したりしないようにしてください。バージョン管理を使用している場合は、.envgitignoreファイルに追加してください。", + "page-tutorial-all": "すべて", + "page-tutorial-topics": "トピック", + "page-tutorial-search-placeholder": "チュートリアルを検索...", + "page-tutorial-filtering-by": "フィルター条件:", + "page-tutorial-more-tags": "+{count} その他" } diff --git a/src/intl/ko/page-developers-tutorials.json b/src/intl/ko/page-developers-tutorials.json index 9444a9b6d33..816fc90aee7 100644 --- a/src/intl/ko/page-developers-tutorials.json +++ b/src/intl/ko/page-developers-tutorials.json @@ -1,4 +1,9 @@ { "page-find-wallet-try-removing": "한 개 또는 두 개의 기능을 제거해 보세요.", - "page-find-wallet-clear": "필터 지우기" + "page-find-wallet-clear": "필터 지우기", + "page-tutorial-all": "전체", + "page-tutorial-topics": "주제", + "page-tutorial-search-placeholder": "튜토리얼 검색...", + "page-tutorial-filtering-by": "필터링 기준:", + "page-tutorial-more-tags": "+{count}개 더보기" } diff --git a/src/intl/mr/page-developers-tutorials.json b/src/intl/mr/page-developers-tutorials.json index 9c9230c2684..3ecf009213c 100644 --- a/src/intl/mr/page-developers-tutorials.json +++ b/src/intl/mr/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "प्रगत", "page-find-wallet-try-removing": "एक किंवा दोन वैशिष्ट्य काढून टाकण्याचा प्रयत्न करा", "page-find-wallet-clear": "फिल्टर साफ करा", - "page-tutorials-env-banner": ".env कमिट करू नका! कृपया तुमची .env फाईल कोणासोबतही शेअर किंवा उघड करू नका, कारण असे केल्याने तुमची गुपिते धोक्यात येतात. तुम्ही व्हर्जन कंट्रोल वापरत असल्यास, तुमची .env gitignore फाईलमध्ये जोडा." + "page-tutorials-env-banner": ".env कमिट करू नका! कृपया तुमची .env फाईल कोणासोबतही शेअर किंवा उघड करू नका, कारण असे केल्याने तुमची गुपिते धोक्यात येतात. तुम्ही व्हर्जन कंट्रोल वापरत असल्यास, तुमची .env gitignore फाईलमध्ये जोडा.", + "page-tutorial-all": "सर्व", + "page-tutorial-topics": "विषय", + "page-tutorial-search-placeholder": "ट्यूटोरियल्स शोधा...", + "page-tutorial-filtering-by": "याद्वारे फिल्टर करत आहे:", + "page-tutorial-more-tags": "+{count} अधिक" } diff --git a/src/intl/pl/page-developers-tutorials.json b/src/intl/pl/page-developers-tutorials.json index 1e9fe53ee19..dcb990cc425 100644 --- a/src/intl/pl/page-developers-tutorials.json +++ b/src/intl/pl/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Zaawansowane funkcje", "page-find-wallet-try-removing": "Spróbuj usunąć jedną lub dwie funkcje", "page-find-wallet-clear": "Wyczyść filtry", - "page-tutorials-env-banner": "Nie udostępniaj pliku .env! Upewnij się, że nigdy nie udostępniasz ani nie ujawniasz nikomu swojego pliku .env, ponieważ narażasz w ten sposób swoje sekrety. Jeśli korzystasz z kontroli wersji, dodaj swój plik .env do pliku gitignore." + "page-tutorials-env-banner": "Nie udostępniaj pliku .env! Upewnij się, że nigdy nie udostępniasz ani nie ujawniasz nikomu swojego pliku .env, ponieważ narażasz w ten sposób swoje sekrety. Jeśli korzystasz z kontroli wersji, dodaj swój plik .env do pliku gitignore.", + "page-tutorial-all": "Wszystkie", + "page-tutorial-topics": "Tematy", + "page-tutorial-search-placeholder": "Szukaj samouczków...", + "page-tutorial-filtering-by": "Filtrowanie według:", + "page-tutorial-more-tags": "+{count} więcej" } diff --git a/src/intl/pt-br/page-developers-tutorials.json b/src/intl/pt-br/page-developers-tutorials.json index f404cb152f7..5d0ec4dc85c 100644 --- a/src/intl/pt-br/page-developers-tutorials.json +++ b/src/intl/pt-br/page-developers-tutorials.json @@ -17,5 +17,10 @@ "page-tutorial-advanced": "Avançado", "page-find-wallet-try-removing": "Tente remover um ou dois recursos", "page-find-wallet-clear": "Limpar filtros", - "page-tutorials-env-banner": "Não comprometa o .env! Certifique-se de nunca compartilhar ou explicar o seu . arquivo nv com qualquer pessoa, pois você estará comprometendo seus segredos ao fazê-lo. Se você estiver usando o controle de versão, adicione seu .env a um arquivo gitignore." + "page-tutorials-env-banner": "Não comprometa o .env! Certifique-se de nunca compartilhar ou explicar o seu . arquivo nv com qualquer pessoa, pois você estará comprometendo seus segredos ao fazê-lo. Se você estiver usando o controle de versão, adicione seu .env a um arquivo gitignore.", + "page-tutorial-all": "Todos", + "page-tutorial-topics": "Tópicos", + "page-tutorial-search-placeholder": "Pesquisar tutoriais...", + "page-tutorial-filtering-by": "Filtrando por:", + "page-tutorial-more-tags": "+{count} mais" } diff --git a/src/intl/ru/page-developers-tutorials.json b/src/intl/ru/page-developers-tutorials.json index 23e83709c0b..3ad4987b564 100644 --- a/src/intl/ru/page-developers-tutorials.json +++ b/src/intl/ru/page-developers-tutorials.json @@ -12,5 +12,10 @@ "page-tutorials-meta-description": "Просматривайте и фильтруйте проверенные руководства сообщества Ethereum по темам.", "page-tutorials-meta-title": "Руководства по разработке на Ethereum", "page-find-wallet-try-removing": "Попробуйте удалить одну или две функции", - "page-find-wallet-clear": "Очистить фильтры" + "page-find-wallet-clear": "Очистить фильтры", + "page-tutorial-all": "Все", + "page-tutorial-topics": "Темы", + "page-tutorial-search-placeholder": "Поиск руководств...", + "page-tutorial-filtering-by": "Фильтрация по:", + "page-tutorial-more-tags": "+{count} еще" } diff --git a/src/intl/sw/page-developers-tutorials.json b/src/intl/sw/page-developers-tutorials.json index ca799401c34..c8d5cdaaec5 100644 --- a/src/intl/sw/page-developers-tutorials.json +++ b/src/intl/sw/page-developers-tutorials.json @@ -1,4 +1,9 @@ { "page-find-wallet-try-removing": "Jaribu kuondoa kipengele kimoja ama viwili", - "page-find-wallet-clear": "Futa vichujaji" + "page-find-wallet-clear": "Futa vichujaji", + "page-tutorial-all": "Zote", + "page-tutorial-topics": "Mada", + "page-tutorial-search-placeholder": "Tafuta mafunzo...", + "page-tutorial-filtering-by": "Kuchuja kwa:", + "page-tutorial-more-tags": "+{count} zaidi" } diff --git a/src/intl/ta/page-developers-tutorials.json b/src/intl/ta/page-developers-tutorials.json index 5c363919004..fd7b9aca33c 100644 --- a/src/intl/ta/page-developers-tutorials.json +++ b/src/intl/ta/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "மேம்பட்டவை", "page-find-wallet-try-removing": "ஒன்று அல்லது இரண்டு அம்சங்களை அகற்ற முயற்சிக்கவும்", "page-find-wallet-clear": "வடிகட்டிகளை அழி", - "page-tutorials-env-banner": ".env ஐ கமிட் செய்யாதீர்கள்! உங்கள் .env கோப்பை யாருடனும் பகிரவோ அல்லது வெளிப்படுத்தவோ வேண்டாம் என்பதைத் தயவுசெய்து உறுதிப்படுத்திக் கொள்ளுங்கள், ஏனெனில் அவ்வாறு செய்வதன் மூலம் உங்கள் இரகசியங்களை நீங்கள் சமரசம் செய்கிறீர்கள். நீங்கள் பதிப்புக் கட்டுப்பாட்டைப் பயன்படுத்தினால், உங்கள் .env-ஐ ஒரு gitignore கோப்பில் சேர்க்கவும்." + "page-tutorials-env-banner": ".env ஐ கமிட் செய்யாதீர்கள்! உங்கள் .env கோப்பை யாருடனும் பகிரவோ அல்லது வெளிப்படுத்தவோ வேண்டாம் என்பதைத் தயவுசெய்து உறுதிப்படுத்திக் கொள்ளுங்கள், ஏனெனில் அவ்வாறு செய்வதன் மூலம் உங்கள் இரகசியங்களை நீங்கள் சமரசம் செய்கிறீர்கள். நீங்கள் பதிப்புக் கட்டுப்பாட்டைப் பயன்படுத்தினால், உங்கள் .env-ஐ ஒரு gitignore கோப்பில் சேர்க்கவும்.", + "page-tutorial-all": "அனைத்தும்", + "page-tutorial-topics": "தலைப்புகள்", + "page-tutorial-search-placeholder": "டுடோரியல்களைத் தேடு...", + "page-tutorial-filtering-by": "வடிகட்டப்படுவது:", + "page-tutorial-more-tags": "மேலும் +{count}" } diff --git a/src/intl/te/page-developers-tutorials.json b/src/intl/te/page-developers-tutorials.json index 46c74f0c285..56834f21aef 100644 --- a/src/intl/te/page-developers-tutorials.json +++ b/src/intl/te/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "అధునాతనం", "page-find-wallet-try-removing": "ఒకటి లేదా రెండు ఫీచర్లను తొలగించడానికి ప్రయత్నించండి", "page-find-wallet-clear": "ఫిల్టర్లను తీసివేయండి", - "page-tutorials-env-banner": ".envను కమిట్ చేయవద్దు! దయచేసి మీ .env ఫైల్‌ను ఎవరితోనూ పంచుకోకుండా లేదా బహిర్గతం చేయకుండా చూసుకోండి, ఎందుకంటే అలా చేయడం ద్వారా మీరు మీ రహస్యాలను ప్రమాదంలో పడేస్తున్నారు. మీరు వెర్షన్ కంట్రోల్ ఉపయోగిస్తుంటే, మీ .envను gitignore ఫైల్‌కు జోడించండి." + "page-tutorials-env-banner": ".envను కమిట్ చేయవద్దు! దయచేసి మీ .env ఫైల్‌ను ఎవరితోనూ పంచుకోకుండా లేదా బహిర్గతం చేయకుండా చూసుకోండి, ఎందుకంటే అలా చేయడం ద్వారా మీరు మీ రహస్యాలను ప్రమాదంలో పడేస్తున్నారు. మీరు వెర్షన్ కంట్రోల్ ఉపయోగిస్తుంటే, మీ .envను gitignore ఫైల్‌కు జోడించండి.", + "page-tutorial-all": "అన్నీ", + "page-tutorial-topics": "అంశాలు", + "page-tutorial-search-placeholder": "ట్యుటోరియల్స్ వెతకండి...", + "page-tutorial-filtering-by": "దీని ద్వారా ఫిల్టర్ చేయబడింది:", + "page-tutorial-more-tags": "మరిన్ని +{count}" } diff --git a/src/intl/tr/page-developers-tutorials.json b/src/intl/tr/page-developers-tutorials.json index a565ce2172c..9c0f7511136 100644 --- a/src/intl/tr/page-developers-tutorials.json +++ b/src/intl/tr/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Gelişmiş", "page-find-wallet-try-removing": "Bir veya iki özelliği kaldırmayı deneyin", "page-find-wallet-clear": "Filtreleri temizle", - "page-tutorials-env-banner": ".env'yi girmeyin! Sırlarınızın başkası tarafından ele geçirilmesi riski taşıdığından lütfen .env dosyanızı başkalarına asla göstermeyin veya başkalarıyla asla paylaşmayın. Versiyon kontrolü kullanıyorsanız .env'nizi bir gitignore dosyasına ekleyin." + "page-tutorials-env-banner": ".env'yi girmeyin! Sırlarınızın başkası tarafından ele geçirilmesi riski taşıdığından lütfen .env dosyanızı başkalarına asla göstermeyin veya başkalarıyla asla paylaşmayın. Versiyon kontrolü kullanıyorsanız .env'nizi bir gitignore dosyasına ekleyin.", + "page-tutorial-all": "Tümü", + "page-tutorial-topics": "Konular", + "page-tutorial-search-placeholder": "Eğitimleri ara...", + "page-tutorial-filtering-by": "Şuna göre filtreleniyor:", + "page-tutorial-more-tags": "+{count} tane daha" } diff --git a/src/intl/uk/page-developers-tutorials.json b/src/intl/uk/page-developers-tutorials.json index c0357353f57..1d04aafbac6 100644 --- a/src/intl/uk/page-developers-tutorials.json +++ b/src/intl/uk/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "Для досвідчених користувачів", "page-find-wallet-try-removing": "Спробуйте вилучити одну або дві функції", "page-find-wallet-clear": "Очистити фільтри", - "page-tutorials-env-banner": "Не затверджуйте .env! Переконайтеся, що ви нікому не передаєте і не показуєте свій .env файл, оскільки таким чином ви розкриваєте свої секрети. Якщо ви використовуєте систему контролю версій, додайте свій .env до файлу gitignore." + "page-tutorials-env-banner": "Не затверджуйте .env! Переконайтеся, що ви нікому не передаєте і не показуєте свій .env файл, оскільки таким чином ви розкриваєте свої секрети. Якщо ви використовуєте систему контролю версій, додайте свій .env до файлу gitignore.", + "page-tutorial-all": "Усі", + "page-tutorial-topics": "Теми", + "page-tutorial-search-placeholder": "Шукати посібники...", + "page-tutorial-filtering-by": "Фільтрування за:", + "page-tutorial-more-tags": "+{count} ще" } diff --git a/src/intl/ur/page-developers-tutorials.json b/src/intl/ur/page-developers-tutorials.json index 25a7c27087e..bcf6f7316a3 100644 --- a/src/intl/ur/page-developers-tutorials.json +++ b/src/intl/ur/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "ترقی", "page-find-wallet-try-removing": "ایک یا دو خصوصیت ہٹا کر کوشش کریں", "page-find-wallet-clear": "فلٹرز صاف کریں", - "page-tutorials-env-banner": ".env کو کمٹ نہ کریں! برائے مہربانی اس بات کو یقینی بنائیں کہ اپنی .env فائل کبھی کسی کے ساتھ شیئر یا ظاہر نہ کریں، کیونکہ ایسا کرنے سے آپ اپنے رازوں سے سمجھوتہ کر رہے ہیں۔ اگر آپ ورژن کنٹرول کا استعمال کر رہے ہیں، تو اپنی .env فائل کو gitignore فائل میں شامل کریں۔" + "page-tutorials-env-banner": ".env کو کمٹ نہ کریں! برائے مہربانی اس بات کو یقینی بنائیں کہ اپنی .env فائل کبھی کسی کے ساتھ شیئر یا ظاہر نہ کریں، کیونکہ ایسا کرنے سے آپ اپنے رازوں سے سمجھوتہ کر رہے ہیں۔ اگر آپ ورژن کنٹرول کا استعمال کر رہے ہیں، تو اپنی .env فائل کو gitignore فائل میں شامل کریں۔", + "page-tutorial-all": "تمام", + "page-tutorial-topics": "موضوعات", + "page-tutorial-search-placeholder": "ٹیوٹوریلز تلاش کریں...", + "page-tutorial-filtering-by": "فلٹر کردہ بذریعہ:", + "page-tutorial-more-tags": "مزید +{count}" } diff --git a/src/intl/vi/page-developers-tutorials.json b/src/intl/vi/page-developers-tutorials.json index e5bdcf2bf36..6d40b791099 100644 --- a/src/intl/vi/page-developers-tutorials.json +++ b/src/intl/vi/page-developers-tutorials.json @@ -1,4 +1,9 @@ { "page-find-wallet-try-removing": "Thử xóa một hoặc hai tính năng", - "page-find-wallet-clear": "Xóa bộ lọc" + "page-find-wallet-clear": "Xóa bộ lọc", + "page-tutorial-all": "Tất cả", + "page-tutorial-topics": "Chủ đề", + "page-tutorial-search-placeholder": "Tìm kiếm hướng dẫn...", + "page-tutorial-filtering-by": "Lọc theo:", + "page-tutorial-more-tags": "+{count} thêm" } diff --git a/src/intl/zh-tw/page-developers-tutorials.json b/src/intl/zh-tw/page-developers-tutorials.json index ac8ca1cbce3..a75f2b37ec0 100644 --- a/src/intl/zh-tw/page-developers-tutorials.json +++ b/src/intl/zh-tw/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "進階", "page-find-wallet-try-removing": "嘗試移除一兩項功能", "page-find-wallet-clear": "清除篩選條件", - "page-tutorials-env-banner": "請勿提交.env!請確保永遠別 公開/分享 你的.env 文件泄露給任何人,因爲這樣做會泄露你的秘密。假如你正使用版本控制,應添加.env gitignore文件。" + "page-tutorials-env-banner": "請勿提交.env!請確保永遠別 公開/分享 你的.env 文件泄露給任何人,因爲這樣做會泄露你的秘密。假如你正使用版本控制,應添加.env gitignore文件。", + "page-tutorial-all": "全部", + "page-tutorial-topics": "主題", + "page-tutorial-search-placeholder": "搜尋教學...", + "page-tutorial-filtering-by": "篩選條件:", + "page-tutorial-more-tags": "還有 +{count} 個" } diff --git a/src/intl/zh/page-developers-tutorials.json b/src/intl/zh/page-developers-tutorials.json index 2feaadee8b3..0e0fb30840b 100644 --- a/src/intl/zh/page-developers-tutorials.json +++ b/src/intl/zh/page-developers-tutorials.json @@ -18,5 +18,10 @@ "page-tutorial-advanced": "高级", "page-find-wallet-try-removing": "尝试删除一两个特性", "page-find-wallet-clear": "清除过滤器", - "page-tutorials-env-banner": "不要提交 .env!请确保从未与任何人分享或泄露你的 .env,因为那样就相当于你在泄露自己的秘密。如果你正在使用版本控制,请将你的 .env 添加到 gitignore 文件。" + "page-tutorials-env-banner": "不要提交 .env!请确保从未与任何人分享或泄露你的 .env,因为那样就相当于你在泄露自己的秘密。如果你正在使用版本控制,请将你的 .env 添加到 gitignore 文件。", + "page-tutorial-all": "全部", + "page-tutorial-topics": "主题", + "page-tutorial-search-placeholder": "搜索教程...", + "page-tutorial-filtering-by": "筛选条件:", + "page-tutorial-more-tags": "还有 +{count} 个" }