<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>I18n on nsys.dev 技術ブログ</title>
		<link>https://blog.nsys.dev/tags/i18n/</link>
		<description>Recent content in I18n on nsys.dev 技術ブログ</description>
		<generator>Hugo</generator>
		<language>ja</language>
		
		
		
		
			<lastBuildDate>Mon, 15 Jun 2026 13:00:00 +0900</lastBuildDate>
		
			<atom:link href="https://blog.nsys.dev/tags/i18n/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>多言語サイトの設計 ― テキストを 3 種類に分けて持つ</title>
				<link>https://blog.nsys.dev/posts/i18n-design/</link>
				<pubDate>Mon, 15 Jun 2026 13:00:00 +0900</pubDate>
				<guid>https://blog.nsys.dev/posts/i18n-design/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;シリーズ・第 3 回&lt;/strong&gt; — 「個人で出版ツールを作って配るまで」（全 5 回予定）。前回は&lt;a href=&#34;https://blog.nsys.dev/posts/contract-the-output/&#34;&gt;出力を契約する&lt;/a&gt;話でした。一覧は &lt;a href=&#34;https://blog.nsys.dev/tags/crofty/&#34;&gt;シリーズの記事一覧&lt;/a&gt; から。今回のテーマは「多言語対応をどう設計するか」です。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;「サイトを多言語にする」と聞くと、まず本文の翻訳を思い浮かべます。でも実際にやってみると、翻訳が要るテキストは本文だけではありませんでした。ナビのラベル、プロフィール、設定値。それぞれ性質が違い、同じ入れ物に押し込むと無理が出ます。&lt;/p&gt;&#xA;&lt;p&gt;うまくいったのは、テキストを種類ごとに分けて、それぞれに合った持ち方をする設計でした。今回はその話です。例として Hugo（crofty が内部で使うもの）を挙げます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;テキストは-3-種類に分かれる&#34;&gt;テキストは 3 種類に分かれる&lt;/h2&gt;&#xA;&lt;p&gt;多言語サイトのテキストを整理すると、だいたい次の 3 種類になります。住む場所も、翻訳の仕組みも別です。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;種類&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;例&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;持ち方&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;本文&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;記事&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;言語ごとのファイル&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;固定文言&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ナビ、ボタン、「Support」&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;言語 → 文字列の翻訳テーブル&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;設定・データ&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;サイト設定、プロフィール&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;フィールド単位で「共通」か「言語ごと」&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;ひとつずつ見ます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;本文--言語ごとのファイル&#34;&gt;本文 ― 言語ごとのファイル&lt;/h2&gt;&#xA;&lt;p&gt;記事は、ひとつのフォルダ（ページバンドル）に言語別のファイルを並べます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content/posts/my-article/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  index.md       … 日本語（既定言語）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  index.en.md    … 英語&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  photo.avif     … 同梱する画像&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ビルドすると &lt;code&gt;/posts/my-article/&lt;/code&gt; と &lt;code&gt;/en/posts/my-article/&lt;/code&gt; の両方ができ、言語の切り替えはページ同士のリンクで済みます。JavaScript は要りません。&lt;/p&gt;&#xA;&lt;p&gt;ひとつだけ小さな罠があります。画像（ページではないファイル）は既定言語のパスにしか出力されないので、英語版から相対参照すると 404 になります。英語版だけ、絶対パスで既定言語側を指せば直ります。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;![&lt;span class=&#34;nt&#34;&gt;図&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;photo.avif&lt;/span&gt;)                     &amp;lt;!-- 日本語：相対でよい --&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;![&lt;span class=&#34;nt&#34;&gt;図&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;/posts/my-article/photo.avif&lt;/span&gt;)   &amp;lt;!-- 英語：絶対パスで指す --&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;固定文言--翻訳テーブル&#34;&gt;固定文言 ― 翻訳テーブル&lt;/h2&gt;&#xA;&lt;p&gt;ナビゲーションやボタンのラベルのような、記事に依らない固定の文言は、本文に混ぜません。言語から文字列を引く「翻訳テーブル」でまとめて持ちます。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
