戻る

gt-next@6.6.0

Ernest McCarter avatarErnest McCarter
gt-next6.6.0Dictionary translationtranslation

概要

gt-next 6.6.0 では、既存の「ブラウンフィールド」アプリを国際化するための新しいアプローチを導入します。翻訳済みの辞書構造を返すことができる t.obj() 関数を追加しました。


モチベーション

「ブラウンフィールド」と「グリーンフィールド」という用語は、不動産開発の分野から借用されたものです。グリーンフィールドは既存の構造物がない土地を指し、ブラウンフィールドは既存の構造物がある土地を指します。i18n の文脈では、これは i18n インフラが存在しないアプリ(グリーンフィールド)と、すでに i18n インフラを備えたアプリ(ブラウンフィールド)の違いに相当します。

これまで当社のライブラリは、「グリーンフィールド」なアプリの国際化に非常に強くフォーカスしてきました。たとえば <T> コンポーネントや useGT() フックなどです。

「ブラウンフィールド」なアプリ向けに特化して用意してきたインフラは、next-intl の dictionary パターンに倣った const t = useTranslations()const t = getTranslations() フックのみです。しかし、当社の t() 関数には制約があり、文字列しか返せず、dictionary のサブツリーは返せませんでした。

ここから分かったのは、開発者はしばしば、i18n ライブラリに対して単なる文字列ではなく dictionary のサブツリーを返してくれることを期待しているという点です。そのため、開発者が他の i18n ライブラリから移行する際に、gt-next がこの機能をサポートしていることが重要になります。


使用方法

繰り返し処理を行いたい項目のリストを含む、次のような辞書構造を考えてみましょう。

{
  "cards": [
    {
      "title": "カード1",
      "description": "カード1の説明"
    },
    {
      "title": "カード2",
      "description": "カード2の説明"
    },
    {
      "title": "カード3",
      "description": "カード3の説明"
    }
  ]
}

従来の方法では、各項目に対して、そのキーを正確に指定して個別にアクセスする必要がありました。

import { useTranslations } from 'gt-next'

export default function Page() {
  const t = useTranslations()

  return (
    <>
      <div>
        {t('cards.0.title')}
        {t('cards.0.description')}
      </div>
      <div>
        {t('cards.1.title')}
        {t('cards.1.description')}
      </div>
      <div>
        {t('cards.2.title')}
        {t('cards.2.description')}
      </div>
    </>
  )
}

このアプローチは、明らかにスケーラブルでも保守可能でもありません。

新しい t.obj() 関数は、辞書構造にサブツリーとしてアクセスするための強力な手段を提供します。

import { useTranslations } from 'gt-next'

export default function Page() {
  const t = useTranslations()

  return (
    <>
      <div>
        {t.obj('cards').map((card) => (
          <div key={card.title}>
            {card.title}
            {card.description}
          </div>
        ))}
      </div>
    </>
  )
}

まとめ

t.obj() 関数は、green field / brown field のいずれのアプリケーションに対しても gt-next をより柔軟にするうえで、大きな前進となる機能です。開発者が辞書のサブツリーを直接扱えるようにすることで、既存アプリケーションの国際化における大きな摩擦要因を取り除いています。

この拡張により、gt-next はモダンな i18n ライブラリにチームが期待する開発者体験にさらに近づき、翻訳済みコンテンツの反復処理が容易になり、より動的でメンテナンスしやすい国際化対応アプリケーションを構築しやすくなります。