translations

This commit is contained in:
Smartsheet-JB-Brown 2025-04-15 13:15:05 -07:00
parent 8eec97af25
commit f5b97baac4
17 changed files with 392 additions and 16 deletions

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modes",
"mcp_servers": "Servidors MCP",
"prompts": "Prompts",
"packages": "Paquets",
"generic_type": "{{type}}s",
"match": "coincidència"
},
"item_card": {
"type_mode": "Mode",
"type_mcp_server": "Servidor MCP",
"type_prompt": "Prompt",
"type_package": "Paquet",
"type_other": "Altres",
"by_author": "per {{author}}",
"remove_tag_filter": "Eliminar filtre d'etiqueta: {{tag}}",
"filter_by_tag": "Filtrar per etiqueta: {{tag}}",
"component_details": "Detalls del component",
"match_count": "{{count}} coincidènci{{count !== 1 ? 'es' : 'a'}}",
"view": "Veure",
"source": "Font"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modi",
"mcp_servers": "MCP-Server",
"prompts": "Prompts",
"packages": "Pakete",
"generic_type": "{{type}}",
"match": "Treffer"
},
"item_card": {
"type_mode": "Modus",
"type_mcp_server": "MCP-Server",
"type_prompt": "Prompt",
"type_package": "Paket",
"type_other": "Sonstiges",
"by_author": "von {{author}}",
"remove_tag_filter": "Tag-Filter entfernen: {{tag}}",
"filter_by_tag": "Nach Tag filtern: {{tag}}",
"component_details": "Komponentendetails",
"match_count": "{{count}} Treffer",
"view": "Ansehen",
"source": "Quelle"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modes",
"mcp_servers": "MCP Servers",
"prompts": "Prompts",
"packages": "Packages",
"generic_type": "{{type}}s",
"match": "match"
},
"item_card": {
"type_mode": "Mode",
"type_mcp_server": "MCP Server",
"type_prompt": "Prompt",
"type_package": "Package",
"type_other": "Other",
"by_author": "by {{author}}",
"remove_tag_filter": "Remove tag filter: {{tag}}",
"filter_by_tag": "Filter by tag: {{tag}}",
"component_details": "Component Details",
"match_count": "{{count}} match{{count !== 1 ? 'es' : ''}}",
"view": "View",
"source": "Source"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modos",
"mcp_servers": "Servidores MCP",
"prompts": "Prompts",
"packages": "Paquetes",
"generic_type": "{{type}}s",
"match": "coincide"
},
"item_card": {
"type_mode": "Modo",
"type_mcp_server": "Servidor MCP",
"type_prompt": "Prompt",
"type_package": "Paquete",
"type_other": "Otro",
"by_author": "por {{author}}",
"remove_tag_filter": "Eliminar filtro de etiqueta: {{tag}}",
"filter_by_tag": "Filtrar por etiqueta: {{tag}}",
"component_details": "Detalles del Componente",
"match_count": "{{count}} coincidencia{{count !== 1 ? 's' : ''}}",
"view": "Ver",
"source": "Fuente"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modes",
"mcp_servers": "Serveurs MCP",
"prompts": "Prompts",
"packages": "Paquets",
"generic_type": "{{type}}s",
"match": "correspondance"
},
"item_card": {
"type_mode": "Mode",
"type_mcp_server": "Serveur MCP",
"type_prompt": "Prompt",
"type_package": "Paquet",
"type_other": "Autre",
"by_author": "par {{author}}",
"remove_tag_filter": "Supprimer le filtre de tag : {{tag}}",
"filter_by_tag": "Filtrer par tag : {{tag}}",
"component_details": "Détails du composant",
"match_count": "{{count}} correspondance{{count !== 1 ? 's' : ''}}",
"view": "Voir",
"source": "Source"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "मोड",
"mcp_servers": "एमसीपी सर्वर",
"prompts": "प्रॉम्प्ट्स",
"packages": "पैकेज",
"generic_type": "{{type}}",
"match": "मिलान"
},
"item_card": {
"type_mode": "मोड",
"type_mcp_server": "एमसीपी सर्वर",
"type_prompt": "प्रॉम्प्ट",
"type_package": "पैकेज",
"type_other": "अन्य",
"by_author": "लेखक: {{author}}",
"remove_tag_filter": "टैग फ़िल्टर हटाएं: {{tag}}",
"filter_by_tag": "टैग से फ़िल्टर करें: {{tag}}",
"component_details": "कंपोनेंट विवरण",
"match_count": "{{count}} मिलान",
"view": "देखें",
"source": "स्रोत"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modalità",
"mcp_servers": "Server MCP",
"prompts": "Prompt",
"packages": "Pacchetti",
"generic_type": "{{type}}",
"match": "corrispondenza"
},
"item_card": {
"type_mode": "Modalità",
"type_mcp_server": "Server MCP",
"type_prompt": "Prompt",
"type_package": "Pacchetto",
"type_other": "Altro",
"by_author": "di {{author}}",
"remove_tag_filter": "Rimuovi filtro tag: {{tag}}",
"filter_by_tag": "Filtra per tag: {{tag}}",
"component_details": "Dettagli componente",
"match_count": "{{count}} corrispondenza{{count !== 1 ? 'e' : ''}}",
"view": "Visualizza",
"source": "Sorgente"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "モード",
"mcp_servers": "MCPサーバー",
"prompts": "プロンプト",
"packages": "パッケージ",
"generic_type": "{{type}}",
"match": "一致"
},
"item_card": {
"type_mode": "モード",
"type_mcp_server": "MCPサーバー",
"type_prompt": "プロンプト",
"type_package": "パッケージ",
"type_other": "その他",
"by_author": "作成者:{{author}}",
"remove_tag_filter": "タグフィルターを削除:{{tag}}",
"filter_by_tag": "タグでフィルター:{{tag}}",
"component_details": "コンポーネントの詳細",
"match_count": "{{count}}件の一致",
"view": "表示",
"source": "ソース"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "모드",
"mcp_servers": "MCP 서버",
"prompts": "프롬프트",
"packages": "패키지",
"generic_type": "{{type}}",
"match": "일치"
},
"item_card": {
"type_mode": "모드",
"type_mcp_server": "MCP 서버",
"type_prompt": "프롬프트",
"type_package": "패키지",
"type_other": "기타",
"by_author": "작성자: {{author}}",
"remove_tag_filter": "태그 필터 제거: {{tag}}",
"filter_by_tag": "태그로 필터링: {{tag}}",
"component_details": "컴포넌트 상세정보",
"match_count": "{{count}}개 일치",
"view": "보기",
"source": "소스"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Tryby",
"mcp_servers": "Serwery MCP",
"prompts": "Podpowiedzi",
"packages": "Pakiety",
"generic_type": "{{type}}y",
"match": "dopasowanie"
},
"item_card": {
"type_mode": "Tryb",
"type_mcp_server": "Serwer MCP",
"type_prompt": "Podpowiedź",
"type_package": "Pakiet",
"type_other": "Inne",
"by_author": "autor: {{author}}",
"remove_tag_filter": "Usuń filtr tagu: {{tag}}",
"filter_by_tag": "Filtruj po tagu: {{tag}}",
"component_details": "Szczegóły komponentu",
"match_count": "{{count}} dopasowani{{count === 1 ? 'e' : count < 5 ? 'a' : 'ń'}}",
"view": "Pokaż",
"source": "Źródło"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modos",
"mcp_servers": "Servidores MCP",
"prompts": "Prompts",
"packages": "Pacotes",
"generic_type": "{{type}}s",
"match": "correspondência"
},
"item_card": {
"type_mode": "Modo",
"type_mcp_server": "Servidor MCP",
"type_prompt": "Prompt",
"type_package": "Pacote",
"type_other": "Outro",
"by_author": "por {{author}}",
"remove_tag_filter": "Remover filtro de tag: {{tag}}",
"filter_by_tag": "Filtrar por tag: {{tag}}",
"component_details": "Detalhes do Componente",
"match_count": "{{count}} correspondência{{count !== 1 ? 's' : ''}}",
"view": "Visualizar",
"source": "Fonte"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Modlar",
"mcp_servers": "MCP Sunucuları",
"prompts": "Komutlar",
"packages": "Paketler",
"generic_type": "{{type}}lar",
"match": "eşleşme"
},
"item_card": {
"type_mode": "Mod",
"type_mcp_server": "MCP Sunucusu",
"type_prompt": "Komut",
"type_package": "Paket",
"type_other": "Diğer",
"by_author": "yazar: {{author}}",
"remove_tag_filter": "Etiket filtresini kaldır: {{tag}}",
"filter_by_tag": "Etikete göre filtrele: {{tag}}",
"component_details": "Bileşen Detayları",
"match_count": "{{count}} eşleşme",
"view": "Görüntüle",
"source": "Kaynak"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "Chế độ",
"mcp_servers": "Máy chủ MCP",
"prompts": "Gợi ý",
"packages": "Gói",
"generic_type": "{{type}}",
"match": "phù hợp"
},
"item_card": {
"type_mode": "Chế độ",
"type_mcp_server": "Máy chủ MCP",
"type_prompt": "Gợi ý",
"type_package": "Gói",
"type_other": "Khác",
"by_author": "bởi {{author}}",
"remove_tag_filter": "Xóa bộ lọc thẻ: {{tag}}",
"filter_by_tag": "Lọc theo thẻ: {{tag}}",
"component_details": "Chi tiết thành phần",
"match_count": "{{count}} kết quả phù hợp",
"view": "Xem",
"source": "Nguồn"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "模式",
"mcp_servers": "MCP服务器",
"prompts": "提示",
"packages": "包",
"generic_type": "{{type}}",
"match": "匹配"
},
"item_card": {
"type_mode": "模式",
"type_mcp_server": "MCP服务器",
"type_prompt": "提示",
"type_package": "包",
"type_other": "其他",
"by_author": "作者:{{author}}",
"remove_tag_filter": "移除标签过滤器:{{tag}}",
"filter_by_tag": "按标签过滤:{{tag}}",
"component_details": "组件详情",
"match_count": "{{count}}个匹配",
"view": "查看",
"source": "源码"
}
}

View file

@ -0,0 +1,24 @@
{
"type_group": {
"modes": "模式",
"mcp_servers": "MCP伺服器",
"prompts": "提示",
"packages": "套件",
"generic_type": "{{type}}",
"match": "符合"
},
"item_card": {
"type_mode": "模式",
"type_mcp_server": "MCP伺服器",
"type_prompt": "提示",
"type_package": "套件",
"type_other": "其他",
"by_author": "作者:{{author}}",
"remove_tag_filter": "移除標籤篩選:{{tag}}",
"filter_by_tag": "依標籤篩選:{{tag}}",
"component_details": "元件詳細資訊",
"match_count": "{{count}}個符合",
"view": "檢視",
"source": "原始碼"
}
}

View file

@ -6,6 +6,7 @@ import { groupItemsByType, GroupedItems } from "../utils/grouping"
import { ExpandableSection } from "./ExpandableSection"
import { TypeGroup } from "./TypeGroup"
import { ViewState } from "../PackageManagerViewStateManager"
import { t } from "../../../../../src/i18n"
interface PackageManagerItemCardProps {
item: PackageManagerItem
@ -34,15 +35,15 @@ export const PackageManagerItemCard: React.FC<PackageManagerItemCardProps> = ({
const getTypeLabel = (type: string) => {
switch (type) {
case "mode":
return "Mode"
return t("package_manager:item_card.type_mode")
case "mcp server":
return "MCP Server"
return t("package_manager:item_card.type_mcp_server")
case "prompt":
return "Prompt"
return t("package_manager:item_card.type_prompt")
case "package":
return "Package"
return t("package_manager:item_card.type_package")
default:
return "Other"
return t("package_manager:item_card.type_other")
}
}
@ -94,7 +95,11 @@ export const PackageManagerItemCard: React.FC<PackageManagerItemCardProps> = ({
<div className="flex justify-between items-start">
<div>
<h3 className="text-lg font-semibold text-vscode-foreground">{item.name}</h3>
{item.author && <p className="text-sm text-vscode-descriptionForeground">{`by ${item.author}`}</p>}
{item.author && (
<p className="text-sm text-vscode-descriptionForeground">
{t("package_manager:item_card.by_author", { author: item.author })}
</p>
)}
</div>
<span className={`px-2 py-1 text-xs text-white rounded-full ${getTypeColor(item.type)}`}>
{getTypeLabel(item.type)}
@ -127,7 +132,11 @@ export const PackageManagerItemCard: React.FC<PackageManagerItemCardProps> = ({
}
}
}}
title={filters.tags.includes(tag) ? `Remove tag filter: ${tag}` : `Filter by tag: ${tag}`}>
title={
filters.tags.includes(tag)
? t("package_manager:item_card.remove_tag_filter", { tag })
: t("package_manager:item_card.filter_by_tag", { tag })
}>
{tag}
</button>
))}
@ -156,16 +165,20 @@ export const PackageManagerItemCard: React.FC<PackageManagerItemCardProps> = ({
<Button onClick={handleOpenUrl}>
<span className="codicon codicon-link-external mr-2"></span>
{item.sourceUrl ? "View" : item.sourceName || "Source"}
{item.sourceUrl
? t("package_manager:item_card.view")
: item.sourceName || t("package_manager:item_card.source")}
</Button>
</div>
{groupedItems && (
<ExpandableSection
title="Component Details"
title={t("package_manager:item_card.component_details")}
badge={(() => {
const matchCount = item.items?.filter((subItem) => subItem.matchInfo?.matched).length ?? 0
return matchCount > 0 ? `${matchCount} match${matchCount !== 1 ? "es" : ""}` : undefined
return matchCount > 0
? t("package_manager:item_card.match_count", { count: matchCount })
: undefined
})()}
defaultExpanded={item.items?.some((subItem) => subItem.matchInfo?.matched) ?? false}>
<div className="space-y-4">

View file

@ -1,5 +1,6 @@
import React from "react"
import { cn } from "@/lib/utils"
import { t } from "../../../../../src/i18n"
interface TypeGroupProps {
type: string
@ -20,15 +21,17 @@ export const TypeGroup: React.FC<TypeGroupProps> = ({ type, items, className })
const getTypeLabel = (type: string) => {
switch (type) {
case "mode":
return "Modes"
return t("package_manager:type_group.modes")
case "mcp server":
return "MCP Servers"
return t("package_manager:type_group.mcp_servers")
case "prompt":
return "Prompts"
return t("package_manager:type_group.prompts")
case "package":
return "Packages"
return t("package_manager:type_group.packages")
default:
return `${type.charAt(0).toUpperCase()}${type.slice(1)}s`
return t("package_manager:type_group.generic_type", {
type: type.charAt(0).toUpperCase() + type.slice(1),
})
}
}
@ -56,7 +59,7 @@ export const TypeGroup: React.FC<TypeGroupProps> = ({ type, items, className })
)}
{item.matchInfo?.matched && (
<span className="ml-2 text-xs bg-vscode-badge-background text-vscode-badge-foreground px-1 py-0.5 rounded">
match
{t("package_manager:type_group.match")}
</span>
)}
</li>