Skip to content

Instantly share code, notes, and snippets.

@zeshanshani
Last active February 19, 2023 06:12
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save zeshanshani/fade1ba03e7d35a2542ef1eabe92becf to your computer and use it in GitHub Desktop.
Save zeshanshani/fade1ba03e7d35a2542ef1eabe92becf to your computer and use it in GitHub Desktop.
Custom Language Switcher for Polylang. Contains both the PHP function and SCSS styling. HTML markup is using BEM methodology. SCSS file is using my variables and mixins from here: https://gist.github.com/zeshanshani/c4d5ae43e6a9f661d012
/* Component: Languages */
.languages__item {
text-transform: uppercase;
color: #899099;
font-size: 13px;
font-size: 1.3rem;
line-height: 1.15;
}
.languages__item--current {
color: #212121;
}
.languages__item:before {
content: ' / ';
color: #899099;
}
.languages__item:first-child:before {
content: '';
}
.languages a.languages__item:hover {
color: #212121;
}
<?php // Don't copy this line in functions.php file if it's already added.
/**
* Show Polylang Languages with Custom Markup
* @param string $class Add custom class to the languages container
* @return string
*/
function rarus_polylang_languages( $class = '' ) {
if ( ! function_exists( 'pll_the_languages' ) ) return;
// Gets the pll_the_languages() raw code
$languages = pll_the_languages( array(
'display_names_as' => 'slug',
'hide_if_no_translation' => 1,
'raw' => true
) );
$output = '';
// Checks if the $languages is not empty
if ( ! empty( $languages ) ) {
// Creates the $output variable with languages container
$output = '<div class="languages' . ( $class ? ' ' . $class : '' ) . '">';
// Runs the loop through all languages
foreach ( $languages as $language ) {
// Variables containing language data
$id = $language['id'];
$slug = $language['slug'];
$url = $language['url'];
$current = $language['current_lang'] ? ' languages__item--current' : '';
$no_translation = $language['no_translation'];
// Checks if the page has translation in this language
if ( ! $no_translation ) {
// Check if it's current language
if ( $current ) {
// Output the language in a <span> tag so it's not clickable
$output .= "<span class=\"languages__item$current\">$slug</span>";
} else {
// Output the language in an anchor tag
$output .= "<a href=\"$url\" class=\"languages__item$current\">$slug</a>";
}
}
}
$output .= '</div>';
}
return $output;
}
/* Component: Languages */
.languages {
// El: Item
&__item {
text-transform: uppercase;
color: #899099;
font-size: 13px;
line-height: 1.15;
// Mod: Current
&--current {
color: #212121;
}
// Divider
&:before {
content: ' / ';
color: #899099;
}
// Remove divider from first item
&:first-child:before {
content: '';
}
}
// Hover Styling for links
a.languages__item:hover {
color: #212121;
}
}
@selincodes
Copy link

@zeshanshani thank you!

@pgroot91
Copy link

pgroot91 commented Apr 25, 2021

Thanks for this code snippets! Just having trouble to get the name? any idea why the following is not working?

$name = $language['name'];

EDIT: figured it out! forgot to change the slug to name in the following line:

'display_names_as' => 'slug', to 'display_names_as' => 'name',

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment