Just a quick tip for anyone who wants to do this.
Following this: https://support.google.com/webmasters/answer/189077
Chunk code:
<link rel="alternate" hreflang="en"
href="[[!++site_url]][[lingua.getHrefLang? &id=`[[*id]]` &field=`alias` &page_language=`en`]].html" />
<link rel="alternate" hreflang="fr"
href="[[!++site_url]][[lingua.getHrefLang? &id=`[[*id]]` &field=`alias` &page_language=`fr`]].html" />
<link rel="alternate" hreflang="es"
href="[[!++site_url]][[lingua.getHrefLang? &id=`[[*id]]` &field=`alias` &page_language=`es`]].html" />
<link rel="alternate" hreflang="ru"
href="[[!++site_url]][[lingua.getHrefLang? &id=`[[*id]]` &field=`alias` &page_language=`ru`]].html" />
<link rel="alternate" hreflang="zh"
href="[[!++site_url]][[lingua.getHrefLang? &id=`[[*id]]` &field=`alias` &page_language=`zh`]].html" />
<link rel="alternate" hreflang="x-default"
href="[[!++site_url]][[lingua.getHrefLang? &id=`[[*id]]` &field=`alias` &page_language=`en`]].html" />
Create a new Snippet called ‘lingua.getHrefLang’ which is a copy of the ‘lingua.getValue’ Snippet but with one change. At line 43, change:
'lang_code' => $modx->cultureKey
to
'lang_code' => $page_language
This will only work if you assign translated aliases for each resource in each language. I use the alias in my menus ie: <a href="[[lingua.getValue? &id=3
&field=alias
]].html"