From eec9f846f415a43520e77aec810341cef91eae35 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 09:59:46 +0200 Subject: [PATCH 01/15] chore: added Astro's built i18n routing --- astro.config.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/astro.config.mjs b/astro.config.mjs index 24bdd53..26373ea 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -8,6 +8,17 @@ import mdx from "@astrojs/mdx"; export default defineConfig({ site: "https://interledger.org", base: "/developers", + i18n: { + locales: ["es", "en"], + defaultLocale: "en", + routing: { + prefixDefaultLocale: false, + fallbackType: "rewrite" + }, + fallback: { + es: "en" + } + }, integrations: [ starlight({ title: "Interledger", From 8c8f5820cb54dc21726dee36683e070ee8d37e59 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 10:03:48 +0200 Subject: [PATCH 02/15] TMP --- src/pages/es/index.astro | 271 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 src/pages/es/index.astro diff --git a/src/pages/es/index.astro b/src/pages/es/index.astro new file mode 100644 index 0000000..56b14f8 --- /dev/null +++ b/src/pages/es/index.astro @@ -0,0 +1,271 @@ +--- +import BaseLayout from '../../layouts/BaseLayout.astro'; +import InterledgerIcon from '../../components/logos/InterledgerIcon.astro'; +import OpenPaymentsIcon from '../../components/logos/OpenPaymentsIcon.astro'; +import RafikiIcon from '../../components/logos/RafikiIcon.astro'; +--- + +
+
+
+
+

Interledger Developers Portal

+

Help shape the future of interoperable payments and enable seamless exchange of value across payment networks.

+ +
+
+ Illustration of developers working at a table +
+
+
+ +
+
+

We welcome contributions to our open-source repositories on GitHub. If you find them valuable, please give us a star. Your support makes a difference!

+
+
+ +
+
+
+

Open Payments Repo

+

Open Payments is an open API standard that can be implemented by account servicing entities to facilitate interoperability in the setup and completion of payments for different use cases.

+
+ +
+

Rafiki Repo

+

Rafiki is open source software that provides an efficient solution for an Account Servicing Entity to enable Interledger functionality on its users' accounts.

+
+ +
+

Specifications Repo

+

The Interledger Protocol (ILP) is an open, neutral protocol for transferring money based on TCP/IP, designed for sending packets of money across different accounting ledgers.

+
+ +
+

Test Network Repo

+

The Test Network (Testnet) is an open Interledger network working with test money designed for account servicing entities to test their Interledger integration.

+
+ +
+

Hacktoberfest

+

Join us this October to collaborate on our open source projects.

+
+ +
+

Engineering Blog

+

Our team shares their thoughts and experiences on Interledger and the work that we are doing.

+ Read our blog +
+
+
+
+
+ + From 79a5267d3d973b9ce249d1126e1d801d1c0a10df Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 10:04:31 +0200 Subject: [PATCH 03/15] TMP --- src/pages/es/index.astro | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/pages/es/index.astro b/src/pages/es/index.astro index 56b14f8..30450c0 100644 --- a/src/pages/es/index.astro +++ b/src/pages/es/index.astro @@ -4,61 +4,61 @@ import InterledgerIcon from '../../components/logos/InterledgerIcon.astro'; import OpenPaymentsIcon from '../../components/logos/OpenPaymentsIcon.astro'; import RafikiIcon from '../../components/logos/RafikiIcon.astro'; --- - +
-

Interledger Developers Portal

-

Help shape the future of interoperable payments and enable seamless exchange of value across payment networks.

+

Portal de Desarrolladores de Interledger

+

Ayuda a dar forma al futuro de los pagos interoperables y permite el intercambio fluido de valor entre redes de pago.

- Illustration of developers working at a table + Ilustración de desarrolladores trabajando en una mesa
-

We welcome contributions to our open-source repositories on GitHub. If you find them valuable, please give us a star. Your support makes a difference!

+

Agradecemos las contribuciones a nuestros repositorios de código abierto en GitHub. Si los encuentras valiosos, por favor danos una estrella. ¡Tu apoyo marca la diferencia!

-

Open Payments Repo

-

Open Payments is an open API standard that can be implemented by account servicing entities to facilitate interoperability in the setup and completion of payments for different use cases.

+

Repositorio de Open Payments

+

Open Payments es un estándar de API abierta que puede ser implementado por entidades que prestan servicios de cuenta para facilitar la interoperabilidad en la configuración y finalización de pagos para diferentes casos de uso.

-

Rafiki Repo

-

Rafiki is open source software that provides an efficient solution for an Account Servicing Entity to enable Interledger functionality on its users' accounts.

+

Repositorio de Rafiki

+

Rafiki es un software de código abierto que ofrece una solución eficiente para que una Entidad de Servicio de Cuenta habilite la funcionalidad Interledger en las cuentas de sus usuarios.

-

Specifications Repo

-

The Interledger Protocol (ILP) is an open, neutral protocol for transferring money based on TCP/IP, designed for sending packets of money across different accounting ledgers.

+

Repositorio de Especificaciones

+

El Protocolo Interledger (ILP) es un protocolo abierto y neutral para transferir dinero basado en TCP/IP, diseñado para enviar paquetes de dinero a través de diferentes libros contables.

-

Test Network Repo

-

The Test Network (Testnet) is an open Interledger network working with test money designed for account servicing entities to test their Interledger integration.

+

Repositorio de Red de Pruebas

+

La Red de Pruebas (Testnet) es una red Interledger abierta que trabaja con dinero de prueba, diseñada para que las entidades de servicio de cuenta prueben su integración con Interledger.

Hacktoberfest

-

Join us this October to collaborate on our open source projects.

+

Únete a nosotros este octubre para colaborar en nuestros proyectos de código abierto.

-

Engineering Blog

-

Our team shares their thoughts and experiences on Interledger and the work that we are doing.

- Read our blog +

Blog de Ingeniería

+

Nuestro equipo comparte sus ideas y experiencias sobre Interledger y el trabajo que estamos realizando.

+ Lee nuestro blog
From 4dd0b43e490a6022fd41b5469b0d696b7b357dee Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 10:12:21 +0200 Subject: [PATCH 04/15] feat: added Starlight's built in internationalization --- astro.config.mjs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/astro.config.mjs b/astro.config.mjs index 26373ea..c8aa486 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -23,6 +23,16 @@ export default defineConfig({ starlight({ title: "Interledger", description: "Enable seamless exchange of value across payment networks.", + defaultLocale: 'root', + locales: { + root: { + label: 'English', + lang: 'en' + }, + es: { + label: 'Español' + }, + }, customCss: [ "./node_modules/@interledger/docs-design-system/src/styles/teal-theme.css", "./node_modules/@interledger/docs-design-system/src/styles/ilf-docs.css", From 95828bd18bb04f74774cb01cc9c99fe01d1df768 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 10:12:49 +0200 Subject: [PATCH 05/15] TMP --- src/content/docs/es/get-started.md | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/content/docs/es/get-started.md diff --git a/src/content/docs/es/get-started.md b/src/content/docs/es/get-started.md new file mode 100644 index 0000000..f680b99 --- /dev/null +++ b/src/content/docs/es/get-started.md @@ -0,0 +1,75 @@ +--- +title: Interledger Protocol® +--- + +> Enable seamless exchange of value across payment networks + +Interledger Protocol (ILP) is an open protocol suite for sending packets of value across different payment networks. Like the internet, connectors route packets of money across independent networks. The open architecture and minimal protocol enable interoperability for any value transfer system. + +**Interledger is not tied to a single company, payment network, or currency.** + +
+
+ +
+

Multi-Hop Routing

+

Send payments to other ASEs on the network, even if they are multiple hops away.

+
+
+
+ +
+

Simple Protocol

+

Inspired by TCP/IP, Interledger is easy to implement and use.

+
+
+
+ +
+

Open & Extensible

+

Extend or add to your implementation to suit your specific requirements.

+
+
+
+ +Traditional payment networks operate independently from each other. Sending value is easy only if the sender and recipient have accounts on the same network, but it can be slow and expensive if they have accounts on different networks. Interledger makes it easy to transact in whatever currency or payment network you choose, because Interledger is not tied to any one company, payment network, or currency. Using Interledger, you can send AUD to someone who wants to receive GBP, or you can send USD to someone who wants to receive EUR. + +## What is Interledger? + +Interledger is a network of computers that enables the sending of value across independent payment networks. Similar to how the internet routes packets information, Interledger routes packets of value. Computers on the Interledger network are called *nodes*. Nodes can take one or more of the following roles: + +- Sender – Initiates a value transfer. +- Connector – Applies currency exchange and forwards packets of value. This is an intermediary node between the sender and the receiver. +- Receiver – Receives the value. + +![ILP nodes](/developers/img/ilp-nodes.svg) + +**Note:** The terms *Connector* and *Router* are used interchangeably throughout the documentation. + +## How does Interledger work? + +At the core of Interledger is the [Interledger Protocol (ILPv4)](https://interledger.org/developers/rfcs/interledger-protocol/), which is a set of rules that define how nodes should send value over the Interledger network. ILPv4 is a *request/response* protocol, where requests and responses are ILPv4 packets. Typically, a single aggregate payment from source to destination is split into multiple ILP packets. Each ILP packet contains transaction information, which is private to the nodes participating in the transaction. ILPv4 has three packet types - *Prepare*, *Fulfill*, and *Reject*. + +![ILP Packets](/developers/img/ilp-packets.svg) + +The sender constructs and sends a Prepare packet as a request to the connector. The connectors forward the packet until it reaches the receiver. The receiver then accepts or rejects the packet by sending a Fulfill packet or a Reject packet as the response. The connectors relay the response from the receiver back to the sender. When the sender receives a Fulfill packet, it knows that the packet was successfully delivered to the receiver. The sender then continues to send the remaining Prepare packets until the value is fully transferred. + +Interledger does not rely on any single payment network for processing value transactions. You can connect with an ILPv4 connector at any time to join the network. Furthermore, Interledger sends value as tiny data packets, which makes transactions fast, secure, and inexpensive. + +For a deeper dive into how ILPv4 works, see [ILPv4 Flow](https://interledger.org/developers/rfcs/interledger-protocol#prerequisites). + +## Building on Interledger + +Build payments into your apps or other protocols without tying yourself to a specific currency or payment network. Create accounts on our demo ledgers and start sending Interledger payments with the client libraries. + +## Interledger architecture + +Interledger enables payments across many different types of ledgers. The Interledger Protocol Suite is comprised of four layers: the Application, Transport, Interledger, and Link protocols. To learn more, see the Interledger [Architecture Overview](https://interledger.org/developers/rfcs/interledger-architecture). + +## Protocol specs and APIs + +To dive into the technical specs, see the [Interledger RFCs](https://github.com/interledger/rfcs). Also see the documentation for the components of the reference implementation. + +## Security + +Interledger enables secure, multi-hop payments using [Hashed Timelock Agreements](https://interledger.org/developers/rfcs/hashed-timelock-agreements). As of Interledger v4, these conditions are not enforced by the ledger, as it would be too costly and slow. Instead, participants in the network use these hashlocks to perform accounting with their peers. This accounting is used to determine in-flight balances, which are periodically settled with on-ledger transfers or payment channel claims. For a detailed description of how this works, read the [Peering, Clearing, and Settlement](https://interledger.org/developers/rfcs/peering-clearing-settling/) documentation. From d05598c597aadbef34e271b89958aa3cd52e8588 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 10:14:16 +0200 Subject: [PATCH 06/15] TMP --- src/content/docs/es/get-started.md | 64 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/content/docs/es/get-started.md b/src/content/docs/es/get-started.md index f680b99..27c51d6 100644 --- a/src/content/docs/es/get-started.md +++ b/src/content/docs/es/get-started.md @@ -1,75 +1,75 @@ --- -title: Interledger Protocol® +title: Protocolo Interledger® --- -> Enable seamless exchange of value across payment networks +> Habilita el intercambio fluido de valor entre redes de pago -Interledger Protocol (ILP) is an open protocol suite for sending packets of value across different payment networks. Like the internet, connectors route packets of money across independent networks. The open architecture and minimal protocol enable interoperability for any value transfer system. +El Protocolo Interledger (ILP) es un conjunto de protocolos abiertos para enviar paquetes de valor a través de diferentes redes de pago. Al igual que internet, los conectores enrutan paquetes de dinero entre redes independientes. Su arquitectura abierta y protocolo mínimo permiten la interoperabilidad entre sistemas de transferencia de valor. -**Interledger is not tied to a single company, payment network, or currency.** +**Interledger no está vinculado a una sola empresa, red de pago o moneda.**
-

Multi-Hop Routing

-

Send payments to other ASEs on the network, even if they are multiple hops away.

+

Enrutamiento de múltiples saltos

+

Envía pagos a otras ASEs en la red, incluso si están a varios saltos de distancia.

-

Simple Protocol

-

Inspired by TCP/IP, Interledger is easy to implement and use.

+

Protocolo simple

+

Inspirado en TCP/IP, Interledger es fácil de implementar y usar.

-

Open & Extensible

-

Extend or add to your implementation to suit your specific requirements.

+

Abierto y extensible

+

Extiende o adapta tu implementación para satisfacer tus necesidades específicas.

-Traditional payment networks operate independently from each other. Sending value is easy only if the sender and recipient have accounts on the same network, but it can be slow and expensive if they have accounts on different networks. Interledger makes it easy to transact in whatever currency or payment network you choose, because Interledger is not tied to any one company, payment network, or currency. Using Interledger, you can send AUD to someone who wants to receive GBP, or you can send USD to someone who wants to receive EUR. +Las redes de pago tradicionales operan de forma independiente entre sí. Enviar valor es fácil solo si el emisor y el receptor tienen cuentas en la misma red, pero puede ser lento y costoso si están en redes distintas. Interledger facilita las transacciones en cualquier moneda o red de pago que elijas, porque no está atado a ninguna empresa, red ni moneda. Usando Interledger, puedes enviar AUD a alguien que quiere recibir GBP, o USD a alguien que desea recibir EUR. -## What is Interledger? +## ¿Qué es Interledger? -Interledger is a network of computers that enables the sending of value across independent payment networks. Similar to how the internet routes packets information, Interledger routes packets of value. Computers on the Interledger network are called *nodes*. Nodes can take one or more of the following roles: +Interledger es una red de computadoras que permite enviar valor a través de redes de pago independientes. Similar a cómo internet enruta paquetes de información, Interledger enruta paquetes de valor. Las computadoras en la red Interledger se llaman *nodos*. Los nodos pueden asumir uno o más de los siguientes roles: -- Sender – Initiates a value transfer. -- Connector – Applies currency exchange and forwards packets of value. This is an intermediary node between the sender and the receiver. -- Receiver – Receives the value. +- Remitente – Inicia una transferencia de valor. +- Conector – Aplica el cambio de moneda y reenvía paquetes de valor. Es un nodo intermediario entre el remitente y el receptor. +- Receptor – Recibe el valor. -![ILP nodes](/developers/img/ilp-nodes.svg) +![Nodos ILP](/developers/img/ilp-nodes.svg) -**Note:** The terms *Connector* and *Router* are used interchangeably throughout the documentation. +**Nota:** Los términos *Conector* y *Enrutador* se usan indistintamente en la documentación. -## How does Interledger work? +## ¿Cómo funciona Interledger? -At the core of Interledger is the [Interledger Protocol (ILPv4)](https://interledger.org/developers/rfcs/interledger-protocol/), which is a set of rules that define how nodes should send value over the Interledger network. ILPv4 is a *request/response* protocol, where requests and responses are ILPv4 packets. Typically, a single aggregate payment from source to destination is split into multiple ILP packets. Each ILP packet contains transaction information, which is private to the nodes participating in the transaction. ILPv4 has three packet types - *Prepare*, *Fulfill*, and *Reject*. +En el núcleo de Interledger se encuentra el [Protocolo Interledger (ILPv4)](https://interledger.org/developers/rfcs/interledger-protocol/), un conjunto de reglas que define cómo deben enviar valor los nodos a través de la red Interledger. ILPv4 es un protocolo de *solicitud/respuesta*, donde las solicitudes y respuestas son paquetes ILPv4. Normalmente, un único pago agregado desde el origen hasta el destino se divide en varios paquetes ILP. Cada paquete contiene información de la transacción, que es privada entre los nodos que participan. ILPv4 tiene tres tipos de paquetes: *Prepare*, *Fulfill* y *Reject*. -![ILP Packets](/developers/img/ilp-packets.svg) +![Paquetes ILP](/developers/img/ilp-packets.svg) -The sender constructs and sends a Prepare packet as a request to the connector. The connectors forward the packet until it reaches the receiver. The receiver then accepts or rejects the packet by sending a Fulfill packet or a Reject packet as the response. The connectors relay the response from the receiver back to the sender. When the sender receives a Fulfill packet, it knows that the packet was successfully delivered to the receiver. The sender then continues to send the remaining Prepare packets until the value is fully transferred. +El remitente construye y envía un paquete Prepare como solicitud al conector. Los conectores reenvían el paquete hasta que llega al receptor. Luego, el receptor acepta o rechaza el paquete enviando un paquete Fulfill o Reject como respuesta. Los conectores retransmiten la respuesta del receptor de vuelta al remitente. Cuando el remitente recibe un paquete Fulfill, sabe que el paquete fue entregado exitosamente. Entonces continúa enviando los paquetes Prepare restantes hasta que se transfiere todo el valor. -Interledger does not rely on any single payment network for processing value transactions. You can connect with an ILPv4 connector at any time to join the network. Furthermore, Interledger sends value as tiny data packets, which makes transactions fast, secure, and inexpensive. +Interledger no depende de ninguna red de pago específica para procesar transacciones de valor. Puedes conectarte a un conector ILPv4 en cualquier momento para unirte a la red. Además, Interledger envía valor en pequeños paquetes de datos, lo que hace que las transacciones sean rápidas, seguras y económicas. -For a deeper dive into how ILPv4 works, see [ILPv4 Flow](https://interledger.org/developers/rfcs/interledger-protocol#prerequisites). +Para un análisis más profundo de cómo funciona ILPv4, consulta [Flujo ILPv4](https://interledger.org/developers/rfcs/interledger-protocol#prerequisites). -## Building on Interledger +## Crear sobre Interledger -Build payments into your apps or other protocols without tying yourself to a specific currency or payment network. Create accounts on our demo ledgers and start sending Interledger payments with the client libraries. +Incorpora pagos en tus aplicaciones u otros protocolos sin atarte a una moneda o red de pago específica. Crea cuentas en nuestros ledgers de demostración y comienza a enviar pagos Interledger con las bibliotecas cliente. -## Interledger architecture +## Arquitectura de Interledger -Interledger enables payments across many different types of ledgers. The Interledger Protocol Suite is comprised of four layers: the Application, Transport, Interledger, and Link protocols. To learn more, see the Interledger [Architecture Overview](https://interledger.org/developers/rfcs/interledger-architecture). +Interledger permite pagos a través de muchos tipos diferentes de libros contables. El conjunto de protocolos Interledger se compone de cuatro capas: las capas de Aplicación, Transporte, Interledger y Enlace. Para más información, consulta la [Visión General de la Arquitectura](https://interledger.org/developers/rfcs/interledger-architecture). -## Protocol specs and APIs +## Especificaciones y APIs del protocolo -To dive into the technical specs, see the [Interledger RFCs](https://github.com/interledger/rfcs). Also see the documentation for the components of the reference implementation. +Para explorar las especificaciones técnicas, consulta los [Interledger RFCs](https://github.com/interledger/rfcs). También consulta la documentación de los componentes de la implementación de referencia. -## Security +## Seguridad -Interledger enables secure, multi-hop payments using [Hashed Timelock Agreements](https://interledger.org/developers/rfcs/hashed-timelock-agreements). As of Interledger v4, these conditions are not enforced by the ledger, as it would be too costly and slow. Instead, participants in the network use these hashlocks to perform accounting with their peers. This accounting is used to determine in-flight balances, which are periodically settled with on-ledger transfers or payment channel claims. For a detailed description of how this works, read the [Peering, Clearing, and Settlement](https://interledger.org/developers/rfcs/peering-clearing-settling/) documentation. +Interledger permite pagos seguros de múltiples saltos utilizando [Acuerdos de Bloqueo Temporal con Hash](https://interledger.org/developers/rfcs/hashed-timelock-agreements). A partir de Interledger v4, estas condiciones no son impuestas por el libro contable, ya que sería demasiado costoso y lento. En su lugar, los participantes de la red usan estos hashlocks para llevar la contabilidad entre pares. Esta contabilidad se utiliza para determinar los saldos en tránsito, que se liquidan periódicamente con transferencias en el libro contable o reclamos en canales de pago. Para una descripción detallada de cómo funciona esto, consulta la documentación sobre [Emparejamiento, Compensación y Liquidación](https://interledger.org/developers/rfcs/peering-clearing-settling/). From b90649162fe970bae47d4d85c963bd572d8ac00e Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 10:20:16 +0200 Subject: [PATCH 07/15] chore: undo Starlight locale conflict. Can't be supported --- astro.config.mjs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/astro.config.mjs b/astro.config.mjs index c8aa486..502c276 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -24,15 +24,6 @@ export default defineConfig({ title: "Interledger", description: "Enable seamless exchange of value across payment networks.", defaultLocale: 'root', - locales: { - root: { - label: 'English', - lang: 'en' - }, - es: { - label: 'Español' - }, - }, customCss: [ "./node_modules/@interledger/docs-design-system/src/styles/teal-theme.css", "./node_modules/@interledger/docs-design-system/src/styles/ilf-docs.css", From 58da9649d317a5d51d511d008090029b1c435fee Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 13:23:33 +0200 Subject: [PATCH 08/15] TMP --- .../es/2025-03-12-breakpoint-it-work-week.mdx | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx diff --git a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx new file mode 100644 index 0000000..b1d2134 --- /dev/null +++ b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx @@ -0,0 +1,47 @@ +--- +title: "The first work week of the season - BreakPoint IT Work Week" +description: "The first work week of the season" +date: 2025-03-12 +slug: breakpoint-it-work-week +authors: + - Timea Nagy +author_urls: + - https://www.linkedin.com/in/nagy-timea-35483024 +tags: + - Interledger +--- + +After shaking off the January blues, the Interledger Engineering Managers and Product Managers gathered with the BreakPoint IT team for a productive work week in Cluj-Napoca, Romania. +Why did we do this? It's crucial to reflect on the achievements of the past year, set goals and expectations for the year ahead, and, of course, meet face-to-face to finally enjoy that coffee we've been talking about. + +The plan for the week was straightforward: review all the projects that the BreakPoint IT team is working on, present the latest developments, discuss ongoing work, and outline the direction of these projects in the coming months. +The projects covered included the [Open Payments](https://openpayments.dev/)/[Rafiki](https://rafiki.dev/) integration projects, our Test Network - [Test Wallet](https://wallet.interledger-test.dev/), [Test Boutique](https://boutique.interledger-test.dev/), [Interledger Pay](https://interledgerpay.com/), and [Interledger Cards](https://wallet.interledger.cards/). + +We also highlighted our goal of expanding Open Payment SDKs across multiple programming languages. While our TypeScript SDK is ready, we're also working on PHP, Rust, Go, and Python SDKs with the support of our developers and the community, and we're aiming to add Java and mobile SDKs as well. +Rafiki updates and goals were also discussed, with more detailed conversations expected during the Rafiki work week later this year. + +Two of the most talked-about topics were the [Web Monetization Extension](https://webmonetization.org/) and the Publisher Tools. +The progress these products are making, week by week, is a testament to the incredible people behind them. There are exciting plans ahead for these projects, so stay tuned. + +![BreakPoint IT Work Week](/developers/img/blog/2025-03-12/bp-ww.jpg) + +As always, plans are set, but sometimes a team or two must shift focus to tackle something urgent or higher priority, and they’re sent into the "dungeon" to make it happen. +This year, the fortunate team was the Interledger Wallet team. The [Interledger Wallet](https://interledger.app/) is currently under development, with Interledger taking over the old Fynbos wallet and giving it a complete revamp, along with new features. +Remember the new cards we were all excited about after the [Interledger Summit 2024](https://interledger.org/summit)? +The Interledger Wallet team will be the ones to bring the new cards vision to life. + +![Group Photo at Work Week](/developers/img/blog/2025-03-12/bp-ww-group.jpg) + +We also had the chance to discuss ways the team can improve community involvement. +Speaking of which, Ioana, our Community-focused Engineering Manager, organized an incredible event in collaboration with [Women in Tech](https://www.womenintechcluj.com/)—a meetup focused on Web Monetization, titled Pay the Web Forward. +After listening to insightful presentations and demos by [Ioana Chiorean](https://interledger.org/team/ioana-chiorean), [Rabeb Othmani](https://interledger.org/team/rabeb-othmani), and [Timea Nagy](https://interledger.org/team/timea-nagy), the participants had numerous questions, and the level of engagement was impressive. +The networking session even ran longer than expected, reflecting the strong interest and enthusiasm. + +![Interledger Meetup](/developers/img/blog/2025-03-12/bp-ww-wt.jpg) + +In summary, the BreakPoint Work Week was both productive and successful. Decisions were made, discussions took place, coffees were enjoyed, and Romanian sweets were consumed in abundance. +The consensus was clear: we’re all looking forward to the next time we meet up again. + +Bonus picture, Romanian Floating Island dessert, AKA Birds Milk, if you haven’t tried it yet, we highly recommend it. + +![Birds Milk](/developers/img/blog/2025-03-12/bp-ww-bm.png) From 8e9d88b15095aca8541e9613eb2097229e96cc00 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 13:23:44 +0200 Subject: [PATCH 09/15] TMP --- .../es/2025-03-12-breakpoint-it-work-week.mdx | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx index b1d2134..469a97b 100644 --- a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx +++ b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx @@ -1,6 +1,6 @@ --- -title: "The first work week of the season - BreakPoint IT Work Week" -description: "The first work week of the season" +title: "La primera semana de trabajo de la temporada - BreakPoint IT Work Week" +description: "La primera semana de trabajo de la temporada" date: 2025-03-12 slug: breakpoint-it-work-week authors: @@ -11,37 +11,37 @@ tags: - Interledger --- -After shaking off the January blues, the Interledger Engineering Managers and Product Managers gathered with the BreakPoint IT team for a productive work week in Cluj-Napoca, Romania. -Why did we do this? It's crucial to reflect on the achievements of the past year, set goals and expectations for the year ahead, and, of course, meet face-to-face to finally enjoy that coffee we've been talking about. +Después de dejar atrás la melancolía de enero, los Gerentes de Ingeniería y Gerentes de Producto de Interledger se reunieron con el equipo de BreakPoint IT para una semana de trabajo productiva en Cluj-Napoca, Rumanía. +¿Por qué lo hicimos? Es fundamental reflexionar sobre los logros del año pasado, establecer objetivos y expectativas para el año que comienza y, por supuesto, encontrarnos cara a cara para por fin disfrutar ese café del que tanto hablamos. -The plan for the week was straightforward: review all the projects that the BreakPoint IT team is working on, present the latest developments, discuss ongoing work, and outline the direction of these projects in the coming months. -The projects covered included the [Open Payments](https://openpayments.dev/)/[Rafiki](https://rafiki.dev/) integration projects, our Test Network - [Test Wallet](https://wallet.interledger-test.dev/), [Test Boutique](https://boutique.interledger-test.dev/), [Interledger Pay](https://interledgerpay.com/), and [Interledger Cards](https://wallet.interledger.cards/). +El plan para la semana era sencillo: revisar todos los proyectos en los que está trabajando el equipo de BreakPoint IT, presentar los últimos avances, discutir el trabajo en curso y definir la dirección de estos proyectos en los próximos meses. +Los proyectos cubiertos incluyeron las integraciones de [Open Payments](https://openpayments.dev/)/[Rafiki](https://rafiki.dev/), nuestra Red de Pruebas - [Test Wallet](https://wallet.interledger-test.dev/), [Test Boutique](https://boutique.interledger-test.dev/), [Interledger Pay](https://interledgerpay.com/) y [Interledger Cards](https://wallet.interledger.cards/). -We also highlighted our goal of expanding Open Payment SDKs across multiple programming languages. While our TypeScript SDK is ready, we're also working on PHP, Rust, Go, and Python SDKs with the support of our developers and the community, and we're aiming to add Java and mobile SDKs as well. -Rafiki updates and goals were also discussed, with more detailed conversations expected during the Rafiki work week later this year. +También destacamos nuestro objetivo de expandir los SDKs de Open Payments a múltiples lenguajes de programación. Aunque nuestro SDK en TypeScript ya está listo, también estamos trabajando en SDKs para PHP, Rust, Go y Python con el apoyo de nuestros desarrolladores y la comunidad, y planeamos añadir SDKs para Java y móviles. +También se discutieron las actualizaciones y metas de Rafiki, con conversaciones más detalladas previstas para la semana de trabajo de Rafiki más adelante este año. -Two of the most talked-about topics were the [Web Monetization Extension](https://webmonetization.org/) and the Publisher Tools. -The progress these products are making, week by week, is a testament to the incredible people behind them. There are exciting plans ahead for these projects, so stay tuned. +Dos de los temas más comentados fueron la [Extensión de Web Monetization](https://webmonetization.org/) y las Herramientas para Publicadores. +El progreso de estos productos, semana a semana, es un testimonio del increíble equipo que hay detrás de ellos. Hay planes emocionantes para estos proyectos, así que mantente al tanto. ![BreakPoint IT Work Week](/developers/img/blog/2025-03-12/bp-ww.jpg) -As always, plans are set, but sometimes a team or two must shift focus to tackle something urgent or higher priority, and they’re sent into the "dungeon" to make it happen. -This year, the fortunate team was the Interledger Wallet team. The [Interledger Wallet](https://interledger.app/) is currently under development, with Interledger taking over the old Fynbos wallet and giving it a complete revamp, along with new features. -Remember the new cards we were all excited about after the [Interledger Summit 2024](https://interledger.org/summit)? -The Interledger Wallet team will be the ones to bring the new cards vision to life. +Como siempre, los planes están trazados, pero a veces uno o dos equipos deben cambiar de enfoque para abordar algo urgente o de mayor prioridad, y son enviados a la "mazmorra" para hacerlo realidad. +Este año, el equipo afortunado fue el de Interledger Wallet. La [Interledger Wallet](https://interledger.app/) está actualmente en desarrollo, con Interledger haciéndose cargo de la antigua billetera Fynbos y dándole un rediseño completo, junto con nuevas funcionalidades. +¿Recuerdas las nuevas tarjetas que nos emocionaron después de la [Cumbre Interledger 2024](https://interledger.org/summit)? +El equipo de Interledger Wallet será quien hará realidad esa visión. -![Group Photo at Work Week](/developers/img/blog/2025-03-12/bp-ww-group.jpg) +![Foto grupal en la semana de trabajo](/developers/img/blog/2025-03-12/bp-ww-group.jpg) -We also had the chance to discuss ways the team can improve community involvement. -Speaking of which, Ioana, our Community-focused Engineering Manager, organized an incredible event in collaboration with [Women in Tech](https://www.womenintechcluj.com/)—a meetup focused on Web Monetization, titled Pay the Web Forward. -After listening to insightful presentations and demos by [Ioana Chiorean](https://interledger.org/team/ioana-chiorean), [Rabeb Othmani](https://interledger.org/team/rabeb-othmani), and [Timea Nagy](https://interledger.org/team/timea-nagy), the participants had numerous questions, and the level of engagement was impressive. -The networking session even ran longer than expected, reflecting the strong interest and enthusiasm. +También tuvimos la oportunidad de hablar sobre cómo el equipo puede mejorar la participación comunitaria. +Hablando de eso, Ioana, nuestra Gerente de Ingeniería enfocada en Comunidad, organizó un evento increíble en colaboración con [Women in Tech](https://www.womenintechcluj.com/) — un meetup enfocado en Web Monetization, titulado *Pay the Web Forward*. +Después de escuchar presentaciones y demostraciones inspiradoras de [Ioana Chiorean](https://interledger.org/team/ioana-chiorean), [Rabeb Othmani](https://interledger.org/team/rabeb-othmani) y [Timea Nagy](https://interledger.org/team/timea-nagy), los participantes hicieron numerosas preguntas y el nivel de participación fue impresionante. +La sesión de networking incluso se extendió más de lo previsto, reflejando el gran interés y entusiasmo. -![Interledger Meetup](/developers/img/blog/2025-03-12/bp-ww-wt.jpg) +![Meetup de Interledger](/developers/img/blog/2025-03-12/bp-ww-wt.jpg) -In summary, the BreakPoint Work Week was both productive and successful. Decisions were made, discussions took place, coffees were enjoyed, and Romanian sweets were consumed in abundance. -The consensus was clear: we’re all looking forward to the next time we meet up again. +En resumen, la semana de trabajo de BreakPoint fue productiva y exitosa. Se tomaron decisiones, se dieron discusiones, se disfrutaron cafés y se consumieron dulces rumanos en abundancia. +El consenso fue claro: todos esperamos con entusiasmo el próximo encuentro. -Bonus picture, Romanian Floating Island dessert, AKA Birds Milk, if you haven’t tried it yet, we highly recommend it. +Foto bonus: postre rumano *Isla Flotante*, también conocido como *Leche de Pájaro*. Si no lo has probado aún, ¡te lo recomendamos mucho! -![Birds Milk](/developers/img/blog/2025-03-12/bp-ww-bm.png) +![Leche de Pájaro](/developers/img/blog/2025-03-12/bp-ww-bm.png) From 1803b8493aef8af970cfd6fe45ec2c79537134e1 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 14:48:00 +0200 Subject: [PATCH 10/15] TMP experiment --- ...es-2025-03-12-breakpoint-it-work-week.mdx} | 2 +- src/pages/blog/[...id].astro | 8 +- src/pages/blog/[...page].astro | 9 +- src/pages/es/blog/[...id].astro | 26 +++ src/pages/es/blog/[...page].astro | 165 ++++++++++++++++++ 5 files changed, 207 insertions(+), 3 deletions(-) rename src/content/blog/es/{2025-03-12-breakpoint-it-work-week.mdx => es-2025-03-12-breakpoint-it-work-week.mdx} (99%) create mode 100644 src/pages/es/blog/[...id].astro create mode 100644 src/pages/es/blog/[...page].astro diff --git a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/es/es-2025-03-12-breakpoint-it-work-week.mdx similarity index 99% rename from src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx rename to src/content/blog/es/es-2025-03-12-breakpoint-it-work-week.mdx index 469a97b..a2992dd 100644 --- a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx +++ b/src/content/blog/es/es-2025-03-12-breakpoint-it-work-week.mdx @@ -2,7 +2,7 @@ title: "La primera semana de trabajo de la temporada - BreakPoint IT Work Week" description: "La primera semana de trabajo de la temporada" date: 2025-03-12 -slug: breakpoint-it-work-week +slug: es-breakpoint-it-work-week authors: - Timea Nagy author_urls: diff --git a/src/pages/blog/[...id].astro b/src/pages/blog/[...id].astro index ccdceff..db2d3e7 100644 --- a/src/pages/blog/[...id].astro +++ b/src/pages/blog/[...id].astro @@ -4,7 +4,13 @@ import BlogLayout from '../../layouts/BlogLayout.astro'; import CommunityLinks from "../../components/blog/CommunityLinks.astro"; export async function getStaticPaths() { - const blogEntries = await getCollection('blog'); + const blogEntries = await getCollection('blog', ({ id }) => { + console.log(id) + if (! id.includes('es-')) { + console.log(id, 'is here') + } + return ! id.includes('es-'); +}); return blogEntries.map(entry => ({ params: { id: entry.id }, props: { entry }, diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro index ac72b5d..4196f1a 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/[...page].astro @@ -10,7 +10,14 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { - const blogEntries = (await getCollection("blog")).sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); + const blogs = await getCollection("blog", ({ id }) => { + console.log(id) + if (! id.includes('es-')) { + console.log(id, 'is here') + } + return ! id.includes('es-'); +}); + const blogEntries = blogs.sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); return paginate(blogEntries, { pageSize: 10 }); } diff --git a/src/pages/es/blog/[...id].astro b/src/pages/es/blog/[...id].astro new file mode 100644 index 0000000..dc6177e --- /dev/null +++ b/src/pages/es/blog/[...id].astro @@ -0,0 +1,26 @@ +--- +import { getCollection, render } from 'astro:content'; +import BlogLayout from '../../../layouts/BlogLayout.astro'; +import CommunityLinks from "../../../components/blog/CommunityLinks.astro"; + +export async function getStaticPaths() { + const blogEntries = await getCollection('blog', ({ id, data }) => { + console.log('DATA: ', data.title ) + if (! id.includes('es-')) { + console.log(id, 'is here') + } + return id.includes('es-'); +}); + return blogEntries.map(entry => ({ + params: { id: entry.id }, + props: { entry }, + })); +} + +const { entry } = Astro.props; +const { Content } = await render(entry); +--- + + + + diff --git a/src/pages/es/blog/[...page].astro b/src/pages/es/blog/[...page].astro new file mode 100644 index 0000000..b5ebe87 --- /dev/null +++ b/src/pages/es/blog/[...page].astro @@ -0,0 +1,165 @@ +--- +import type { Page } from "astro"; +import { createExcerpt } from '../../../utils/create-excerpt'; +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import Pagination from '../../../components/blog/Pagination.astro'; +import { getCollection } from 'astro:content'; + +type Props = { + page: Page; +}; + +export async function getStaticPaths({ paginate }: any) { + const blogs = await getCollection("blog", ({ id }) => { + console.log(id) + if (! id.includes('es-')) { + console.log(id, 'is here') + } + return id.includes('es-'); +}); + const blogEntries = blogs.sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); + return paginate(blogEntries, { pageSize: 10 }); +} + +const { page } = Astro.props; +--- + +
+
+ +
+

Engineering Blog

+ +

Check out Foundation updates

+ +
+
+
    + {((page as any).data || []).map((blogPostEntry: any) => { + const excerpt = `${createExcerpt(blogPostEntry.body).substring(0, 300)}...`; + return ( +
  1. + + {blogPostEntry.data.title} +

    {blogPostEntry.data.description ? blogPostEntry.data.description : excerpt}

    +
  2. + )} + )} +
+ +
+
+ + + + From cebe4e17e63d070a305a47d8551ed53f847beff1 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 8 Apr 2025 14:49:36 +0200 Subject: [PATCH 11/15] TMP undo experiment --- ...=> 2025-03-12-breakpoint-it-work-week.mdx} | 2 +- src/pages/blog/[...id].astro | 8 +- src/pages/blog/[...page].astro | 9 +- src/pages/es/blog/[...id].astro | 26 --- src/pages/es/blog/[...page].astro | 165 ------------------ 5 files changed, 3 insertions(+), 207 deletions(-) rename src/content/blog/es/{es-2025-03-12-breakpoint-it-work-week.mdx => 2025-03-12-breakpoint-it-work-week.mdx} (99%) delete mode 100644 src/pages/es/blog/[...id].astro delete mode 100644 src/pages/es/blog/[...page].astro diff --git a/src/content/blog/es/es-2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx similarity index 99% rename from src/content/blog/es/es-2025-03-12-breakpoint-it-work-week.mdx rename to src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx index a2992dd..469a97b 100644 --- a/src/content/blog/es/es-2025-03-12-breakpoint-it-work-week.mdx +++ b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx @@ -2,7 +2,7 @@ title: "La primera semana de trabajo de la temporada - BreakPoint IT Work Week" description: "La primera semana de trabajo de la temporada" date: 2025-03-12 -slug: es-breakpoint-it-work-week +slug: breakpoint-it-work-week authors: - Timea Nagy author_urls: diff --git a/src/pages/blog/[...id].astro b/src/pages/blog/[...id].astro index db2d3e7..ccdceff 100644 --- a/src/pages/blog/[...id].astro +++ b/src/pages/blog/[...id].astro @@ -4,13 +4,7 @@ import BlogLayout from '../../layouts/BlogLayout.astro'; import CommunityLinks from "../../components/blog/CommunityLinks.astro"; export async function getStaticPaths() { - const blogEntries = await getCollection('blog', ({ id }) => { - console.log(id) - if (! id.includes('es-')) { - console.log(id, 'is here') - } - return ! id.includes('es-'); -}); + const blogEntries = await getCollection('blog'); return blogEntries.map(entry => ({ params: { id: entry.id }, props: { entry }, diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro index 4196f1a..ac72b5d 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/[...page].astro @@ -10,14 +10,7 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { - const blogs = await getCollection("blog", ({ id }) => { - console.log(id) - if (! id.includes('es-')) { - console.log(id, 'is here') - } - return ! id.includes('es-'); -}); - const blogEntries = blogs.sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); + const blogEntries = (await getCollection("blog")).sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); return paginate(blogEntries, { pageSize: 10 }); } diff --git a/src/pages/es/blog/[...id].astro b/src/pages/es/blog/[...id].astro deleted file mode 100644 index dc6177e..0000000 --- a/src/pages/es/blog/[...id].astro +++ /dev/null @@ -1,26 +0,0 @@ ---- -import { getCollection, render } from 'astro:content'; -import BlogLayout from '../../../layouts/BlogLayout.astro'; -import CommunityLinks from "../../../components/blog/CommunityLinks.astro"; - -export async function getStaticPaths() { - const blogEntries = await getCollection('blog', ({ id, data }) => { - console.log('DATA: ', data.title ) - if (! id.includes('es-')) { - console.log(id, 'is here') - } - return id.includes('es-'); -}); - return blogEntries.map(entry => ({ - params: { id: entry.id }, - props: { entry }, - })); -} - -const { entry } = Astro.props; -const { Content } = await render(entry); ---- - - - - diff --git a/src/pages/es/blog/[...page].astro b/src/pages/es/blog/[...page].astro deleted file mode 100644 index b5ebe87..0000000 --- a/src/pages/es/blog/[...page].astro +++ /dev/null @@ -1,165 +0,0 @@ ---- -import type { Page } from "astro"; -import { createExcerpt } from '../../../utils/create-excerpt'; -import BaseLayout from '../../../layouts/BaseLayout.astro'; -import Pagination from '../../../components/blog/Pagination.astro'; -import { getCollection } from 'astro:content'; - -type Props = { - page: Page; -}; - -export async function getStaticPaths({ paginate }: any) { - const blogs = await getCollection("blog", ({ id }) => { - console.log(id) - if (! id.includes('es-')) { - console.log(id, 'is here') - } - return id.includes('es-'); -}); - const blogEntries = blogs.sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); - return paginate(blogEntries, { pageSize: 10 }); -} - -const { page } = Astro.props; ---- - -
-
- -
-

Engineering Blog

- -

Check out Foundation updates

- -
-
-
    - {((page as any).data || []).map((blogPostEntry: any) => { - const excerpt = `${createExcerpt(blogPostEntry.body).substring(0, 300)}...`; - return ( -
  1. - - {blogPostEntry.data.title} -

    {blogPostEntry.data.description ? blogPostEntry.data.description : excerpt}

    -
  2. - )} - )} -
- -
-
- - - - From c807f04ccf4ee802238ca8f6812248f30791b0f3 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Thu, 10 Apr 2025 09:54:44 +0200 Subject: [PATCH 12/15] chore: removed defaultLocale --- astro.config.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/astro.config.mjs b/astro.config.mjs index 502c276..26373ea 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -23,7 +23,6 @@ export default defineConfig({ starlight({ title: "Interledger", description: "Enable seamless exchange of value across payment networks.", - defaultLocale: 'root', customCss: [ "./node_modules/@interledger/docs-design-system/src/styles/teal-theme.css", "./node_modules/@interledger/docs-design-system/src/styles/ilf-docs.css", From 16eac9ae254d9a079ad90d46da62d2ef4b535688 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Fri, 11 Apr 2025 03:36:45 +0200 Subject: [PATCH 13/15] chore: filtering blogs and building pages --- .../es/2025-03-12-breakpoint-it-work-week.mdx | 2 +- src/pages/blog/[...page].astro | 5 +- src/pages/es/blog/[...id].astro | 28 +++ src/pages/es/blog/[...page].astro | 159 ++++++++++++++++++ 4 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 src/pages/es/blog/[...id].astro create mode 100644 src/pages/es/blog/[...page].astro diff --git a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx index 469a97b..5ee5478 100644 --- a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx +++ b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx @@ -2,7 +2,7 @@ title: "La primera semana de trabajo de la temporada - BreakPoint IT Work Week" description: "La primera semana de trabajo de la temporada" date: 2025-03-12 -slug: breakpoint-it-work-week +slug: es/breakpoint-it-work-week authors: - Timea Nagy author_urls: diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro index ac72b5d..ae4c745 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/[...page].astro @@ -10,7 +10,9 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { - const blogEntries = (await getCollection("blog")).sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); + const blogEntries = (await getCollection("blog")) + .filter((entry) => ! entry.data.slug.startsWith('es/')) + .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); return paginate(blogEntries, { pageSize: 10 }); } @@ -155,4 +157,3 @@ header { text-decoration-color: currentColor; } - diff --git a/src/pages/es/blog/[...id].astro b/src/pages/es/blog/[...id].astro new file mode 100644 index 0000000..dab2cb2 --- /dev/null +++ b/src/pages/es/blog/[...id].astro @@ -0,0 +1,28 @@ +--- +import { getCollection, render } from 'astro:content'; +import BlogLayout from '../../../layouts/BlogLayout.astro'; +import CommunityLinks from "../../../components/blog/CommunityLinks.astro"; + +export async function getStaticPaths() { + const blogEntries = await getCollection('blog'); + const lang = 'es'; + + return blogEntries + .filter((entry) => entry.data.slug.startsWith('es/')) + .map(entry => { + + const slug = entry.data.slug.replace(/^es\//, ''); + console.log('lang: ', lang) + console.log('blogId: ', slug) + + return { params: { lang, id: slug }, props: {entry} }; + }); +} + +const { entry } = Astro.props; +const { Content } = await render(entry); +--- + + + + diff --git a/src/pages/es/blog/[...page].astro b/src/pages/es/blog/[...page].astro new file mode 100644 index 0000000..ebe59b7 --- /dev/null +++ b/src/pages/es/blog/[...page].astro @@ -0,0 +1,159 @@ +--- +import type { Page } from "astro"; +import { createExcerpt } from '../../../utils/create-excerpt'; +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import Pagination from '../../../components/blog/Pagination.astro'; +import { getCollection } from 'astro:content'; + +type Props = { + page: Page; +}; + +export async function getStaticPaths({ paginate }: any) { + const blogEntries = (await getCollection("blog")) + .filter((entry) => entry.data.slug.startsWith('es/')) + .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); + return paginate(blogEntries, { pageSize: 10 }); +} + +const { page } = Astro.props; +--- + +
+
+ +
+

Engineering Blog

+ +

Check out Foundation updates

+ +
+
+
    + {((page as any).data || []).map((blogPostEntry: any) => { + const excerpt = `${createExcerpt(blogPostEntry.body).substring(0, 300)}...`; + return ( +
  1. + + {blogPostEntry.data.title} +

    {blogPostEntry.data.description ? blogPostEntry.data.description : excerpt}

    +
  2. + )} + )} +
+ +
+
+
+ + From 130d33afbdab10c03be2c024b4885b28635651ee Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Fri, 11 Apr 2025 04:17:41 +0200 Subject: [PATCH 14/15] chore: added a lang attribute for filtering and all slugs must be unique --- src/content.config.ts | 1 + ...-the-graveyard-of-possible-protocol-features.md | 1 + ...erconnect-all-blockchains-and-value-networks.md | 1 + ...3-thoughts-on-scaling-interledger-connectors.md | 1 + src/content/blog/2024-04-10-the-telemetry-tale.md | 1 + .../blog/2024-07-09-simple-open-payments-guide.md | 1 + .../2024-07-30-open-payments-cinderella-story.mdx | 1 + .../blog/2024-08-13-interledger-universe.mdx | 1 + src/content/blog/2024-09-06-integration-tests.mdx | 1 + .../blog/2024-09-23-rafiki-code-architecture.mdx | 1 + .../blog/2024-10-11-where-did-rafiki-money-go.mdx | 1 + .../2024-10-25-rafikis-first-security-audit.mdx | 1 + ...2024-12-03-e2e-testing-wm-browser-extension.mdx | 1 + .../blog/2024-12-11-rafiki-beta-release.mdx | 1 + .../2024-12-17-rafiki-tigerbeetle-integration.mdx | 1 + .../blog/2025-02-05-ilp-packet-lifecycle.mdx | 1 + .../blog/2025-03-12-breakpoint-it-work-week.mdx | 1 + .../blog/es/2025-03-12-breakpoint-it-work-week.mdx | 3 ++- src/pages/blog/[...id].astro | 6 +++++- src/pages/blog/[...page].astro | 3 ++- src/pages/es/blog/[...id].astro | 14 +++++--------- src/pages/es/blog/[...page].astro | 3 ++- 22 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/content.config.ts b/src/content.config.ts index 7c28984..cd6ae92 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -9,6 +9,7 @@ const blogCollection = defineCollection({ title: z.string(), description: z.string(), slug: z.string(), + lang: z.string(), date: z.date(), image: z.string().optional(), tags: z.array(z.string()), diff --git a/src/content/blog/2018-01-29-simplifying-interledger-the-graveyard-of-possible-protocol-features.md b/src/content/blog/2018-01-29-simplifying-interledger-the-graveyard-of-possible-protocol-features.md index 8c630cf..0bf7d7d 100644 --- a/src/content/blog/2018-01-29-simplifying-interledger-the-graveyard-of-possible-protocol-features.md +++ b/src/content/blog/2018-01-29-simplifying-interledger-the-graveyard-of-possible-protocol-features.md @@ -3,6 +3,7 @@ title: "Simplifying Interledger: The Graveyard of Possible Protocol Features" description: As the development of the Interledger Protocol (ILP) nears completion, I thought we should take a moment to remember some of the many core protocol features we’ve killed off along the way. date: 2018-01-29 slug: simplifying-interledger-the-graveyard-of-possible-protocol-features +lang: en authors: - Evan Schwartz author_urls: diff --git a/src/content/blog/2018-10-03-interledger-how-to-interconnect-all-blockchains-and-value-networks.md b/src/content/blog/2018-10-03-interledger-how-to-interconnect-all-blockchains-and-value-networks.md index 3ebb272..2a5a97f 100644 --- a/src/content/blog/2018-10-03-interledger-how-to-interconnect-all-blockchains-and-value-networks.md +++ b/src/content/blog/2018-10-03-interledger-how-to-interconnect-all-blockchains-and-value-networks.md @@ -3,6 +3,7 @@ title: "Interledger: How to Interconnect All Blockchains and Value Networks" description: "Interledger was born out of a project to build a blockchain-agnostic smart contracts platform. A key challenge was neutrality: how could a decentralized app buy resources like storage and computing, without being tied to a specific blockchain?" date: 2018-10-03 slug: interledger-how-to-interconnect-all-blockchains-and-value-networks +lang: en authors: - Evan Schwartz author_urls: diff --git a/src/content/blog/2019-01-23-thoughts-on-scaling-interledger-connectors.md b/src/content/blog/2019-01-23-thoughts-on-scaling-interledger-connectors.md index 869db5d..5c5bdeb 100644 --- a/src/content/blog/2019-01-23-thoughts-on-scaling-interledger-connectors.md +++ b/src/content/blog/2019-01-23-thoughts-on-scaling-interledger-connectors.md @@ -3,6 +3,7 @@ title: Thoughts on Scaling Interledger Connectors description: Streaming payments mean that Interledger connectors need to process huge volumes of Interledger packets, but the current reference implementation is hard to run at scale. date: 2019-01-23 slug: thoughts-on-scaling-interledger-connectors +lang: en authors: - Evan Schwartz author_urls: diff --git a/src/content/blog/2024-04-10-the-telemetry-tale.md b/src/content/blog/2024-04-10-the-telemetry-tale.md index b554f38..c98d086 100644 --- a/src/content/blog/2024-04-10-the-telemetry-tale.md +++ b/src/content/blog/2024-04-10-the-telemetry-tale.md @@ -3,6 +3,7 @@ title: "The Telemetry Tale: A Journey into the Metrics of Interledger" description: When simple metrics are paired with complex cloud solutions and important privacy considerations, the implementation process becomes significantly more complicated. date: 2024-04-10 slug: the-telemetry-tale +lang: en authors: - Sarah Jones author_urls: diff --git a/src/content/blog/2024-07-09-simple-open-payments-guide.md b/src/content/blog/2024-07-09-simple-open-payments-guide.md index 4a4595c..5a6e6a1 100644 --- a/src/content/blog/2024-07-09-simple-open-payments-guide.md +++ b/src/content/blog/2024-07-09-simple-open-payments-guide.md @@ -3,6 +3,7 @@ title: "A Simple Guide to the Open Payments Standard" description: Learn how the Open Payments standard makes online payments easier and more accessible for everyone. date: 2024-07-09 slug: simple-open-payments-guide +lang: en authors: - Sarah Jones author_urls: diff --git a/src/content/blog/2024-07-30-open-payments-cinderella-story.mdx b/src/content/blog/2024-07-30-open-payments-cinderella-story.mdx index 39654ae..84c8d22 100644 --- a/src/content/blog/2024-07-30-open-payments-cinderella-story.mdx +++ b/src/content/blog/2024-07-30-open-payments-cinderella-story.mdx @@ -3,6 +3,7 @@ title: "Open Payments: The Cinderella Story of Finding a Fitting Authorization M description: A breakdown of the unique needs that an authorization method for Open Payments needs to be able to fulfill. date: 2024-07-30 slug: open-payments-cinderella-story +lang: en authors: - Nathan Lie author_urls: diff --git a/src/content/blog/2024-08-13-interledger-universe.mdx b/src/content/blog/2024-08-13-interledger-universe.mdx index 49b7b13..5ce183a 100644 --- a/src/content/blog/2024-08-13-interledger-universe.mdx +++ b/src/content/blog/2024-08-13-interledger-universe.mdx @@ -4,6 +4,7 @@ description: "Or: “What the heck are all those products and protocols?”" ogImageUrl: /developers/img/blog/2024-08-13/og-image.png date: 2024-08-13 slug: interledger-universe +lang: en authors: - Sabine Schaller author_urls: diff --git a/src/content/blog/2024-09-06-integration-tests.mdx b/src/content/blog/2024-09-06-integration-tests.mdx index 4bf60d4..0c0f472 100644 --- a/src/content/blog/2024-09-06-integration-tests.mdx +++ b/src/content/blog/2024-09-06-integration-tests.mdx @@ -3,6 +3,7 @@ title: "Leveling Up Rafiki Testing: Shifting from Manual to Automated" description: "How we automated our manual payment flow tests." date: 2024-09-06 slug: integration-tests +lang: en authors: - Blair Currey author_urls: diff --git a/src/content/blog/2024-09-23-rafiki-code-architecture.mdx b/src/content/blog/2024-09-23-rafiki-code-architecture.mdx index 43c9724..62c1b00 100644 --- a/src/content/blog/2024-09-23-rafiki-code-architecture.mdx +++ b/src/content/blog/2024-09-23-rafiki-code-architecture.mdx @@ -3,6 +3,7 @@ title: "Breaking Down Rafiki: What Makes Our Friend Tick" description: "A low-level introduction to the software packages that comprise Rafiki." date: 2024-09-23 slug: rafiki-low-level-intro +lang: en authors: - Nathan Lie author_urls: diff --git a/src/content/blog/2024-10-11-where-did-rafiki-money-go.mdx b/src/content/blog/2024-10-11-where-did-rafiki-money-go.mdx index 5b6a182..f2eb982 100644 --- a/src/content/blog/2024-10-11-where-did-rafiki-money-go.mdx +++ b/src/content/blog/2024-10-11-where-did-rafiki-money-go.mdx @@ -3,6 +3,7 @@ title: "Where did rafiki.money go?" description: "Or “The need for rebranding when something confuses people.”" date: 2024-10-11 slug: where-did-rafiki-money-go +lang: en authors: - Timea Nagy author_urls: diff --git a/src/content/blog/2024-10-25-rafikis-first-security-audit.mdx b/src/content/blog/2024-10-25-rafikis-first-security-audit.mdx index b51902c..2faba39 100644 --- a/src/content/blog/2024-10-25-rafikis-first-security-audit.mdx +++ b/src/content/blog/2024-10-25-rafikis-first-security-audit.mdx @@ -3,6 +3,7 @@ title: "Rafiki's First Security Audit" description: "Takeaways from Rafiki's 2024 security audit." date: 2024-10-25 slug: rafikis-first-security-audit +lang: en authors: - Max Kurapov author_urls: diff --git a/src/content/blog/2024-12-03-e2e-testing-wm-browser-extension.mdx b/src/content/blog/2024-12-03-e2e-testing-wm-browser-extension.mdx index 45083ee..36fb27a 100644 --- a/src/content/blog/2024-12-03-e2e-testing-wm-browser-extension.mdx +++ b/src/content/blog/2024-12-03-e2e-testing-wm-browser-extension.mdx @@ -3,6 +3,7 @@ title: "End-to-end testing the Web Monetization browser extension" description: "E2E testing browser extensions? It's tricky, but we've got it covered." date: 2024-12-03 slug: e2e-testing-wm-browser-extension +lang: en authors: - Sid Vishnoi author_urls: diff --git a/src/content/blog/2024-12-11-rafiki-beta-release.mdx b/src/content/blog/2024-12-11-rafiki-beta-release.mdx index 3dff438..04f6bba 100644 --- a/src/content/blog/2024-12-11-rafiki-beta-release.mdx +++ b/src/content/blog/2024-12-11-rafiki-beta-release.mdx @@ -3,6 +3,7 @@ title: "Rafiki Beta Release" description: "The Wild is Calling." date: 2024-12-11 slug: rafiki-beta-release +lang: en authors: - Tadej Golobic author_urls: diff --git a/src/content/blog/2024-12-17-rafiki-tigerbeetle-integration.mdx b/src/content/blog/2024-12-17-rafiki-tigerbeetle-integration.mdx index 6984508..363dc84 100644 --- a/src/content/blog/2024-12-17-rafiki-tigerbeetle-integration.mdx +++ b/src/content/blog/2024-12-17-rafiki-tigerbeetle-integration.mdx @@ -3,6 +3,7 @@ title: "Balancing the Ledger: Rafiki's TigerBeetle Integration" description: "How TigerBeetle Supercharges Rafiki’s Financial Core." date: 2024-12-17 slug: rafiki-tigerbeetle-integration +lang: en authors: - Jason Bruwer author_urls: diff --git a/src/content/blog/2025-02-05-ilp-packet-lifecycle.mdx b/src/content/blog/2025-02-05-ilp-packet-lifecycle.mdx index 6e3f852..e52ddad 100644 --- a/src/content/blog/2025-02-05-ilp-packet-lifecycle.mdx +++ b/src/content/blog/2025-02-05-ilp-packet-lifecycle.mdx @@ -3,6 +3,7 @@ title: "The Lifecycle of an Interledger Packet" description: 'A look under the hood of how Rafiki orchestrates an Interledger payment.' date: 2025-02-05 slug: ilp-packet-lifecycle +lang: en authors: - Nathan Lie author_urls: diff --git a/src/content/blog/2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/2025-03-12-breakpoint-it-work-week.mdx index b1d2134..7507f9c 100644 --- a/src/content/blog/2025-03-12-breakpoint-it-work-week.mdx +++ b/src/content/blog/2025-03-12-breakpoint-it-work-week.mdx @@ -3,6 +3,7 @@ title: "The first work week of the season - BreakPoint IT Work Week" description: "The first work week of the season" date: 2025-03-12 slug: breakpoint-it-work-week +lang: en authors: - Timea Nagy author_urls: diff --git a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx index 5ee5478..22125be 100644 --- a/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx +++ b/src/content/blog/es/2025-03-12-breakpoint-it-work-week.mdx @@ -2,7 +2,8 @@ title: "La primera semana de trabajo de la temporada - BreakPoint IT Work Week" description: "La primera semana de trabajo de la temporada" date: 2025-03-12 -slug: es/breakpoint-it-work-week +slug: primera-semana-breakpoint +lang: es authors: - Timea Nagy author_urls: diff --git a/src/pages/blog/[...id].astro b/src/pages/blog/[...id].astro index ccdceff..46bf422 100644 --- a/src/pages/blog/[...id].astro +++ b/src/pages/blog/[...id].astro @@ -5,7 +5,11 @@ import CommunityLinks from "../../components/blog/CommunityLinks.astro"; export async function getStaticPaths() { const blogEntries = await getCollection('blog'); - return blogEntries.map(entry => ({ + const lang = 'en'; + + return blogEntries + .filter((entry) => entry.data.lang.includes(lang)) + .map(entry => ({ params: { id: entry.id }, props: { entry }, })); diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro index ae4c745..01d03fe 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/[...page].astro @@ -10,8 +10,9 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { + const lang = 'en'; const blogEntries = (await getCollection("blog")) - .filter((entry) => ! entry.data.slug.startsWith('es/')) + .filter((entry) => entry.data.lang.includes(lang)) .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); return paginate(blogEntries, { pageSize: 10 }); } diff --git a/src/pages/es/blog/[...id].astro b/src/pages/es/blog/[...id].astro index dab2cb2..35be7d6 100644 --- a/src/pages/es/blog/[...id].astro +++ b/src/pages/es/blog/[...id].astro @@ -8,15 +8,11 @@ export async function getStaticPaths() { const lang = 'es'; return blogEntries - .filter((entry) => entry.data.slug.startsWith('es/')) - .map(entry => { - - const slug = entry.data.slug.replace(/^es\//, ''); - console.log('lang: ', lang) - console.log('blogId: ', slug) - - return { params: { lang, id: slug }, props: {entry} }; - }); + .filter((entry) => entry.data.lang.includes(lang)) + .map(entry => ({ + params: { id: entry.id }, + props: { entry }, + })); } const { entry } = Astro.props; diff --git a/src/pages/es/blog/[...page].astro b/src/pages/es/blog/[...page].astro index ebe59b7..0e97ed4 100644 --- a/src/pages/es/blog/[...page].astro +++ b/src/pages/es/blog/[...page].astro @@ -10,8 +10,9 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { + const lang = 'es'; const blogEntries = (await getCollection("blog")) - .filter((entry) => entry.data.slug.startsWith('es/')) + .filter((entry) => entry.data.lang.includes(lang)) .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); return paginate(blogEntries, { pageSize: 10 }); } From 4f7f9eb2b58277906014c8b4e7015b1858fccb9d Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Fri, 11 Apr 2025 13:57:22 +0200 Subject: [PATCH 15/15] work in progress, dynamic routing to make language for all blog posts and pages work seemlessly across languages --- src/pages/{es => [lang]}/blog/[...id].astro | 14 +++++++------ src/pages/{es => [lang]}/blog/[...page].astro | 20 ++++++++++++++----- src/pages/blog/[...id].astro | 14 +++++++------ src/pages/blog/[...page].astro | 3 +-- src/pages/es/index.astro | 2 +- 5 files changed, 33 insertions(+), 20 deletions(-) rename src/pages/{es => [lang]}/blog/[...id].astro (63%) rename src/pages/{es => [lang]}/blog/[...page].astro (84%) diff --git a/src/pages/es/blog/[...id].astro b/src/pages/[lang]/blog/[...id].astro similarity index 63% rename from src/pages/es/blog/[...id].astro rename to src/pages/[lang]/blog/[...id].astro index 35be7d6..4b3a99d 100644 --- a/src/pages/es/blog/[...id].astro +++ b/src/pages/[lang]/blog/[...id].astro @@ -5,14 +5,16 @@ import CommunityLinks from "../../../components/blog/CommunityLinks.astro"; export async function getStaticPaths() { const blogEntries = await getCollection('blog'); - const lang = 'es'; + const defaultLang = 'en'; return blogEntries - .filter((entry) => entry.data.lang.includes(lang)) - .map(entry => ({ - params: { id: entry.id }, - props: { entry }, - })); + .filter((entry) => entry.data.lang !== defaultLang) // handle the case of missing data? or is that done automatically? + .map((entry) => { + return { + params: { id: entry.id, lang: entry.data.lang }, + props: { entry }, + }; + }); } const { entry } = Astro.props; diff --git a/src/pages/es/blog/[...page].astro b/src/pages/[lang]/blog/[...page].astro similarity index 84% rename from src/pages/es/blog/[...page].astro rename to src/pages/[lang]/blog/[...page].astro index 0e97ed4..613262a 100644 --- a/src/pages/es/blog/[...page].astro +++ b/src/pages/[lang]/blog/[...page].astro @@ -10,14 +10,24 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { - const lang = 'es'; + const defaultLang = 'en'; const blogEntries = (await getCollection("blog")) - .filter((entry) => entry.data.lang.includes(lang)) - .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); - return paginate(blogEntries, { pageSize: 10 }); + const allLangs = Array.from(new Set(blogEntries.map((entry) => entry.data.lang))); + const langs = allLangs.filter((lang) => lang !== defaultLang); + return langs.flatMap((lang) => { + const filteredPosts = blogEntries + .filter((entry) => entry.data.lang !== defaultLang && entry.data.lang === lang) + .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); + + return paginate(filteredPosts, { + pageSize: 10, + params: { lang }, + }); + }); } const { page } = Astro.props; +const { lang } = Astro.params; ---
@@ -45,7 +55,7 @@ const { page } = Astro.props; - {blogPostEntry.data.title} + {blogPostEntry.data.title}

{blogPostEntry.data.description ? blogPostEntry.data.description : excerpt}

)} diff --git a/src/pages/blog/[...id].astro b/src/pages/blog/[...id].astro index 46bf422..c468753 100644 --- a/src/pages/blog/[...id].astro +++ b/src/pages/blog/[...id].astro @@ -5,14 +5,16 @@ import CommunityLinks from "../../components/blog/CommunityLinks.astro"; export async function getStaticPaths() { const blogEntries = await getCollection('blog'); - const lang = 'en'; + const defaultLang = 'en'; return blogEntries - .filter((entry) => entry.data.lang.includes(lang)) - .map(entry => ({ - params: { id: entry.id }, - props: { entry }, - })); + .filter((entry) => entry.data.lang === defaultLang) + .map((entry) => { + return { + params: { id: entry.id }, + props: { entry }, + }; + }); } const { entry } = Astro.props; diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro index 01d03fe..e650c38 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/[...page].astro @@ -10,9 +10,8 @@ type Props = { }; export async function getStaticPaths({ paginate }: any) { - const lang = 'en'; const blogEntries = (await getCollection("blog")) - .filter((entry) => entry.data.lang.includes(lang)) + .filter((entry) => entry.filePath && entry.filePath.match(/\/blog\/[^\/]+\.mdx?$/)) .sort((a:any, b:any) => b.data.date.getTime() - a.data.date.getTime()); return paginate(blogEntries, { pageSize: 10 }); } diff --git a/src/pages/es/index.astro b/src/pages/es/index.astro index 30450c0..76789a3 100644 --- a/src/pages/es/index.astro +++ b/src/pages/es/index.astro @@ -58,7 +58,7 @@ import RafikiIcon from '../../components/logos/RafikiIcon.astro';

Blog de Ingeniería

Nuestro equipo comparte sus ideas y experiencias sobre Interledger y el trabajo que estamos realizando.

- Lee nuestro blog + Lee nuestro blog