diff --git a/content/es/guide/v10/signals.md b/content/es/guide/v10/signals.md new file mode 100644 index 000000000..df0c8a093 --- /dev/null +++ b/content/es/guide/v10/signals.md @@ -0,0 +1,585 @@ +--- +name: Signals (Señales) +description: 'Signals: estado reactivo componible con renderización automática' +--- + +# Signals + +Signals, señales en español, son primitivas reactivas para gestionar el estado de las aplicaciones. + +Lo que hacen únicos a los Signals es que los cambios de estado actualizan automáticamente los componentes y la interfaz de usuario de la forma más eficiente posible. La vinculación automática de estados y el seguimiento de dependencias permiten a Signals ofrecer una ergonomía y una productividad excelentes, al tiempo que elimina las pegas más comunes en la gestión de estados. + +Signals son eficaces en aplicaciones de cualquier tamaño, con ergonomías que aceleran el desarrollo de aplicaciones pequeñas y características de rendimiento que garantizan que las aplicaciones de cualquier tamaño sean rápidas por defecto. + +--- + +**Importante** + +Esta guía tratará sobre el uso de Signals en Preact, y aunque es aplicable tanto a la librería Core como a React, habrá algunas diferencias de uso. Las mejores referencias para su uso están en sus respectivas documentaciones: `@preact/signals-core`, `@preact/signals-react`. + +--- + +
Conteo: {value}
+ +Conteo: {count}
+ +{state.completed}
; +} +``` + +Si quieres aprender más de como context funciona, diríge a la [documentación de Context](https://preactjs.com/guide/v10/context). + +## Estado local con signals + +La mayor parte del estado de la aplicación termina siendo pasado usando props y context. Sin embargo, hay muchos escenarios donde los componentes tienen su propio estado interno que es específico para ese componente. Puesto que no hay razón para que este estado forme parte del estado global de la lógica del negocio de la aplicación, debería limitarse al componente que lo necesita. En estos escenarios, podemos crear signals al igual que signals calculados directamente dentro del componente usando los hooks `useSignal()` y `useComputed()`: + +```jsx +import { useSignal, useComputed } from "@preact/signals"; + +function Counter() { + const count = useSignal(0); + const double = useComputed(() => count.value * 2); + + return ( +{count} x 2 = {double}
+ +{count.value}
; +} + +function Optimized() { + // El texto automaticamente cambia sin volver a renderizar el componente: + return{count}
; +} +``` + +Para habilitar esta optimización, pase el signal a JSX en lugar de acceder a su propieda `.value`. + +Una optimización de renderizado similar también es soportada cuando se pasan signals como props en elementos DOM. + +## API + +Esta sección es una visión general de la API. Pretende ser una referencia rápida para quienes ya saben utilizar los signals y necesitan un recordatorio de lo que está disponible. + +### signal(initialValue) + +Crea un nuevo signal con el argumento dado como su valor inicial: + +```js +const count = signal(0); +``` + +Al crear signals dentro de un componente, utilice la variante del hook: `useSignal(initialValue)`. + +El signal devuleto tienen una propiedad `.value` que puede ser get o set para leer o escribir su valor. Para leer un signal sin suscribirse a ella, utilice `signal.peek()`. + +### computed(fn) + +Crea un nuevo signal que es calculada basado en los valores de otros signals. El signal calculado es de sólo lectura, y su valor se actualiza automáticamente cuando cambia cualquier signal a la que se acceda desde la función callback. + +```js +const name = signal("Jane"); +const surname = signal("Doe"); + +const fullName = computed(() => `${name.value} ${surname.value}`); +``` + +Al crear un signal calculado dentro de un componente, utilice la variante del hook: `useComputed(fn)`. + +### effect(fn) + +Para ejecutar código arbitario en respuesta a los cambios de signal, podemos utilizar `effect(fn)`. De forma similar a los signals calculados, los effects rastrean a qué signals se accede y vuelven a ejecutar su callback cuando esos signals cambian. Si el callback devuelve una función, ésta se ejecutará antes de la siguiente actualización del valor. A diferencia de los signals calculados, `effect()` no devuelve un signal, ese el final de una secuencia de cambios. + +```js +const name = signal("Jane"); + +// Registra a la consola cuando `name` cambia: +effect(() => console.log('Hola', name.value)); +// Registra: "Hola Jane" + +name.value = "John"; +// Registra: "Hola John" +``` + +Al responder a los cambios de signal dentro de un componente, utilice la variente del hook: `useSignalEffect(fn)`. + +### batch(fn) + +La funcion `batch(fn)` puede ser usado para combinar varias actualizaciones de valor en una sola "asignación" al final del callback proporcionado. Los batches pueden anidarse y los cambios sólo se envían una vez que finaliza el callback más externo. El acceso a un signal que ha sido modificado dentro un batch reflejará su valor actualizado. + +```js +const name = signal("Jane"); +const surname = signal("Doe"); + +// Combina ambas escrituras en una sola actualización +batch(() => { + name.value = "John"; + surname.value = "Smith"; +}); +``` + +### untracked(fn) + +La función `untracked(fn)` puede ser usado para acceder al valor de varios signals sin suscribirse a ellos. + +```js +const name = signal("Jane"); +const surname = signal("Doe"); + +effect(() => { + untracked(() => { + console.log(`${name.value} ${surname.value}`) + }) +}) +``` diff --git a/src/assets/contributors.json b/src/assets/contributors.json index 0ad84e6ae..1a871f39c 100644 --- a/src/assets/contributors.json +++ b/src/assets/contributors.json @@ -1,282 +1,283 @@ [ - "marvinhagemeister", - "developit", - "andrewiggins", - "JoviDeCroock", - "rschristian", - "robertknight", - "cristianbote", - "ForsakenHarmony", - "prateekbh", - "jviide", - "AlexGalays", - "rpetrich", - "sventschui", - "k1r0s", - "fekete965", - "38elements", - "NekR", - "mochiya98", - "pmkroeker", - "mkxml", - "wardpeet", - "shoonia", - "AimWhy", - "valotas", - "tanhauhau", - "braddunbar", - "KevinDoughty", - "reznord", - "kristoferbaxter", - "gpoitch", - "natevw", - "triallax", - "egdbear", - "jmrog", - "samsam-ahmadi", - "Rafi993", - "vutran", - "billneff79", - "calebeby", - "zouhir", - "yaodingyd", - "lilnasy", - "Download", - "Scott-Fischer", - "harish2704", - "garybernhardt", - "Alexendoo", - "JiLiZART", - "kitten", - "sangupta", - "staeke", - "yuqianma", - "paranoidjk", - "ouzhenkun", - "Austaras", - "Connormiha", - "craftedsystems", - "Almo7aya", - "aralroca", - "btm6084", - "btk5h", - "gcraftyg", - "guybedford", - "hadeeb", - "ngyikp", - "lukeed", - "LukasBombach", - "jridgewell", - "programbo", - "johakr", - "gengjiawen", - "jakearchibald", - "futantan", - "teodragovic", - "niedzielski", - "timgates42", - "siddharthkp", - "utkarshkukreti", - "vaneenige", - "boarwell", - "sebastiandotdev", - "deadem", - "intrnl", - "juicelink", - "mseddon", - "polemius", - "rmacklin", - "wojtczal", - "cbbfcd", - "3846masa", - "asolove", - "danielbayerlein", - "jrf0110", - "RRDAWLX", - "ddayguerrero", - "jamesb3ll", - "jramanat-oracle", - "kuronijin", - "ivantm", - "marconi1992", - "cmlenz", - "Boshen", - "billti", - "bmeurer", - "4cm4k1", - "andybons", - "amilajack", - "impronunciable", - "zalishchuk", - "btd", - "DonIsaac", - "feross", - "ilogico", - "Popovkov57", - "PodaruDragos", - "mitranim", - "namankheterpal", - "kruczy", - "MicahZoltu", - "maxbrieiev", - "matthewp", - "Verseth", - "ianobermiller", - "jackmoore", - "scurker", - "jeremy-coleman", - "jdanford", - "jmfirth", - "9renpoto", - "wildlyinaccurate", - "squidfunk", - "shinyama-k", - "mbrukman", - "mikestead", - "Geo25rey", - "kaisermann", - "ctrlplusb", - "z11h", - "AlexanderOtavka", - "toniopelo", - "firatsarlar", - "hikouki", - "david-nordvall", - "vpzomtrrfrt", - "vitormalencar", - "lcxfs1991", - "hassanbazzi", - "dragomano", - "joaolucasl", - "rosskhanas", - "ddprrt", - "huruji", - "pazguille", - "helloworld-hellohyeon", - "addyosmani", - "chakrakan", - "n0hack", - "tao1991123", - "blenderskool", - "ZUR1C4T0", - "David-zzg", - "Nayejun", - "alexkrolick", - "rykdesjardins", - "ieeah", - "Worble", - "shaedrich", - "yhau1989", - "rcowsill", - "mikekidder", - "Marabyte", - "dandv", - "sapegin", - "TechQuery", - "darvi-sh", - "ryuyz", - "digitalica", - "pradeepb6", - "processprocess", - "Nicolas-Orozco", - "mozmorris", - "ofgo", - "tinymachine", - "ttntm", - "Vrq", - "kuldeepkeshwar", - "mikaturk", - "nbyfleet", - "malcolmyu", - "pl12133", - "thawkin3", - "BartWaardenburg", - "Anwardo", - "Otto-AA", - "KiritaniAyaka", - "Byacrya", - "guaiamum", - "masto", - "belohlavek", - "Duske", - "Ende93", - "kidonng", - "Khaledgarbaya", - "joeldenning", - "EthanStandel", - "fabian-hiller", - "montogeek", - "jsejcksn", - "Jinex2012", - "gabrielcoronel", - "bspaulding", - "janbiasi", - "bhollis", - "stevenle", - "ooade", - "shelacek", - "zgoda", - "kolodziejczakM", - "PuruVJ", - "TimDaub", - "rkostrzewski", - "jgierer12", - "psabharwal123", - "harshitkumar31", - "StephanBijzitter", - "jonathantneal", - "jamesgeorge007", - "thangngoc89", - "SaraVieira", - "knight-bubble", - "DenysVuika", - "VanTanev", - "johnhaitas", - "zubhav", - "lyubomir-bozhinov", - "lwakefield", - "kentr", - "framp", - "davi-mbatista", - "dependabot-support", - "kevinweber", - "Akiyamka", - "pimdewit", - "heithemmoumni", - "bz2", - "jpnelson", - "SolarLiner", - "einSelbst", - "fisker", - "MichaelDeBoey", - "watsonarw", - "jnpwebdeveloper", - "seroy", - "yyx990803", - "FredKSchott", - "PepsRyuu", - "piotr-cz", - "takurinton", - "EmilTholin", - "matiasperz", - "jbt", - "wilberforce", - "dbetteridge", - "michael-erskine", - "AjayPoshak", - "ElMassimo", - "liamdon", - "sapphi-red", - "epiqueras", - "leerob", - "eddyw", - "CodyJasonBennett", - "XantreDev", - "billybimbob", - "nichoth", - "elliotwaite", - "Xstoudi", - "dcporter", - "prinsss", - "sand4rt" + "marvinhagemeister", + "developit", + "andrewiggins", + "JoviDeCroock", + "rschristian", + "robertknight", + "cristianbote", + "ForsakenHarmony", + "prateekbh", + "jviide", + "AlexGalays", + "rpetrich", + "sventschui", + "k1r0s", + "fekete965", + "38elements", + "NekR", + "mochiya98", + "pmkroeker", + "mkxml", + "wardpeet", + "shoonia", + "AimWhy", + "valotas", + "tanhauhau", + "braddunbar", + "KevinDoughty", + "reznord", + "kristoferbaxter", + "gpoitch", + "natevw", + "triallax", + "egdbear", + "jmrog", + "samsam-ahmadi", + "Rafi993", + "vutran", + "billneff79", + "calebeby", + "zouhir", + "yaodingyd", + "lilnasy", + "Download", + "Scott-Fischer", + "harish2704", + "garybernhardt", + "Alexendoo", + "JiLiZART", + "kitten", + "sangupta", + "staeke", + "yuqianma", + "paranoidjk", + "ouzhenkun", + "Austaras", + "Connormiha", + "craftedsystems", + "Almo7aya", + "aralroca", + "btm6084", + "btk5h", + "gcraftyg", + "guybedford", + "hadeeb", + "ngyikp", + "lukeed", + "LukasBombach", + "jridgewell", + "programbo", + "johakr", + "gengjiawen", + "jakearchibald", + "futantan", + "teodragovic", + "niedzielski", + "timgates42", + "siddharthkp", + "utkarshkukreti", + "vaneenige", + "boarwell", + "sebastiandotdev", + "deadem", + "intrnl", + "juicelink", + "mseddon", + "polemius", + "rmacklin", + "wojtczal", + "cbbfcd", + "3846masa", + "asolove", + "danielbayerlein", + "jrf0110", + "RRDAWLX", + "ddayguerrero", + "jamesb3ll", + "jramanat-oracle", + "kuronijin", + "ivantm", + "marconi1992", + "cmlenz", + "Boshen", + "billti", + "bmeurer", + "4cm4k1", + "andybons", + "amilajack", + "impronunciable", + "zalishchuk", + "btd", + "DonIsaac", + "feross", + "ilogico", + "Popovkov57", + "PodaruDragos", + "mitranim", + "namankheterpal", + "kruczy", + "MicahZoltu", + "maxbrieiev", + "matthewp", + "Verseth", + "ianobermiller", + "jackmoore", + "scurker", + "jeremy-coleman", + "jdanford", + "jmfirth", + "9renpoto", + "wildlyinaccurate", + "squidfunk", + "shinyama-k", + "mbrukman", + "mikestead", + "Geo25rey", + "kaisermann", + "ctrlplusb", + "z11h", + "AlexanderOtavka", + "toniopelo", + "firatsarlar", + "hikouki", + "david-nordvall", + "vpzomtrrfrt", + "vitormalencar", + "lcxfs1991", + "hassanbazzi", + "dragomano", + "joaolucasl", + "rosskhanas", + "ddprrt", + "huruji", + "pazguille", + "helloworld-hellohyeon", + "addyosmani", + "chakrakan", + "n0hack", + "tao1991123", + "blenderskool", + "ZUR1C4T0", + "David-zzg", + "Nayejun", + "alexkrolick", + "rykdesjardins", + "ieeah", + "Worble", + "shaedrich", + "yhau1989", + "rcowsill", + "mikekidder", + "Marabyte", + "dandv", + "sapegin", + "TechQuery", + "darvi-sh", + "ryuyz", + "digitalica", + "pradeepb6", + "processprocess", + "Nicolas-Orozco", + "mozmorris", + "ofgo", + "tinymachine", + "ttntm", + "Vrq", + "kuldeepkeshwar", + "mikaturk", + "nbyfleet", + "malcolmyu", + "pl12133", + "thawkin3", + "BartWaardenburg", + "Anwardo", + "Otto-AA", + "KiritaniAyaka", + "Byacrya", + "guaiamum", + "masto", + "belohlavek", + "Duske", + "Ende93", + "kidonng", + "Khaledgarbaya", + "joeldenning", + "EthanStandel", + "fabian-hiller", + "montogeek", + "jsejcksn", + "Jinex2012", + "gabrielcoronel", + "bspaulding", + "janbiasi", + "bhollis", + "stevenle", + "ooade", + "shelacek", + "zgoda", + "kolodziejczakM", + "PuruVJ", + "TimDaub", + "rkostrzewski", + "jgierer12", + "psabharwal123", + "harshitkumar31", + "StephanBijzitter", + "jonathantneal", + "jamesgeorge007", + "thangngoc89", + "SaraVieira", + "knight-bubble", + "DenysVuika", + "VanTanev", + "johnhaitas", + "zubhav", + "lyubomir-bozhinov", + "lwakefield", + "kentr", + "framp", + "davi-mbatista", + "dependabot-support", + "kevinweber", + "Akiyamka", + "pimdewit", + "heithemmoumni", + "bz2", + "jpnelson", + "SolarLiner", + "einSelbst", + "fisker", + "MichaelDeBoey", + "watsonarw", + "jnpwebdeveloper", + "seroy", + "yyx990803", + "FredKSchott", + "PepsRyuu", + "piotr-cz", + "takurinton", + "EmilTholin", + "matiasperz", + "jbt", + "wilberforce", + "dbetteridge", + "michael-erskine", + "AjayPoshak", + "ElMassimo", + "liamdon", + "sapphi-red", + "epiqueras", + "leerob", + "eddyw", + "CodyJasonBennett", + "XantreDev", + "billybimbob", + "nichoth", + "elliotwaite", + "Xstoudi", + "dcporter", + "prinsss", + "sand4rt", + "EGAMAGZ" ] diff --git a/src/config.json b/src/config.json index 18a03b215..207afcc7f 100644 --- a/src/config.json +++ b/src/config.json @@ -59,11 +59,13 @@ "help": { "en": "Help", "kr": "정답 확인", - "ru": "Помощь" + "ru": "Помощь", + "es": "Ayuda" }, "solve": { "en": "Solve", - "ru": "Решить" + "ru": "Решить", + "es": "Resolver" } } }, @@ -86,6 +88,7 @@ "href": "/tutorial", "name": { "en": "Tutorial", + "es": "Tutorial", "zh": "教程", "kr": "튜토리얼", "ru": "Учебник" @@ -112,7 +115,7 @@ "de": "Mehr", "pt-br": "Sobre", "ja": "Preactについて", - "es": "Sobre", + "es": "Acerca de", "zh": "关于", "kr": "소개", "ru": "Разное" @@ -190,6 +193,7 @@ "path": "/blog", "name": { "en": "Blog", + "es": "Blog", "zh": "博客", "kr": "블로그", "ru": "Блог" @@ -199,6 +203,7 @@ "path": "/repl", "name": { "en": "REPL", + "es": "REPL", "zh": "在线试用" } } @@ -208,6 +213,7 @@ { "name": { "en": "Introduction", + "es": "Introducción", "de": "Einführung", "zh": "介绍", "kr": "개요", @@ -223,7 +229,8 @@ "de": "Los geht's", "zh": "开始上手", "kr": "시작하기", - "ru": "Первые шаги" + "ru": "Первые шаги", + "es": "Para empezar" } }, { @@ -234,7 +241,8 @@ "pt-br": "o que há de novo", "zh": "新鲜功能", "kr": "새로운 기능", - "ru": "Что нового?" + "ru": "Что нового?", + "es": "¿Qué hay de nuevo?" } }, { @@ -246,7 +254,8 @@ "de": "Migration von 8.x", "zh": "从 8.x 版本更新", "kr": "8.x에서 업그레이드하기", - "ru": "Обновление с 8.x" + "ru": "Обновление с 8.x", + "es": "Actualizar desde 8.x" } }, { @@ -258,7 +267,8 @@ "de": "Tutorial", "zh": "教程", "kr": "튜토리얼", - "ru": "Учебник" + "ru": "Учебник", + "es": "Tutorial" } } ] @@ -268,7 +278,8 @@ "en": "Essentials", "zh": "基础", "kr": "필수 항목", - "ru": "Основы" + "ru": "Основы", + "es": "Esenciales" }, "routes": [ { @@ -280,7 +291,8 @@ "de": "Komponenten", "zh": "组件", "kr": "컴포넌트", - "ru": "Компоненты" + "ru": "Компоненты", + "es": "Componentes" } }, { @@ -292,7 +304,8 @@ "de": "Hooks", "zh": "钩子", "kr": "훅", - "ru": "Хуки" + "ru": "Хуки", + "es": "Hooks" } }, { @@ -313,7 +326,8 @@ "de": "Formulare", "zh": "表单", "kr": "폼", - "ru": "Формы" + "ru": "Формы", + "es": "Formularios" } }, { @@ -325,7 +339,8 @@ "de": "Referenzen", "zh": "引用", "kr": "레퍼런스", - "ru": "Рефы" + "ru": "Рефы", + "es": "Referencias" } }, { @@ -337,7 +352,8 @@ "de": "Kontext", "zh": "上下文", "kr": "컨텍스트", - "ru": "Контекст" + "ru": "Контекст", + "es": "Contexto" } } ] @@ -347,7 +363,8 @@ "en": "Debug & Test", "zh": "调试与测试", "kr": "디버그 & 테스트", - "ru": "Отладка и тестирование" + "ru": "Отладка и тестирование", + "es": "Depuración y Pruebas" }, "routes": [ { @@ -359,7 +376,8 @@ "de": "Entwickler-Tools", "zh": "调试工具", "kr": "디버깅 도구", - "ru": "Инструменты отладки" + "ru": "Инструменты отладки", + "es": "Heramientas de depuración" } }, { @@ -371,7 +389,8 @@ "de": "Preact Testing Library", "zh": "Preact 测试库", "kr": "Preact 테스팅 라이브러리", - "ru": "Preact Testing Library" + "ru": "Preact Testing Library", + "es": "Librería de pruebas de Preact" } }, { @@ -383,7 +402,8 @@ "de": "Unit-Tests mit Enzyme", "kr": "Enzyme를 이용한 유닛 테스트", "zh": "使用 Enzyme 进行单元测试", - "ru": "Модульное тестирование с помощью Enzyme" + "ru": "Модульное тестирование с помощью Enzyme", + "es": "Pruebas unitarias con Enzyme" } } ] @@ -393,7 +413,8 @@ "en": "React compatibility", "zh": "React 兼容性", "kr": "React 호환성", - "ru": "Совместимость с React" + "ru": "Совместимость с React", + "es": "Compatibilidad con React" }, "routes": [ { @@ -405,7 +426,8 @@ "de": "Unterschiede zu React", "kr": "React와의 차이점", "zh": "与 React 的区别", - "ru": "Отличия от React" + "ru": "Отличия от React", + "es": "Diferencias con React" } }, { @@ -417,7 +439,8 @@ "de": "Wechsel zu Preact", "kr": "Preact로 전환", "zh": "从 React 转到 Preact", - "ru": "Переход на Preact" + "ru": "Переход на Preact", + "es": "Cambiando a Preact" } } ] @@ -428,7 +451,8 @@ "de": "Fortgeschritten", "zh": "进阶", "kr": "고급", - "ru": "Дополнительно" + "ru": "Дополнительно", + "es": "Avanzado" }, "routes": [ { @@ -440,7 +464,8 @@ "de": "API Referenz", "zh": "API 参考", "kr": "API 참조", - "ru": "Справочник по API" + "ru": "Справочник по API", + "es": "Referencias de la API" } }, { @@ -452,7 +477,8 @@ "de": "Web Components", "zh": "Web 组件", "kr": "웹 컴포넌트", - "ru": "Веб-компоненты" + "ru": "Веб-компоненты", + "es": "Web Components" } }, { @@ -464,7 +490,21 @@ "de": "Server-Side Rendering", "zh": "服务端渲染", "kr": "서버 측 렌더링", - "ru": "Рендеринг на стороне сервера" + "ru": "Рендеринг на стороне сервера", + "es": "Renderizado del lado del servidor (SSR)" + } + }, + { + "path": "/external-dom-mutations", + "name": { + "en": "External DOM Mutations", + "pt-br": "Mutações do DOM externas", + "ja": "Preactのステート管理の範囲外のDOMとの連携", + "de": "Externe DOM Mutationen", + "zh": "外部 DOM 修改", + "kr": "외부 DOM 변경", + "ru": "Внешние мутации DOM", + "es": "Mutaciones externas del DOM" } }, { @@ -475,7 +515,8 @@ "de": "Optionen", "zh": "选项钩子", "kr": "옵션 훅", - "ru": "Опционные хуки" + "ru": "Опционные хуки", + "es": "Opciones de Hooks" } }, { @@ -486,7 +527,8 @@ "path": "/no-build-workflows", "name": { "en": "No-Build Workflows", - "zh": "无构建工具工作流" + "zh": "无构建工具工作流", + "es": "Workflows sin construcción" } } ] @@ -500,7 +542,8 @@ "pt-br": "Começando", "de": "Los geht's", "zh": "开始上手", - "ru": "Первые шаги" + "ru": "Первые шаги", + "es": "Para empezar" } }, { @@ -510,7 +553,8 @@ "pt-br": "Diferenças do React", "de": "Unterschiede zu React", "zh": "与 React 的区别", - "ru": "Отличия от React" + "ru": "Отличия от React", + "es": "Diferencias con React" } }, { @@ -520,7 +564,8 @@ "pt-br": "Mudando para Preact", "de": "Wechsel zu Preact", "zh": "从 React 转到 Preact", - "ru": "Переход на Preact" + "ru": "Переход на Preact", + "es": "Cambiando a Preact" } }, { @@ -530,7 +575,8 @@ "pt-br": "Tipos de Componentes", "de": "Komponenten-Typen", "zh": "组件类型", - "ru": "Типы компонентов" + "ru": "Типы компонентов", + "es": "Tipos de Componentes" } }, { @@ -540,7 +586,8 @@ "pt-br": "Referência da API", "de": "API Referenz", "zh": "API 参考", - "ru": "Справочник по API" + "ru": "Справочник по API", + "es": "Referencias de la API" } }, { @@ -550,7 +597,8 @@ "pt-br": "Formulários", "de": "Formulare", "zh": "表单", - "ru": "Формы" + "ru": "Формы", + "es": "Formularios" } }, { @@ -558,7 +606,8 @@ "name": { "en": "Linked State", "zh": "关联状态", - "ru": "Связанное состояние" + "ru": "Связанное состояние", + "es": "Estado vinculado" } }, { @@ -568,7 +617,8 @@ "pt-br": "Mutações do DOM externas", "de": "Externe DOM Mutationen", "zh": "外部 DOM 修改", - "ru": "Внешние мутации DOM" + "ru": "Внешние мутации DOM", + "es": "Mutaciones externas del DOM" } }, { @@ -578,7 +628,8 @@ "pt-br": "Extendendo Componentes", "de": "Komponente Erweitern", "zh": "扩展组件", - "ru": "Расширение компонентов" + "ru": "Расширение компонентов", + "es": "Extender Componente" } }, { @@ -588,7 +639,8 @@ "pt-br": "Teste unitado com Enzyme", "de": "Unit-Tests mit Enzyme", "zh": "使用 Enzyme 进行单元测试", - "ru": "Модульное тестирование с помощью Enzyme" + "ru": "Модульное тестирование с помощью Enzyme", + "es": "Pruebas unitarias con Enzyme" } }, { @@ -596,7 +648,8 @@ "name": { "en": "Progressive Web Apps", "zh": "渐进式 Web 应用", - "ru": "Прогрессивные веб-приложения" + "ru": "Прогрессивные веб-приложения", + "es": "Aplicaciones Web Progresivas" } } ] @@ -637,11 +690,13 @@ "date": "2024-08-06", "name": { "en": "Build your own Island Components", - "ru": "Создание собственных островных компонентов" + "ru": "Создание собственных островных компонентов", + "es": "Construye tus propios componentes de isla" }, "excerpt": { "en": "Demystifying how island architechture works and being able to setup your own, using tools you already have around you.", - "ru": "Вы узнаете, как работает островная архитектура, и сможете создать свою собственную, используя инструменты, которые уже есть у вас под рукой." + "ru": "Вы узнаете, как работает островная архитектура, и сможете создать свою собственную, используя инструменты, которые уже есть у вас под рукой.", + "es": "Desmitificando cómo funciona la arquitectura de islas y poder configurar la tuya propia, utilizando las herramientas que ya tienes a tu alrededor." } }, { @@ -649,11 +704,13 @@ "date": "2024-08-06", "name": { "en": "Prerendering with Preset Vite", - "ru": "Предварительный рендеринг с пресетом Vite" + "ru": "Предварительный рендеринг с пресетом Vite", + "es": "Prerenderizado con Preset Vite" }, "excerpt": { "en": "It's been a half-year since our prerendering plugin has somewhat quietly become available in `@preact/preset-vite`, so let's talk about it, our history, and the ecosystem at large", - "ru": "Прошло полгода с тех пор, как наш плагин для пререндеринга стал доступен в `@preact/preset-vite`, так что давайте поговорим о нем, о нашей истории и об экосистеме в целом." + "ru": "Прошло полгода с тех пор, как наш плагин для пререндеринга стал доступен в `@preact/preset-vite`, так что давайте поговорим о нем, о нашей истории и об экосистеме в целом.", + "es": "Hace medio año que nuestro plugin de preprocesamiento está disponible en `@preact/preset-vite`, así que hablemos de él, de nuestra historia y del ecosistema en general." } }, { @@ -661,11 +718,13 @@ "date": "2024-05-24", "name": { "en": "Preact X, a story of stability", - "ru": "Preact X, история стабильности" + "ru": "Preact X, история стабильности", + "es": "Preact X, una historia de estabilidad" }, "excerpt": { "en": "Preact X has been released for five years, let's go over all the exciting things that have happened.", - "ru": "Preact X выпускается уже пять лет, давайте вспомним всё, что произошло за это время." + "ru": "Preact X выпускается уже пять лет, давайте вспомним всё, что произошло за это время.", + "es": "Preact X ha sido lanzado durante cinco años, repasemos todas las cosas emocionantes que han sucedido." } }, { @@ -709,67 +768,78 @@ { "path": "/tutorial", "name": { - "en": "Learn Preact" + "en": "Learn Preact", + "es": "Aprende Preact" } }, { "path": "/tutorial/01-vdom", "name": { - "en": "Virtual DOM" + "en": "Virtual DOM", + "es": "DOM Virtual" } }, { "path": "/tutorial/02-events", "name": { - "en": "Events" + "en": "Events", + "es": "Eventos" } }, { "path": "/tutorial/03-components", "name": { - "en": "Components" + "en": "Components", + "es": "Componentes" } }, { "path": "/tutorial/04-state", "name": { - "en": "State" + "en": "State", + "es": "Estado" } }, { "path": "/tutorial/05-refs", "name": { - "en": "Refs" + "en": "Refs", + "es": "Referencias (Refs)" } }, { "path": "/tutorial/06-context", "name": { - "en": "Context" + "en": "Context", + "es": "Contexto" } }, { "path": "/tutorial/07-side-effects", "name": { - "en": "Side Effects" + "en": "Side Effects", + "es": "Efectos Secundarios" } }, { "path": "/tutorial/08-keys", "name": { - "en": "Keys" + "en": "Keys", + "es": "Claves" } }, { "path": "/tutorial/09-error-handling", "name": { - "en": "Error Handling" + "en": "Error Handling", + "es": "Manejo de Errores" } }, { "path": "/tutorial/10-links", "name": { - "en": "Congratulations!" + "en": "Congratulations!", + "es": "¡Felicidades!" } } ],