From 85cd49aa86e3497149ed22019fdfbbe97d16cd50 Mon Sep 17 00:00:00 2001 From: Peter Lord Date: Wed, 29 Jul 2026 21:06:03 -0700 Subject: [PATCH] Rename the filter placeholder labels from All to Any --- frontend/app/cards/CardsClient.tsx | 10 +++++----- frontend/app/cards/browse/[slug]/BrowseDetail.tsx | 8 ++++---- frontend/app/enchantments/EnchantmentsClient.tsx | 2 +- frontend/app/encounters/EncountersClient.tsx | 4 ++-- frontend/app/events/EventsClient.tsx | 4 ++-- frontend/app/guides/GuidesClient.tsx | 4 ++-- frontend/app/keywords/[id]/KeywordDetail.tsx | 2 +- frontend/app/monsters/MonstersClient.tsx | 4 ++-- frontend/app/potions/PotionsClient.tsx | 4 ++-- frontend/app/powers/PowersClient.tsx | 4 ++-- frontend/app/relics/RelicsClient.tsx | 6 +++--- frontend/app/timeline/TimelineClient.tsx | 2 +- frontend/lib/i18n-x4.ts | 14 ++++++++++++++ 13 files changed, 41 insertions(+), 27 deletions(-) diff --git a/frontend/app/cards/CardsClient.tsx b/frontend/app/cards/CardsClient.tsx index 1877a235b..4ec7e03ac 100644 --- a/frontend/app/cards/CardsClient.tsx +++ b/frontend/app/cards/CardsClient.tsx @@ -233,31 +233,31 @@ function CardsClientInner({ initialCards }: { initialCards: Card[] }) { noEmptyOption: true, }, { - label: "All Colors", + label: "Any Color", value: color, options: colorOptions, onChange: (v) => setFilterAndUrl("color", v, setColor), }, { - label: "All Types", + label: "Any Type", value: type, options: typeOptions, onChange: (v) => setFilterAndUrl("type", v, setType), }, { - label: "All Rarities", + label: "Any Rarity", value: rarity, options: rarityOptions, onChange: (v) => setFilterAndUrl("rarity", v, setRarity), }, { - label: "All Costs", + label: "Any Cost", value: cost, options: costOptions, onChange: (v) => setFilterAndUrl("cost", v, setCost), }, { - label: "All Keywords", + label: "Any Keyword", value: keyword, options: keywordOptions, onChange: (v) => setFilterAndUrl("keyword", v, setKeyword), diff --git a/frontend/app/cards/browse/[slug]/BrowseDetail.tsx b/frontend/app/cards/browse/[slug]/BrowseDetail.tsx index ab050f9a7..b2838717a 100644 --- a/frontend/app/cards/browse/[slug]/BrowseDetail.tsx +++ b/frontend/app/cards/browse/[slug]/BrowseDetail.tsx @@ -102,7 +102,7 @@ export default function BrowseDetail({ initialCards, fixedParams }: BrowseDetail const filters = []; if (showColorFilter) { filters.push({ - label: "All Colors", + label: "Any Color", value: color, options: colorOptions, onChange: setColor, @@ -110,7 +110,7 @@ export default function BrowseDetail({ initialCards, fixedParams }: BrowseDetail } if (showTypeFilter) { filters.push({ - label: "All Types", + label: "Any Type", value: type, options: typeOptions, onChange: setType, @@ -118,7 +118,7 @@ export default function BrowseDetail({ initialCards, fixedParams }: BrowseDetail } if (showRarityFilter) { filters.push({ - label: "All Rarities", + label: "Any Rarity", value: rarity, options: rarityOptions, onChange: setRarity, @@ -126,7 +126,7 @@ export default function BrowseDetail({ initialCards, fixedParams }: BrowseDetail } if (showKeywordFilter) { filters.push({ - label: "All Keywords", + label: "Any Keyword", value: keyword, options: keywordOptions, onChange: setKeyword, diff --git a/frontend/app/enchantments/EnchantmentsClient.tsx b/frontend/app/enchantments/EnchantmentsClient.tsx index 8afd2f96b..e65c3c78e 100644 --- a/frontend/app/enchantments/EnchantmentsClient.tsx +++ b/frontend/app/enchantments/EnchantmentsClient.tsx @@ -77,7 +77,7 @@ function EnchantmentsClientInner({ initialEnchantments }: { initialEnchantments: resultCount={enchantments.length} filters={[ { - label: "All Card Types", + label: "Any Card Type", value: cardType, options: cardTypeOptions, onChange: (v) => setFilterAndUrl("cardType", v, setCardType), diff --git a/frontend/app/encounters/EncountersClient.tsx b/frontend/app/encounters/EncountersClient.tsx index aa26ac808..fce853003 100644 --- a/frontend/app/encounters/EncountersClient.tsx +++ b/frontend/app/encounters/EncountersClient.tsx @@ -114,13 +114,13 @@ function EncountersClientInner({ initialEncounters }: { initialEncounters: Encou resultCount={filtered.length} filters={[ { - label: "All Types", + label: "Any Type", value: roomType, options: roomTypeOptions, onChange: (v) => setFilterAndUrl("roomType", v, setRoomType), }, { - label: "All Acts", + label: "Any Act", value: act, options: actOptions, onChange: (v) => setFilterAndUrl("act", v, setAct), diff --git a/frontend/app/events/EventsClient.tsx b/frontend/app/events/EventsClient.tsx index 390d1a781..d4f4c712d 100644 --- a/frontend/app/events/EventsClient.tsx +++ b/frontend/app/events/EventsClient.tsx @@ -187,13 +187,13 @@ function EventsClientInner({ initialEvents }: { initialEvents: GameEvent[] }) { resultCount={events.length} filters={[ { - label: "All Types", + label: "Any Type", value: type, options: typeOptions, onChange: (v) => setFilterAndUrl("type", v, setType), }, { - label: "All Acts", + label: "Any Act", value: act, options: actOptions, onChange: (v) => setFilterAndUrl("act", v, setAct), diff --git a/frontend/app/guides/GuidesClient.tsx b/frontend/app/guides/GuidesClient.tsx index 7a81739ef..6739632b5 100644 --- a/frontend/app/guides/GuidesClient.tsx +++ b/frontend/app/guides/GuidesClient.tsx @@ -107,13 +107,13 @@ function GuidesClientInner({ initialGuides }: { initialGuides: GuideSummary[] }) onSortChange={(v) => setFilterAndUrl("sort", v, setSort)} filters={[ { - label: "All Categories", + label: "Any Category", value: category, options: categoryOptions, onChange: (v) => setFilterAndUrl("category", v, setCategory), }, { - label: "All Difficulties", + label: "Any Difficulty", value: difficulty, options: difficultyOptions, onChange: (v) => setFilterAndUrl("difficulty", v, setDifficulty), diff --git a/frontend/app/keywords/[id]/KeywordDetail.tsx b/frontend/app/keywords/[id]/KeywordDetail.tsx index c02281776..816403d11 100644 --- a/frontend/app/keywords/[id]/KeywordDetail.tsx +++ b/frontend/app/keywords/[id]/KeywordDetail.tsx @@ -180,7 +180,7 @@ export default function KeywordDetail({ initialResult }: { initialResult?: Initi resultCount={filtered.length} filters={[ { - label: "All Characters", + label: "Any Character", value: color, options: colorOptions, onChange: setColor, diff --git a/frontend/app/monsters/MonstersClient.tsx b/frontend/app/monsters/MonstersClient.tsx index c4be62824..4ee14d3f7 100644 --- a/frontend/app/monsters/MonstersClient.tsx +++ b/frontend/app/monsters/MonstersClient.tsx @@ -117,13 +117,13 @@ function MonstersClientInner({ initialMonsters }: { initialMonsters: Monster[] } resultCount={filtered.length} filters={[ { - label: "All Types", + label: "Any Type", value: type, options: typeOptions, onChange: (v) => setFilterAndUrl("type", v, setType), }, { - label: "All Acts", + label: "Any Act", value: act, options: actOptions, onChange: (v) => setFilterAndUrl("act", v, setAct), diff --git a/frontend/app/potions/PotionsClient.tsx b/frontend/app/potions/PotionsClient.tsx index a7dd574b9..b7cba4930 100644 --- a/frontend/app/potions/PotionsClient.tsx +++ b/frontend/app/potions/PotionsClient.tsx @@ -121,13 +121,13 @@ function PotionsClientInner({ initialPotions }: { initialPotions: Potion[] }) { onSortChange={(v) => setFilterAndUrl("sort", v, setSort)} filters={[ { - label: "All Rarities", + label: "Any Rarity", value: rarity, options: rarityOptions, onChange: (v) => setFilterAndUrl("rarity", v, setRarity), }, { - label: "All Characters", + label: "Any Character", value: pool, options: poolOptions, onChange: (v) => setFilterAndUrl("pool", v, setPool), diff --git a/frontend/app/powers/PowersClient.tsx b/frontend/app/powers/PowersClient.tsx index a13993bbf..359d983ba 100644 --- a/frontend/app/powers/PowersClient.tsx +++ b/frontend/app/powers/PowersClient.tsx @@ -82,13 +82,13 @@ const [powers, setPowers] = useState(initialPowers); resultCount={merged.length} filters={[ { - label: "All Types", + label: "Any Type", value: type, options: typeOptions, onChange: setType, }, { - label: "All Stack Types", + label: "Any Stack Type", value: stackType, options: stackOptions, onChange: setStackType, diff --git a/frontend/app/relics/RelicsClient.tsx b/frontend/app/relics/RelicsClient.tsx index 2edc9451c..7df1583c9 100644 --- a/frontend/app/relics/RelicsClient.tsx +++ b/frontend/app/relics/RelicsClient.tsx @@ -163,19 +163,19 @@ function RelicsClientInner({ initialRelics }: { initialRelics: Relic[] }) { onSortChange={(v) => setFilterAndUrl("sort", v, setSort)} filters={[ { - label: "All Rarities", + label: "Any Rarity", value: rarity, options: rarityOptions, onChange: (v) => setFilterAndUrl("rarity", v, setRarity), }, { - label: "All Pools", + label: "Any Pool", value: pool, options: poolOptions, onChange: (v) => setFilterAndUrl("pool", v, setPool), }, { - label: "All Ancients", + label: "Any Ancient", value: ancient, options: ancientOptions, onChange: (v) => setFilterAndUrl("ancient", v, setAncient), diff --git a/frontend/app/timeline/TimelineClient.tsx b/frontend/app/timeline/TimelineClient.tsx index 21a0e7060..4e664d5e2 100644 --- a/frontend/app/timeline/TimelineClient.tsx +++ b/frontend/app/timeline/TimelineClient.tsx @@ -256,7 +256,7 @@ export default function TimelineClient({ resultCount={epochs.length} filters={[ { - label: "All Stories", + label: "Any Story", value: storyFilter, options: storyOptions, onChange: setStoryFilter, diff --git a/frontend/lib/i18n-x4.ts b/frontend/lib/i18n-x4.ts index c8231c8f2..f3b9f284a 100644 --- a/frontend/lib/i18n-x4.ts +++ b/frontend/lib/i18n-x4.ts @@ -153,5 +153,19 @@ export const X4: Record> = { "Mod or overlay?": { eng: "Mod or overlay?", deu: "Mod oder Overlay?", esp: "¿Mod u overlay?", fra: "Mod ou overlay ?", ita: "Mod o overlay?", jpn: "モッドとオーバーレイの違いは?", kor: "모드와 오버레이의 차이는?", pol: "Mod czy nakładka?", ptb: "Mod ou overlay?", rus: "Мод или оверлей?", spa: "¿Mod u overlay?", tha: "ม็อดหรือโอเวอร์เลย์?", tur: "Mod mu overlay mi?", zhs: "模组还是悬浮层?", zht: "模組還是懸浮層?" }, "The mod runs inside the game itself, no external apps, and is the easiest way to contribute runs and see community insights while playing. The Overwolf overlay is a separate companion for card and relic lookups on top of the game. They work fine together, and both are free.": { eng: "The mod runs inside the game itself, no external apps, and is the easiest way to contribute runs and see community insights while playing. The Overwolf overlay is a separate companion for card and relic lookups on top of the game. They work fine together, and both are free.", deu: "Der Mod läuft direkt im Spiel, ohne externe Apps, und ist der einfachste Weg, Runs beizutragen und Community-Einblicke beim Spielen zu sehen. Das Overwolf-Overlay ist ein separater Begleiter für Karten- und Relikt-Nachschlagen über dem Spiel. Beide funktionieren problemlos zusammen und sind kostenlos.", esp: "El mod funciona dentro del propio juego, sin aplicaciones externas, y es la forma más fácil de contribuir partidas y ver información de la comunidad mientras juegas. El overlay de Overwolf es un compañero aparte para consultar cartas y reliquias sobre el juego. Funcionan bien juntos y ambos son gratuitos.", fra: "Le mod fonctionne dans le jeu lui-même, sans application externe, et c'est le moyen le plus simple de contribuer des parties et de voir les analyses communautaires en jouant. L'overlay Overwolf est un compagnon séparé pour consulter cartes et reliques par-dessus le jeu. Les deux fonctionnent bien ensemble et sont gratuits.", ita: "La mod gira dentro il gioco stesso, senza app esterne, ed è il modo più semplice per contribuire partite e vedere le analisi della community mentre giochi. L'overlay Overwolf è un compagno separato per consultare carte e reliquie sopra il gioco. Funzionano bene insieme ed entrambi sono gratuiti.", jpn: "モッドはゲーム内で直接動作し、外部アプリは不要。プレイしながらランを提供しコミュニティのインサイトを見る最も簡単な方法です。Overwolf オーバーレイはカードやレリックを参照する別のコンパニオンです。併用でき、どちらも無料です。", kor: "모드는 외부 앱 없이 게임 안에서 직접 실행되며, 플레이하면서 런을 기여하고 커뮤니티 인사이트를 보는 가장 쉬운 방법입니다. Overwolf 오버레이는 게임 위에서 카드와 유물을 찾아보는 별도의 컴패니언입니다. 함께 사용해도 잘 작동하며 둘 다 무료입니다.", pol: "Mod działa w samej grze, bez zewnętrznych aplikacji, i jest najprostszym sposobem na przekazywanie przebiegów i podgląd analiz społeczności podczas gry. Nakładka Overwolf to osobny towarzysz do sprawdzania kart i reliktów nad grą. Działają razem bez problemu i oba są darmowe.", ptb: "O mod roda dentro do próprio jogo, sem aplicativos externos, e é a forma mais fácil de contribuir partidas e ver insights da comunidade enquanto joga. O overlay da Overwolf é um companheiro separado para consultar cartas e relíquias sobre o jogo. Funcionam bem juntos e ambos são gratuitos.", rus: "Мод работает прямо внутри игры, без внешних приложений, и это самый простой способ отправлять забеги и видеть аналитику сообщества во время игры. Оверлей Overwolf — отдельный компаньон для справки по картам и реликвиям поверх игры. Они прекрасно работают вместе, и оба бесплатны.", spa: "El mod funciona dentro del propio juego, sin aplicaciones externas, y es la forma más fácil de contribuir partidas y ver información de la comunidad mientras juegas. El overlay de Overwolf es un compañero aparte para consultar cartas y reliquias sobre el juego. Funcionan bien juntos y ambos son gratuitos.", tha: "ม็อดทำงานภายในตัวเกมเอง ไม่ต้องใช้แอปภายนอก และเป็นวิธีที่ง่ายที่สุดในการส่งการเล่นและดูข้อมูลเชิงลึกของชุมชนระหว่างเล่น ส่วนโอเวอร์เลย์ Overwolf เป็นตัวช่วยแยกต่างหากสำหรับค้นหาการ์ดและเรลิกบนหน้าจอเกม ใช้ร่วมกันได้และฟรีทั้งคู่", tur: "Mod, harici uygulama olmadan oyunun kendi içinde çalışır ve oynarken oyun katkısı yapmanın ve topluluk içgörülerini görmenin en kolay yoludur. Overwolf overlay'i ise oyunun üzerinde kart ve kalıntı aramak için ayrı bir yardımcıdır. Birlikte sorunsuz çalışırlar ve ikisi de ücretsizdir.", zhs: "模组直接在游戏内运行,无需外部应用,是边玩边贡献对局、查看社区洞察的最简单方式。Overwolf 悬浮层是叠加在游戏上查询卡牌和遗物的独立伴侣工具。两者可以同时使用,都是免费的。", zht: "模組直接在遊戲內運行,無需外部應用,是邊玩邊貢獻對局、查看社群洞察的最簡單方式。Overwolf 懸浮層是疊加在遊戲上查詢卡牌和遺物的獨立夥伴工具。兩者可以同時使用,都是免費的。" }, "Get the mod": { eng: "Get the mod", deu: "Hol dir den Mod", esp: "Consigue el mod", fra: "Obtenir le mod", ita: "Scarica la mod", jpn: "モッドを入手", kor: "모드 받기", pol: "Pobierz mod", ptb: "Baixe o mod", rus: "Получить мод", spa: "Consigue el mod", tha: "รับม็อด", tur: "Modu edinin", zhs: "获取模组", zht: "取得模組" }, + "Any Color": { eng: "Any Color", deu: "Alle Farben", esp: "Todos los colores", fra: "Toutes les couleurs", ita: "Tutti i colori", jpn: "すべての色", kor: "모든 색상", pol: "Wszystkie kolory", ptb: "Todas as cores", rus: "Все цвета", spa: "Todos los colores", tha: "ทุกสี", tur: "Tüm Renkler", zhs: "所有颜色", zht: "所有顏色" }, + "Any Type": { eng: "Any Type", deu: "Alle Typen", esp: "Todos los tipos", fra: "Tous les types", ita: "Tutti i tipi", jpn: "すべてのタイプ", kor: "모든 유형", pol: "Wszystkie typy", ptb: "Todos os tipos", rus: "Все типы", spa: "Todos los tipos", tha: "ทุกประเภท", tur: "Tüm Türler", zhs: "所有类型", zht: "所有型別" }, + "Any Rarity": { eng: "Any Rarity", deu: "Alle Seltenheiten", esp: "Todas las rarezas", fra: "Toutes les raretés", ita: "Tutte le rarità", jpn: "すべてのレアリティ", kor: "모든 희귀도", pol: "Wszystkie rzadkości", ptb: "Todas as raridades", rus: "Все редкости", spa: "Todas las rarezas", tha: "ทุกความหายาก", tur: "Tüm Nadirlikler", zhs: "所有稀有度", zht: "所有稀有度" }, + "Any Cost": { eng: "Any Cost", deu: "Alle Kosten", esp: "Todos los costes", fra: "Tous les coûts", ita: "Tutti i costi", jpn: "すべてのコスト", kor: "모든 비용", pol: "Wszystkie koszty", ptb: "Todos os custos", rus: "Все стоимости", spa: "Todos los costos", tha: "ทุกคอสต์", tur: "Tüm maliyetler", zhs: "所有费用", zht: "所有費用" }, + "Any Keyword": { eng: "Any Keyword", deu: "Alle Schlüsselwörter", esp: "Todas las palabras clave", fra: "Tous les mots-clés", ita: "Tutte le parole chiave", jpn: "すべてのキーワード", kor: "모든 키워드", pol: "Wszystkie słowa kluczowe", ptb: "Todas as palavras-chave", rus: "Все ключевые слова", spa: "Todas las palabras clave", tha: "คีย์เวิร์ดทั้งหมด", tur: "Tüm Anahtar Kelimeler", zhs: "所有关键词", zht: "所有關鍵詞" }, + "Any Pool": { eng: "Any Pool", deu: "Alle Pools", esp: "Todos los grupos", fra: "Tous les groupes", ita: "Tutti i gruppi", jpn: "すべてのプール", kor: "모든 풀", pol: "Wszystkie pule", ptb: "Todos os grupos", rus: "Все группы", spa: "Todos los grupos", tha: "ทุกกลุ่ม", tur: "Tüm Havuzlar", zhs: "所有池", zht: "所有池" }, + "Any Character": { eng: "Any Character", deu: "Alle Charaktere", esp: "Todos los personajes", fra: "Tous les personnages", ita: "Tutti i personaggi", jpn: "すべてのキャラクター", kor: "모든 캐릭터", pol: "Wszystkie postacie", ptb: "Todos os personagens", rus: "Все персонажи", spa: "Todos los personajes", tha: "ตัวละครทั้งหมด", tur: "Tüm Karakterler", zhs: "所有角色", zht: "所有角色" }, + "Any Act": { eng: "Any Act", deu: "Alle Akte", esp: "Todos los actos", fra: "Tous les actes", ita: "Tutti gli atti", jpn: "すべての幕", kor: "모든 막", pol: "Wszystkie akty", ptb: "Todos os atos", rus: "Все акты", spa: "Todos los actos", tha: "ทุกองก์", tur: "Tüm Perdeler", zhs: "所有章节", zht: "所有章節" }, + "Any Story": { eng: "Any Story", deu: "Alle Geschichten", esp: "Todas las historias", fra: "Toutes les histoires", ita: "Tutte le storie", jpn: "すべてのストーリー", kor: "모든 스토리", pol: "Wszystkie historie", ptb: "Todas as histórias", rus: "Все истории", spa: "Todas las historias", tha: "ทุกเรื่องราว", tur: "Tüm Hikayeler", zhs: "所有故事", zht: "所有故事" }, + "Any Stack Type": { eng: "Any Stack Type", deu: "Alle Stapeltypen", esp: "Todos los tipos de acumulación", fra: "Tous les types de cumul", ita: "Tutti i tipi di accumulo", jpn: "すべてのスタックタイプ", kor: "모든 중첩 유형", pol: "Wszystkie typy kumulacji", ptb: "Todos os tipos de acúmulo", rus: "Все типы стаков", spa: "Todos los tipos de acumulación", tha: "ทุกประเภทการซ้อน", tur: "Tüm Yığın Türleri", zhs: "所有叠加类型", zht: "所有疊加型別" }, + "Any Difficulty": { eng: "Any Difficulty", deu: "Alle Schwierigkeitsgrade", esp: "Todas las dificultades", fra: "Toutes les difficultés", ita: "Tutte le difficoltà", jpn: "すべての難易度", kor: "모든 난이도", pol: "Wszystkie poziomy trudności", ptb: "Todas as dificuldades", rus: "Все сложности", spa: "Todas las dificultades", tha: "ทุกระดับความยาก", tur: "Tüm Zorluklar", zhs: "所有难度", zht: "所有難度" }, + "Any Category": { eng: "Any Category", deu: "Alle Kategorien", esp: "Todas las categorías", fra: "Toutes les catégories", ita: "Tutte le categorie", jpn: "すべてのカテゴリ", kor: "모든 카테고리", pol: "Wszystkie kategorie", ptb: "Todas as categorias", rus: "Все категории", spa: "Todas las categorías", tha: "ทุกหมวดหมู่", tur: "Tüm Kategoriler", zhs: "所有分类", zht: "所有分類" }, + "Any Card Type": { eng: "Any Card Type", deu: "Alle Kartentypen", esp: "Todos los tipos de carta", fra: "Tous les types de carte", ita: "Tutti i tipi di carta", jpn: "すべてのカードタイプ", kor: "모든 카드 유형", pol: "Wszystkie typy kart", ptb: "Todos os tipos de carta", rus: "Все типы карт", spa: "Todos los tipos de carta", tha: "ทุกประเภทการ์ด", tur: "Tüm Kart Türleri", zhs: "所有卡牌类型", zht: "所有卡牌型別" }, + "Any Ancient": { eng: "Any Ancient", deu: "Alle Uralten", esp: "Todos los ancestrales", fra: "Tous les ancestraux", ita: "Tutti gli antichi", jpn: "すべてのエンシェント", kor: "모든 고대인", pol: "Wszyscy Pradawni", ptb: "Todos os ancestrais", rus: "Все Древние", spa: "Todos los ancestrales", tha: "ทุกผู้โบราณ", tur: "Tüm Kadimler", zhs: "所有远古者", zht: "所有遠古者" }, "Free, open, and you can unsubscribe from the Workshop at any time.": { eng: "Free, open, and you can unsubscribe from the Workshop at any time.", deu: "Kostenlos, offen, und du kannst das Workshop-Abo jederzeit beenden.", esp: "Gratis, abierto, y puedes cancelar la suscripción del Workshop en cualquier momento.", fra: "Gratuit, ouvert, et vous pouvez vous désabonner du Workshop à tout moment.", ita: "Gratuita, aperta, e puoi annullare l'iscrizione dal Workshop in qualsiasi momento.", jpn: "無料でオープン。ワークショップの登録はいつでも解除できます。", kor: "무료이며 개방적이고, 언제든지 창작마당 구독을 취소할 수 있습니다.", pol: "Darmowy, otwarty, a subskrypcję w Workshop możesz anulować w każdej chwili.", ptb: "Gratuito, aberto, e você pode cancelar a inscrição na Workshop a qualquer momento.", rus: "Бесплатно, открыто, и вы можете отписаться в Мастерской в любой момент.", spa: "Gratis, abierto, y puedes cancelar la suscripción del Workshop en cualquier momento.", tha: "ฟรี เปิดกว้าง และยกเลิกการติดตามใน Workshop ได้ทุกเมื่อ", tur: "Ücretsiz, açık ve Atölye aboneliğinizi istediğiniz zaman iptal edebilirsiniz.", zhs: "免费开放,你可以随时在创意工坊取消订阅。", zht: "免費開放,你可以隨時在工作坊取消訂閱。" }, };