単一ページでの言語のISOコードを変更する

On my forum we have created a section for Chinese Posts. Everything is working as desired, however the ISO code for the pages still shows English as that is the site setting. Does anyone know if there is a way we can set the category or individual pages to show that they are a different language?

Interesting, what are your thoughts on this @sam

I have not been able to see a way to change this in the existing software. Anyone have an idea if this could be built? I think it could help with traffic on our site as well as many others that have additional languages on one instance. Any direction would be helpful!
-Robert

Not that I’m an expert or anything, but shouldn’t that be possible with JavaScript or something similar?

I agree that it should be possible. I am trying to find a solution or suggestion on how I might implement this as we have multiple languages and I am not sure how I change the language code when someone posts in the Chinese category, however leave it as english when in the other categories. I also want to make sure this is not going to cause any issues elsewhere if we try to implement it. I know there are other forums that run multiple languages, however it looks like all the ones that run more than one language all show an “en” source code when you look at non english pages. Only the forums that are based in another language change. From my limited understanding this will mean that information is harder to find on google and if an english speaking person finds my chinese content google will not offer to translate as it shows english.
-Robert

Unfortunately this isn’t a built-in feature of Discourse. Theme components (javascript) wouldn’t work either, because the page language is set way before any javascript is loaded.

Having separate languages per-category would technically be possible using a plugin. This would work for crawlers like google, and would also trigger browser auto-translation features.

One issue with this is that Discourse is a ‘single page application’, and browsers only seem to check the lang attribute on the initial page load. That means that a user browsing the forum will be ‘stuck’ on the language of the first page they viewed. That may or may not be an issue depending on your use case.

I think the SEO and initial translation benefits of seeing it on a search would outweigh any issues I am seeing once on the forum. I am certainly interested in speaking with someone on what it might take to get this made and what it would look like currently and what might be needed if in the future we add more languages. Would the plugin be set per category or per post etc.
-Robert

Having done some further experimentation, this might not be completely true. Googlebot does render simple javascript when crawling the web, so we should be able to use javascript to modify the language.

To change the language for topics in a specific category (and its sub-categories), you can add something like this to the </head> section of a theme:

<script>
	if(document.querySelector("#breadcrumb-0 a[href='/c/chinese']")){
		document.documentElement.lang = "zh"
    }
</script>

I can’t find any specific documentation from google about whether this is acceptable, but I can see that it works when I “fetch as googlebot”:

@Robert_Fay let us know if you would like a hand adding this to your site.

I’m a bit confused, in looking at the code, there is no #breadcrumb-0 on our page.
image

image

I had tried using

<script>
if(document.querySelector("a.bullet[href='/c/chinese']")){
	document.documentElement.lang = "zh"
}
</script>

but that didn’t seem to do the trick. I have a feeling those elements are loaded later, because the code works in in the browser console, but not in a component /head. Any pointers?

This code is specifically for the crawler view of the site which googlebot sees. It has a different html structure to the regular view.

If you change your browser’s user agent to googlebot then you will see it take effect.

David,

I am still not seeing the change even as google bot. Could the issue be that my category name is actually 中文 技术论坛 and we use chinese as a category slug? Here is the page

 https://forum.digikey.com/c/chinese

中文 技术论坛 - Engineering and Component Solution Forum - TechForum │ Digi-Key
Thank you
-Robert

Ah, I should have specified that the code needs to go in the </body> section of the theme. Alternatively, you can leave it in the </head>, and wrap it like this:

<script>
    document.addEventListener('DOMContentLoaded', function(){
    	if(document.querySelector("#breadcrumb-0 a[href='/c/chinese']")){
    		document.documentElement.lang = "zh";
    	}
    });
</script>

If you would also like the <html lang= to be updated for non-googlebot views, you can add this. Google chrome doesn’t seem to detect the ‘live’ change in language, but other browsers might:

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(()=>{
        const body = document.documentElement.querySelector("body");
        if(body.classList.contains("category-chinese")){
            document.documentElement.lang = "zh";
        }else{
            document.documentElement.lang = I18n.locale;
        }
    });
</script>

This is in and looks like it is working in the googlebot views.
Thank You for all the help!
-Robert

@david さん、こんにちは

最近の監査中に、中国語、スペイン語、ヘブライ語のカテゴリに関するこのコードが断続的にしか機能していないことに気づきました。現在動作しているページでもコンソールにエラーが表示されており、エラーが表示されていないページは検索コンソールで英語のページとして表示されてしまいます。何か心当たりはありますか?

エラーの内容は以下の通りです。

現在使用されている中国語カテゴリのコードです。

<script>
    document.addEventListener('DOMContentLoaded', function(){
    	if(document.querySelector("#breadcrumb-0 a[href='/c/chinese']")){
    		document.documentElement.lang = "zh";
    	}
    });
</script>

簡単なご報告です。エラーが発生しているページでライブテストを行うと、エラーは消えますが、その後、ページが中国語またはスペイン語表示から英語表示に切り替わってしまいます。
-ロバート

data-vocabulary.org の警告は、Discourse の最新バージョンで解決されるはずです。

あなたのサイトにはこの更新が適用されていますので、Googlebot が追いつくのを待つ必要があります。ご指摘の通り、ライブテストを実行すれば警告は解消されます。

残念ながら、パンくずリストのこの再構築により、私たちが考案した小さな言語スクリプトが機能しなくなりました。パンくずリストに #breadcrumb-0 の ID がなくなったため、別の方法が必要です。以下で対応できると思います:

<script>
    document.addEventListener('DOMContentLoaded', function(){
    	if(document.querySelector("#breadcrumbs a[href*='/c/chinese']")){
    		document.documentElement.lang = "zh";
    	}
    });
</script>

ライブテストでこの問題が解決するかお知らせください。

これで中国語カテゴリのアイテムの問題は解決したようですが、サブカテゴリは動作していません。例えば、/c/chinese/FAQ 用に別のものを設定する必要があるでしょうか?

-Robert

ええと、サブカテゴリでも機能するはずです。Googlebotとしてこのトピックを取得すると、lang=zhのメタデータが表示されます。

Googleが試したトピックをキャッシュしている可能性はありませんか?また、このスクリプトはトピックでのみ機能し、カテゴリページ自体では機能しないことを覚えておいてください。

最初のテストで何があったのかよくわかりません。いくつかのサブカテゴリページを作成しましたが、それらは正常に動作しています。

お時間をいただき、ありがとうございます。
ロバート

@david さん、こんにちは

SEO チームと当サイトの確認を行っていたところ、これらのリンクがもう機能していない可能性があることがわかりました。

ドイツ語カテゴリの投稿例:

Google サーチコンソールでクロールされたページを確認すると、英語として表示されています。

現在使用しているコードは以下の通りです。

<script>
    document.addEventListener('DOMContentLoaded', function(){
        if(document.querySelector("#breadcrumbs a[href*='/c/german']")){
            document.documentElement.lang = "de";
        }
    });
</script>

ご協力やご助言をいただければ幸いです。
-ロバート