Opened 22 months ago

Last modified 22 months ago

#33998 closed Bug

Use alternates and i18n generate duplicated URLs in the sitemap — at Initial Version

Reported by: brenosss Owned by: nobody
Component: contrib.sitemaps Version: 4.0
Severity: Normal Keywords: sitemap, i18n, alternates
Cc: Florian Demmer Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

If the i18n variable is set for True, the SiteMapClass generates a different URL for each item in LANGUAGES, but I'm using the alternates I expected to have only one URL for the default language and have the translations version in the alternates URLs.

The current function:

    def _items(self):
        if self.i18n:
            # Create (item, lang_code) tuples for all items and languages.
            # This is necessary to paginate with all languages already considered.
            items = [
                (item, lang_code)
                for lang_code in self._languages()
                for item in self.items()
            ]
            return items
        return self.items()

This is a e.g of a result:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <url>
        <loc>https://example.com/en/contact</loc>
        <changefreq>weekly</changefreq>
        <priority>0.5</priority>
        <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/contact" />
        <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/contact" />
        <xhtml:link rel="alternate" hreflang="el" href="https://example.com/el/contact" />
    </url>
    <url>
        <loc>https://example.com/es/contact</loc>
        <changefreq>weekly</changefreq>
        <priority>0.5</priority>
        <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/contact" />
        <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/contact" />
        <xhtml:link rel="alternate" hreflang="el" href="https://example.com/el/contact" />
    </url>
    <url>
        <loc>https://example.com/el/contact</loc>
        <changefreq>weekly</changefreq>
        <priority>0.5</priority>
        <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/contact" />
        <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/contact" />
        <xhtml:link rel="alternate" hreflang="el" href="https://example.com/el/contact" />
    </url>
</urlset>

I propose to verify if the alternates is True and generate the items only for the default language:

    def _items(self):
        if self.i18n:
            if self.alternates:
                lang_code = self.default_lang or settings.LANGUAGE_CODE
                items = self.items()
                items = [
                    # The url will be generated based on the default language the translations links will be added in the alternate links
                    (item, lang_code)
                    for item in items
                ]
                return items
            # Create (item, lang_code) tuples for all items and languages.
            # This is necessary to paginate with all languages already considered.
            items = [
                (item, lang_code)
                for lang_code in self._languages()
                for item in self.items()
            ]
            return items
        return self.items()

Then i expected a result more like:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <url>
        <loc>https://example.com/en/contact</loc>
        <changefreq>weekly</changefreq>
        <priority>0.5</priority>
        <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/contact" />
        <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/contact" />
        <xhtml:link rel="alternate" hreflang="el" href="https://example.com/el/contact" />
    </url>
</urlset>

This makes sense? can I start work on it?

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top