# General Translation Changelog: gt-next 6.3.0: msg() を使ってどこでも文字列を翻訳
URL: https://generaltranslation.com/ja/blog/gt-next_v6_3_0.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 
Authors: Ernest McCarter
Published: 2025-08-27

## 概要

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

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

***

## 比較

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

```tsx title="constants.tsx"
export const greeting1 = 'Hello, world!'
export const getGreeting2 = (gt: any) => gt('Hello, world!')
```

```tsx title="Page.tsx"
import { greeting1, getGreeting2 } from './constants'

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

これで、[`msg()`](/docs/react/reference/functions/msg) を使えば、文字列を定数として直接宣言できます。必要なのは、表示時にそれらを `m()` ([`useMessages()`](/docs/react/reference/hooks/use-messages) または [`getMessages()`](/docs/react/nextjs/reference/functions/get-messages) で取得) に通すことだけです。

```tsx title="constants.tsx"
export const greeting1 = 'Hello, world!'
export const greeting2 = msg('Hello, world!')
```

```tsx title="Page.tsx"
import { greeting1, greeting2 } from './constants'

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

***

## エンコードとデコード

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

```
<interpolated content>:<base64 encoded string>
```

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

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

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

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

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

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

### 例

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

```ts title="original.ts"
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()`](/docs/react/reference/functions/msg) と `decodeMsg()` を使う場合:

```ts title="internationalized.ts"
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()`](/docs/react/reference/functions/msg) の呼び出し時にすでに補間されている場合でも、`gt()` 関数内でパラメータを上書きできます。

```tsx title="Page.tsx"
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()`](/docs/react/reference/functions/msg) 関数により、`gt()` 関数をコールスタック経由で受け渡す必要がなくなり、文字列を翻訳するための、よりシンプルで直感的な方法が実現されるとともに、i18n のプロセスも大幅に簡素化されます。

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
