gt-next@6.3.0
概要
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 のプロセスも大幅に簡素化されます。