その他の機能
Components
src/components/i18n/
内には多言語サイトを生成する上で便利なUIコンポーネントをいくつか用意しています。必要に応じて内容をカスタムしたり、importしてご利用ください。
LocaleSelect.astro
利用言語を切り替えるためのセレクトUIです。
LocaleSelectSingle.astro
利用言語を切り替えるためのリンクUIです。言語を2つしかサポートしない場合にご利用ください。
LocalesHomeList.astro
各言語のトップページへのリンクを、<li>
タグのリストで返します。
LocaleSuggest.astro
ユーザーがブラウザの言語と違うURLにアクセスした場合に、ブラウザの言語へのリンクを最上部に表示するUIです。
例えば、英語設定のブラウザで /ja/[slug]
というURLにアクセスした場合、 /en/[slug]
へのリンクを提案します。
いちど閉じると設定がlocalhostに保存され、再表示されません。
LocaleHtmlHead.astro
localeごとの <head>
タグ設定を記述できます。サンプルでは各言語のNoto Fontを読み込んでCSSを反映しています。
NotTranslateCaution.astro
あるページを特定の言語でしか用意できない場合に、ユーザーに警告を表示できます。
Monolingualページがサンプルです。英語以外の言語でこのページを表示すると、ユーザーに警告UIを表示します。
サンプルでは警告UIのテキストは、/src/const.ts
内に設定しています。
404
Astro i18n Starter の404ページは2つのファイルから構成されています。404ページのデザインをカスタムしたい場合、基本的に src/pages/[lang]/404.astro
だけを編集すればOKです。
src/pages/404.astro
このファイルは以下を生成します。
/404.html
多くのデプロイサービスはページが見つからない場合、まずこのファイルを見つけて使用します。
https://docs.astro.build/en/basics/astro-pages/#custom-404-error-page
Astro i18n Starter でこのファイルにアクセスされた場合、ユーザーのシステム言語などに対応して、以下の404ページにリダイレクトします。
詳細なリダイレクト条件
以下の条件分岐によりリダイレクトを行います。詳しくはソースコードをご確認ください。
- URLが
/ja/...
のようにlangを含む場合 localStorage.selectedLang
にlangを含む場合localStorage.selectedLang
はユーザーがUI上で言語を選択したタイミングで保存されます。
- リンク元のページが
/ja/...
のようにlangを含む場合
src/pages/[lang]/404.astro
このファイルは以下を動的に生成します。
- /en/404/index.html
- /ja/404/index.html
- …
history.replaceState()
処理により、ブラウザにはユーザーがリダイレクト前にアクセスしたURLのpathnameが表示されます。
CSS Tips
言語ごとにCSSを分けたい場合
以下のように記述することで、CSSだけで定義を分けることができます。
:lang(en) {
/* 英語のスタイル */
}
:lang(ar) {
/* アラビア語のスタイル */
}
ただしこの場合、すべての言語のCSSを同時に読み込むことになるため、リソースの無駄になります。
.astro
ファイルの中であれば以下のように書いたり、もしくはLocaleHtmlHead.astroの中で定義を分けることを検討してください。
---
import { type Lang } from "@/i18n";
const locale = Astro.currentLocale as Lang;
---
{
locale === "en" ? (
<style>
/* 英語のスタイル */
</style>
)
: locale === "ar" ? (
<style>
/* アラビア語のスタイル */
</style>
)
: null
}
アラビア語のletter-spacing
見出しなどデザインによっては文字間隔を調整したい場合があります。ただし、そのような場合でもアラビア語だけは間隔を開けるべきではありません。
そのためAstro i18n Starterでは、src/styles/base.css
の中に以下が定義されていることに注意してください。
:lang(ar) {
* { letter-spacing: 0 !important; }
}
アイコンのRTL
RTL言語では、矢印などのアイコンは反転する必要があります。
Astro i18n StarterではMaterial Iconを使用しており、src/styles/base.css
の中に以下が定義されています。
[class^="material-icons"]:dir(rtl).dir {
scale: -1 1;
}
以下のように.dir
クラスをつけることで、RTL言語の表示ではアイコンが反転されます。
<span class="material-icons-sharp dir">arrow_forward</span>
実際の表示: