diff --git a/src/components/ArticleList.astro b/src/components/ArticleList.astro index ed52e9e..3e626f1 100644 --- a/src/components/ArticleList.astro +++ b/src/components/ArticleList.astro @@ -24,11 +24,16 @@ const heroLead = activeTerm ? termDescription(activeTerm, locale) : t.articlesLead(shown.length); +// The four "start here" picks; the first renders as the feature card. The +// `recommendedLead` strings below describe exactly these four, in this order: +// the pillar definition post, who owns the business definition layer, and the +// two posts on why AI-built apps are governable and changeable only as +// metadata rather than generated code. const featuredSlugs = [ + 'what-does-the-ontology-is-the-software-mean', 'enterprise-ontology-race-open-vs-closed', 'metadata-not-code-generation', 'vibe-coding-technical-debt-2026', - 'natural-language-to-app-metadata', ]; const isBlogHome = !activeTerm; const featured = isBlogHome @@ -46,49 +51,49 @@ const homeCopy: Record = { en: { recommendedTitle: 'Recommended', - recommendedLead: 'Start here: why the business semantic layer should be open, why AI-native software is metadata rather than generated code, and how one request becomes a governable app.', + recommendedLead: 'Start here: what "the ontology is the software" means, who should own the business definition layer, and why AI-built apps stay governable as metadata, not generated code.', latestTitle: 'Latest Articles', latestLead: 'New writing from the ObjectOS blog.', }, 'zh-Hans': { recommendedTitle: '推荐文章', - recommendedLead: '从这几篇读起:业务语义层为什么该开放、AI 原生应用为什么是元数据而非代码,以及如何用一句话搭出可治理的应用。', + recommendedLead: '从这几篇读起:「本体即软件」是什么意思、业务定义层该归谁所有,以及 AI 生成的应用为什么是元数据而非代码才可治理、可改。', latestTitle: '最新文章', latestLead: '按发布时间浏览 ObjectOS 的最新内容。', }, 'zh-Hant': { recommendedTitle: '推薦文章', - recommendedLead: '從這幾篇讀起:業務語意層為什麼該開放、AI 原生應用為什麼是後設資料而非程式碼,以及如何用一句話搭出可治理的應用。', + recommendedLead: '從這幾篇讀起:「本體即軟體」是什麼意思、業務定義層該歸誰所有,以及 AI 生成的應用為什麼是後設資料而非程式碼才可治理、可改。', latestTitle: '最新文章', latestLead: '按發布時間瀏覽 ObjectOS 的最新內容。', }, ja: { recommendedTitle: 'おすすめ記事', - recommendedLead: 'まずはここから:ビジネスセマンティックレイヤーがなぜオープンであるべきか、AI-native の核心がなぜコードではなくメタデータなのか、そして一文がどうガバナンス可能なアプリになるのか。', + recommendedLead: 'まずはここから:「オントロジーがソフトウェアである」とはどういう意味か、業務定義層は誰が所有すべきか、AI が作ったアプリはなぜコードではなくメタデータならガバナンスでき変えられるのか。', latestTitle: '最新記事', latestLead: 'ObjectOS ブログの新着記事です。', }, de: { recommendedTitle: 'Empfohlen', - recommendedLead: 'Hier anfangen: warum die Business-Semantikschicht offen sein sollte, warum AI-native Metadaten statt Code bedeutet, und wie aus einem Satz eine governte Anwendung wird.', + recommendedLead: 'Hier anfangen: was „Die Ontologie ist die Software“ bedeutet, wem die Geschäftsdefinitionsschicht gehören sollte, und warum AI-gebaute Apps als Metadaten statt Code änderbar bleiben.', latestTitle: 'Neueste Artikel', latestLead: 'Aktuelle Beiträge aus dem ObjectOS Blog.', }, es: { recommendedTitle: 'Recomendados', - recommendedLead: 'Empieza por aquí: por qué la capa semántica de negocio debe ser abierta, por qué AI-native significa metadatos en vez de código, y cómo una frase se convierte en una app gobernable.', + recommendedLead: 'Empieza por aquí: qué significa «La ontología es el software», de quién debe ser la capa de definición del negocio, y por qué las apps hechas con AI se gobiernan como metadatos, no como código.', latestTitle: 'Artículos Recientes', latestLead: 'Publicaciones recientes del blog de ObjectOS.', }, fr: { recommendedTitle: 'Recommandés', - recommendedLead: 'Commencez ici : pourquoi la couche sémantique métier doit être ouverte, pourquoi l’AI-native, c’est des métadonnées plutôt que du code, et comment une phrase devient une application gouvernable.', + recommendedLead: 'Commencez ici : ce que signifie « L’ontologie est le logiciel », à qui doit appartenir la couche de définition du métier, et pourquoi les apps écrites par l’AI restent gouvernables en métadonnées, pas en code.', latestTitle: 'Articles Récents', latestLead: 'Les dernières publications du blog ObjectOS.', }, ko: { recommendedTitle: '추천 글', - recommendedLead: '여기서부터: 비즈니스 시맨틱 레이어가 왜 열려 있어야 하는지, AI-native가 왜 코드가 아니라 메타데이터인지, 그리고 한 문장이 어떻게 거버넌스 가능한 앱이 되는지.', + recommendedLead: '여기서부터: 「온톨로지가 곧 소프트웨어다」가 무슨 뜻인지, 비즈니스 정의 계층은 누가 소유해야 하는지, AI가 만든 앱이 왜 코드가 아니라 메타데이터여야 바꿀 수 있는지.', latestTitle: '최신 글', latestLead: 'ObjectOS 블로그의 최신 글입니다.', }, @@ -234,6 +239,24 @@ const c = homeCopy[locale]; grid-template-columns: repeat(2, minmax(0, 1fr)); } } + /* 641–900px: the feature takes one cell instead of a row of its own, so the + four cards fill a 2×2 grid; a full-row feature over three standard cards + left the fourth cell empty. At this range the feature is already the + stacked card (ArticleCard drops its side-by-side layout below 1024px), so + it gives up nothing it still had, and its thumb takes the standard 16:10 + here so the two covers in a row are the same height. One column instead + would stack three oversized cards and break ArticleCard's `sizes` promise + that a standard thumb is one of two at this range; a third card spanning + both columns reads as a second feature. `.article-item.feature` outranks + ArticleCard's own `.feature .thumb` rule whatever the bundle order. */ + @media (min-width: 641px) and (max-width: 900px) { + .featured-grid :global(.feature) { + grid-column: auto; + } + .featured-grid :global(.article-item.feature .thumb) { + aspect-ratio: 16 / 10; + } + } @media (max-width: 640px) { .hero { margin-bottom: 1.5rem; diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts index 14948c5..cbbc99a 100644 --- a/src/lib/i18n.ts +++ b/src/lib/i18n.ts @@ -268,7 +268,7 @@ const zhHans: Strings = { all: '首页', audience: '受众', articlesTitle: '文章', - articlesLead: (n) => `${n} 篇关于构建 AI-native 软件的文章。`, + articlesLead: (n) => `${n} 篇关于可执行业务本体、运行时治理与 Agent 操作应用的文章。`, backToList: '全部文章', alsoOn: '同步发布于', references: '参考链接', @@ -328,7 +328,7 @@ const ja: Strings = { all: 'ホーム', audience: '読者', articlesTitle: '記事', - articlesLead: (n) => `AI-native ソフトウェア構築に関する ${n} 本の記事。`, + articlesLead: (n) => `実行可能なビジネスオントロジー、ランタイムガバナンス、エージェントが操作するアプリケーションに関する ${n} 本の記事。`, backToList: 'すべての記事', alsoOn: '同時掲載', references: '参考リンク', @@ -388,7 +388,7 @@ const de: Strings = { all: 'Start', audience: 'Zielgruppe', articlesTitle: 'Artikel', - articlesLead: (n) => `${n} ${n === 1 ? 'Artikel' : 'Artikel'} über den Aufbau AI-nativer Software.`, + articlesLead: (n) => `${n} ${n === 1 ? 'Artikel' : 'Artikel'} über ausführbare Geschäftsontologien, Runtime-Governance und von Agents bediente Anwendungen.`, backToList: 'Alle Artikel', alsoOn: 'Auch veröffentlicht auf', references: 'Referenzen', @@ -448,7 +448,7 @@ const es: Strings = { all: 'Inicio', audience: 'Audiencia', articlesTitle: 'Artículos', - articlesLead: (n) => `${n} ${n === 1 ? 'artículo' : 'artículos'} sobre crear software AI-native.`, + articlesLead: (n) => `${n} ${n === 1 ? 'artículo' : 'artículos'} sobre ontologías de negocio ejecutables, gobernanza del runtime y aplicaciones operadas por agentes.`, backToList: 'Todos los artículos', alsoOn: 'También publicado en', references: 'Referencias', @@ -508,7 +508,7 @@ const fr: Strings = { all: 'Accueil', audience: 'Audience', articlesTitle: 'Articles', - articlesLead: (n) => `${n} ${n === 1 ? 'article' : 'articles'} sur la construction de logiciels AI-native.`, + articlesLead: (n) => `${n} ${n === 1 ? 'article' : 'articles'} sur les ontologies métier exécutables, la gouvernance du runtime et les applications opérées par les agents.`, backToList: 'Tous les articles', alsoOn: 'Également publié sur', references: 'Références', @@ -568,7 +568,7 @@ const ko: Strings = { all: '홈', audience: '대상', articlesTitle: '글', - articlesLead: (n) => `AI-native 소프트웨어 구축에 관한 글 ${n}개.`, + articlesLead: (n) => `실행 가능한 비즈니스 온톨로지, 런타임 거버넌스, 에이전트가 운영하는 애플리케이션에 관한 글 ${n}개.`, backToList: '전체 글', alsoOn: '동시 게시', references: '참고 링크',