Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

見出しを翻訳するとページ内リンクが壊れる #198

Open
numb86 opened this issue Jan 29, 2021 · 0 comments
Open

見出しを翻訳するとページ内リンクが壊れる #198

numb86 opened this issue Jan 29, 2021 · 0 comments

Comments

@numb86
Copy link
Contributor

numb86 commented Jan 29, 2021

現在、#で始まる見出しを翻訳すると、その見出しに対してリンクを張れなくなるという問題が発生しています。

例を上げると、このページの冒頭にある

アプリ内の関数コンポーネントの中で router オブジェクト へアクセスしたいときは、 useRouter フックを利用できます。以下の例をご覧ください:

の「router オブジェクト」というリンクを押下すると、同ページ内のこの見出しにジャンプすることが想定されているのですが、実際にはリンクを押下しても動作しません。

原因は、[`router` オブジェクト](#router-オブジェクト) というマークダウンを書くと、HTML 化する際に「オブジェクト」の部分がe382aae38396e382b8e382a7e382afe38388にエンコードされてしまうからです。
そのため、このリンクのhref#router-e392aae38396e382b8e382a7e382afe38388になり、そのような要素は存在せず、ジャンプが発生しないという状況になってしまっています。

この問題は日本語を含んでいる全ての見出しで発生することであり、何らかの対応が必要だと思います。

私が思い付く対策は、以下の 2 種類です。

  1. aタグを使ってリンクを書く
  2. Heading IDs を使う

aタグを使ってリンクを書く

[`router` オブジェクト](#router-オブジェクト)の代わりに<a href="#router-オブジェクト">`router` オブジェクト</a>のように書くことで、先程のエンコードの問題を回避できます。

Heading IDs を使う

Heading IDsはマークダウンの拡張構文で、

### router オブジェクト {#router-object}

というマークダウンが、

<h3 id="router-object">router オブジェクト</h3>

という HTML に変換されます。

この構文を利用することで、アンカー名を英語のままにすることができるので、aタグを使わなくてもこの見出しにリンクを張ることができます。

現状ではこの構文はサポートされていませんが、ローカル環境で試したところ、以下のプラグインを使うことで導入できました。
imcuttle/remark-heading-id: The remark plugin for supporting custom heading id

どちらを使うべきか

Heading IDs が望ましいと考えています。

マークダウンファイルのなかにaタグを書くのが不格好で煩雑、というのもあるのですが、見出しからアンカー名を自動生成していること自体が望ましくないと考えています。

今の仕組みだと、見出しを翻訳する度にアンカー名が変わってしまうため、そこに対するリンクも修正する必要があります。これは手間ですし、見落とす可能性が十分にあります。
現に、このページにも「router オブジェクト」へのリンクがあるのですが、翻訳に合わせた対応は行われておらず、#router-objectへのリンクになっています。このようなアンカーは存在しないので当然、ワークしていません。
Heading IDs を使ってアンカー名を原文と同じにするようにすれば、[`router` オブジェクト](#router-object)[`router` オブジェクト](#router-オブジェクト)を書き換えるような作業は発生しません。

また、アンカー名は URL の一部なので、日本語を含めるべきではないと思います。
オリジン以降のパスは、本家と翻訳ドキュメントとで一致しているのが分かりやすくて望ましいと思いますが、アンカー名が翻訳されてしまうと、その関係が崩れてしまいます。
このような観点からも、Heading IDs を導入して「見出しのテキスト」と「アンカー名」を切り離すべきだと考えます。

もちろん、より望ましい解決策、よりシンプルな解決策があれば、それに越したことはないのですが。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant