戻る

gt-next@6.3.0

Ernest McCarter avatarErnest McCarter
gt-next6.3.0AI 開発文字列の翻訳

概要

gt-next 6.3.0 では、人間の開発者にも AI 開発者にも適したライブラリへと、さらに近づきました。このリリースの基本方針は、i18n に必要な中核機能を導入しつつ、既存コードへの影響を最小限に抑えることでした。

そのために、コードベースのどこからでも文字列を翻訳できる新しい msg() 関数を導入します。これまでは、文字列を翻訳するには useGT() または getGT() から得た gt() 関数をコールスタックに沿って受け渡す必要がありました。msg() を使えば、文字列を一度ラップするだけで、あとはレンダリング時に m() に渡せます。


比較

従来は、文字列をラップするために、gt() 関数を複数のレイヤーにまたがって受け渡す必要がありました。

export const greeting1 = 'Hello, world!'
export const getGreeting2 = (gt: any) => gt('Hello, world!')
import { greeting1, getGreeting2 } from './constants'

export default function Page() {
  const gt = useGT()
  return (
    <div>
      {greeting1}
      {getGreeting2(gt)}
    </div>
  )
}

これで、msg() を使えば、文字列を定数として直接宣言できます。必要なのは、表示時にそれらを m() (useMessages() または getMessages() で取得) に通すことだけです。

export const greeting1 = 'Hello, world!'
export const greeting2 = msg('Hello, world!')
import { greeting1, greeting2 } from './constants'

export default function Page() {
  const m = useMessages()
  return (
    <div>
      {greeting1}
      {m(greeting2)}
    </div>
  )
}

エンコードとデコード

補間をサポートするため、msg() 関数は通常の文字列ではなく、エンコードされたメッセージを返します。形式は次のとおりです。

<interpolated content>:<base64 encoded string>

base64 エンコードされた部分には、次の内容を含む JSON オブジェクトが格納されています。

  • $_hash: 元の文字列のハッシュ
  • $_source: メッセージに埋め込まれたパラメーター
  • $id: カスタムの一意な識別子 (指定されている場合)
  • $context: メッセージのコンテキスト (指定されている場合)
  • 補間に含まれる任意の変数

この設計により、文字列を直接比較した場合の挙動はわずかに変わりますが、型付けやコード構造への影響は最小限に抑えられます。補間された内容にアクセスするには、decodeMsg() を使用します。

なぜエンコード済み文字列なのか?

エンコード済み文字列を使わない場合、代わりに msg() は追加のメタデータを含むカスタムオブジェクト型を返す必要があります。これは encode/decode のパラダイムでは機能しますが、厳密な型付けでは問題が生じます。

このケースで i18n の影響を最小限に抑える最善の方法は、メタデータを含んだ文字列を返すことだ、という結論に至りました。

i18n を使用しない元のコード:

const name = 'John'
const message = `Hello, ${name}!`

if (message.length > 10) {
  console.log('The message is too long')
} else {
  console.log('The message is just the right length')
}

msg()decodeMsg() を使う場合:

import { msg, decodeMsg } from 'gt-next'

const name = 'John'
const message = msg('Hello, {name}!', { name })

if (decodeMsg(message).length > 10) {
  console.log('The message is too long')
} else {
  console.log('The message is just the right length')
}

その他

msg() の呼び出し時にすでに補間されている場合でも、gt() 関数内でパラメータを上書きできます。

import { msg, useMessages } from 'gt-next'

const message = msg('Hello, {name}!', { name: 'John' })

export default function Page() {
  const m = useMessages()
  return <div>{m(message, { name: 'Jane' })}</div> // これは "Hello, Jane!" を返します
}

概要

このリリースでは、i18n のオーバーヘッドを最小限に抑えながら、gt-next をより開発者にやさしいものにすることに重点を置いています。新しい msg() 関数により、gt() 関数をコールスタック経由で受け渡す必要がなくなり、文字列を翻訳するための、よりシンプルで直感的な方法が実現されるとともに、i18n のプロセスも大幅に簡素化されます。