Support » Theme: Tiny Framework » Use of Flags for Polylang language switcher inside Primary Menu

  • Resolved felix76

    (@felix76)


    I’m using the Polylang Plugin for multilingual support. It works with your great tiny framework theme well; see documentation https://polylang.pro/doc/theme-internationalization-and-localization/

    The only problem is to display language flags inside the ‘Primary Menu’, because of the esc_html filter in the functions.php (I thought), which displace html, so that the inserted image becomes <img src=”data:image/png;base64… etc. instead of <img … . Plain text is displayed instead of html.

    So I tried to remove the filter in the functions.php of my child theme, but this did not work.

    'primary' => __( 'Primary Menu', 'tiny-framework' )

    (instead of: 'primary' => esc_html__( 'Primary Menu', 'tiny-framework' ) )

    I know, that esc_html is necessary to avoid injecting code by translations – see https://codex.wordpress.org/Function_Reference/esc_html.

    Is there another thing I must take in concern, if I would like to show flags inside the Primary Menu?

    I would appreciate an answer if someone knows a solution. Thank you.

Viewing 4 replies - 1 through 4 (of 4 total)
  • Theme Author Tomas Mackevicius

    (@tomasm)

    <img src=”data:image/png;base64... shows that most likely the plugin wants to add images as an embeded code to the html file itself vs linking to an image file.

    See: https://stackoverflow.com/questions/1207190/embedding-base64-images

    I guess this way they want to speedup the page load by avoiding additional links to external resources.

    You could ask them if you can have control of manualy adding images, or selecting linked images vs base64 encoded.

    I never used base64 encoded resources in my themes, so I do not have experience with this and how WP deals with that. If you were not able to add normal images, then it would be easier to test.

    Hello Tomas,

    thanks for your quick reply.

    I tried to substitute the flags by my own png, which is described here: https://polylang.pro/doc/the-language-switcher/#customizing-flags . But this didn’t solve the problem, even though the image source is src=”http://…” now.

    The problem is output of plain text instead of HTML. Now I saw, that in my first question the HTML opening tag of <img is displayed correctly as left-angle bracket, but in source code output resp. the HTML entity name is displayed, see https://www.w3schools.com/html/html_entities.asp . I think, that causes the wrong output.

    Here is the full output of the item for the langugae switcher in the Primary Menu:

    <li id="menu-item-390-en" class="lang-item lang-item-5 lang-item-en menu-item menu-item-type-custom menu-item-object-custom menu-item-390-en"><a href="http://www.domain.tld/en/" hreflang="en-GB" lang="en-GB"><img src="http://www.domain.tld/wordpress/wp-content/polylang/en_GB.png" title="English" alt="English" /><span style="margin-left:0.3em;">English</span></a></li>

    To avoid this, I tried to remove the esc_html filter for the Primary Menu in the functions.php. Without language flag the output is correctly – without < and > (as HTML entities)

    This is the output without language flag:

    <li id="menu-item-390-en" class="lang-item lang-item-5 lang-item-en menu-item menu-item-type-custom menu-item-object-custom menu-item-390-en"><a href="http://www.domain.tld/en/" hreflang="en-GB" lang="en-GB">English</a></li>

    Without changes in the theme functions it’s also possible to use CSS as easy work around to display language specific flags, as I did now.

    Here is my solution: I added the PNGs for the provided languages to the images folder of the child theme an added the following two rules to my style.css. And Voila! The languages flags are displayed. I use single before with single : to support this styling also for IE8.

    #primary-menu li.lang-item-en:before { content: url('images/en_GB.png') " "; }
    #primary-menu li.lang-item-de:before { content: url('images/de_DE.png') " "; }

    I hope this solution helps user users of Tiny Framework and the Polylang Plugin as well.

    PS: Sorry, the code examples are not correctly displayed, because html entity names are correctly displayed. I don’t know how to mask html entity names in the forum editor.

    • This reply was modified 2 months, 3 weeks ago by  felix76.
    • This reply was modified 2 months, 3 weeks ago by  felix76.
    • This reply was modified 2 months, 3 weeks ago by  felix76.
    • This reply was modified 2 months, 3 weeks ago by  felix76.
    • This reply was modified 2 months, 3 weeks ago by  felix76.
    • This reply was modified 2 months, 3 weeks ago by  felix76.

    Small correction:

    #primary-menu li.lang-item-en a:before { content: url('images/en_GB.png') " "; }
    #primary-menu li.lang-item-de a:before { content: url('images/de_DE.png') " "; }

    The pseudo class :before should be used for a, not the li; otherwise it’s not fine in mobile view.

    Theme Author Tomas Mackevicius

    (@tomasm)

    Smart move! Instead of using linked images, you showed them with CSS 😀

Viewing 4 replies - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.