This commit is contained in:
2025-12-29 11:20:03 +01:00
parent cd264483f8
commit 19b159cab1
10 changed files with 374 additions and 57 deletions

View File

@@ -0,0 +1,67 @@
.elementor-widget-language .elementor-language-switcher {
position: relative;
display: inline-block;
font-family: inherit;
}
.elementor-widget-language .elementor-language-switcher .lang-current {
display: flex;
align-items: center;
gap: 8px;
background: transparent;
border: 0;
padding: 0;
cursor: pointer;
}
.elementor-widget-language .elementor-language-switcher .lang-current img {
width: 16px;
height: auto;
display: block;
}
.elementor-widget-language .elementor-language-switcher .lang-current span {
font-size: 14px;
text-transform: uppercase;
}
.elementor-widget-language .elementor-language-switcher .lang-dropdown {
position: absolute;
top: 100%;
left: 0;
min-width: 100%;
margin: 8px 0 0;
padding: 6px 0;
list-style: none;
background: #fff;
border-radius: 4px;
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
opacity: 0;
visibility: hidden;
transform: translateY(10px);
transition: all 0.25s ease;
z-index: 100;
}
.elementor-widget-language .elementor-language-switcher .lang-dropdown li a {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
color: #000;
text-decoration: none;
white-space: nowrap;
width: -moz-max-content;
width: max-content;
}
.elementor-widget-language .elementor-language-switcher .lang-dropdown li a img {
width: 16px;
height: auto;
}
.elementor-widget-language .elementor-language-switcher .lang-dropdown li a span {
font-size: 14px;
text-transform: uppercase;
}
.elementor-widget-language .elementor-language-switcher .lang-dropdown li a:hover {
background: #f5f5f5;
}
.elementor-widget-language .elementor-language-switcher.is-open .lang-dropdown {
opacity: 1;
visibility: visible;
transform: translateY(0);
}/*# sourceMappingURL=main.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sources":["main.scss","main.css"],"names":[],"mappings":"AACC;EACC,kBAAA;EACA,qBAAA;EACA,oBAAA;ACAF;ADEE;EACC,aAAA;EACA,mBAAA;EACA,QAAA;EACA,uBAAA;EACA,SAAA;EACA,UAAA;EACA,eAAA;ACAH;ADEG;EACC,WAAA;EACA,YAAA;EACA,cAAA;ACAJ;ADGG;EACC,eAAA;EACA,yBAAA;ACDJ;ADKE;EACC,kBAAA;EACA,SAAA;EACA,OAAA;EACA,eAAA;EACA,eAAA;EACA,cAAA;EACA,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,0CAAA;EACA,UAAA;EACA,kBAAA;EACA,2BAAA;EACA,0BAAA;EACA,YAAA;ACHH;ADMI;EACC,aAAA;EACA,mBAAA;EACA,QAAA;EACA,iBAAA;EACA,WAAA;EACA,qBAAA;EACA,mBAAA;EACA,uBAAA;EAAA,kBAAA;ACJL;ADMK;EACC,WAAA;EACA,YAAA;ACJN;ADOK;EACC,eAAA;EACA,yBAAA;ACLN;ADQK;EACC,mBAAA;ACNN;ADaG;EACC,UAAA;EACA,mBAAA;EACA,wBAAA;ACXJ","file":"main.css"}

View File

@@ -0,0 +1,81 @@
.elementor-widget-language {
.elementor-language-switcher {
position: relative;
display: inline-block;
font-family: inherit;
.lang-current {
display: flex;
align-items: center;
gap: 8px;
background: transparent;
border: 0;
padding: 0;
cursor: pointer;
img {
width: 16px;
height: auto;
display: block;
}
span {
font-size: 14px;
text-transform: uppercase;
}
}
.lang-dropdown {
position: absolute;
top: 100%;
left: 0;
min-width: 100%;
margin: 8px 0 0;
padding: 6px 0;
list-style: none;
background: #fff;
border-radius: 4px;
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
opacity: 0;
visibility: hidden;
transform: translateY(10px);
transition: all 0.25s ease;
z-index: 100;
li {
a {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
color: #000;
text-decoration: none;
white-space: nowrap;
width: max-content;
img {
width: 16px;
height: auto;
}
span {
font-size: 14px;
text-transform: uppercase;
}
&:hover {
background: #f5f5f5;
}
}
}
}
&.is-open {
.lang-dropdown {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
}
}
}

View File

@@ -0,0 +1,9 @@
document.addEventListener('click', function (e) {
document.querySelectorAll('.elementor-language-switcher').forEach(function (switcher) {
if (switcher.contains(e.target)) {
switcher.classList.toggle('is-open');
} else {
switcher.classList.remove('is-open');
}
});
});

View File

@@ -0,0 +1,45 @@
<?php
/**
* Plugin Name: Elementor Addon
* Description: Simple hello world widgets for Elementor.
* Version: 1.0.0
* Author: Elementor Developer
* Author URI: https://developers.elementor.com/
* Text Domain: elementor-addon
*
* Requires Plugins: elementor
* Elementor tested up to: 3.21.0
* Elementor Pro tested up to: 3.21.0
*/
function register_hello_world_widget( $widgets_manager ) {
require_once( __DIR__ . '/widgets/language.php' );
$widgets_manager->register( new \Elementor_Language() );
}
add_action( 'elementor/widgets/register', 'register_hello_world_widget' );
function enqueue_elementor_addon_styles() {
if ( did_action( 'elementor/loaded' ) ) {
wp_enqueue_style(
'elementor-addon-main-css',
plugins_url( 'assets/css/main.css', __FILE__ ),
[],
'1.0.0'
);
}
}
add_action( 'wp_enqueue_scripts', 'enqueue_elementor_addon_styles' );
function enqueue_elementor_addon_scripts() {
if ( did_action( 'elementor/loaded' ) ) {
wp_enqueue_script(
'elementor-addon-main-js',
plugins_url( 'assets/js/main.js', __FILE__ ),
[ 'jquery' ],
'1.0.0',
true
);
}
}
add_action( 'wp_enqueue_scripts', 'enqueue_elementor_addon_scripts' );

View File

@@ -0,0 +1,95 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
use Elementor\Controls_Manager;
// use Elementor\Utils;
use Elementor\Icons_Manager;
// use Elementor\Group_Control_Text_Shadow;
// use Elementor\Core\Kits\Documents\Tabs\Global_Colors;
// use Elementor\Core\Kits\Documents\Tabs\Global_Typography;
// use Elementor\Group_Control_Text_Stroke;
// use Elementor\Group_Control_Typography;
class Elementor_Language extends \Elementor\Widget_Base {
public function get_name() {
return 'language';
}
public function get_title() {
return esc_html__( 'Language', 'elementor-addon' );
}
public function get_icon() {
return 'eicon-code';
}
public function get_categories() {
return [ 'basic' ];
}
public function get_keywords() {
return [ 'language', 'translate'];
}
protected function register_controls() {
$this->start_controls_section(
'section_setting',
[
'label' => esc_html__( 'Settings', 'elementor' ),
'tab' => Controls_Manager::TAB_CONTENT,
]
);
$this->end_controls_section();
}
protected function render() {
if ( ! function_exists( 'pll_the_languages' ) ) {
echo '<!-- Polylang not active -->';
return;
}
$languages = pll_the_languages( [
'raw' => 1,
] );
if ( empty( $languages ) ) {
return;
}
$current_lang = null;
foreach ( $languages as $lang ) {
if ( $lang['current_lang'] ) {
$current_lang = $lang;
break;
}
}
?>
<div class="elementor-language-switcher">
<button class="lang-current">
<img src="<?php echo esc_url( $current_lang['flag'] ); ?>" alt="<?php echo esc_attr( $current_lang['name'] ); ?>">
<!-- <span><?php echo esc_html( $current_lang['slug'] ); ?></span> -->
</button>
<ul class="lang-dropdown">
<?php foreach ( $languages as $lang ) :
if ( $lang['current_lang'] ) continue;
?>
<li>
<a href="<?php echo esc_url( $lang['url'] ); ?>">
<img src="<?php echo esc_url( $lang['flag'] ); ?>" alt="<?php echo esc_attr( $lang['name'] ); ?>">
<!-- <span><?php echo esc_html( $lang['slug'] ); ?></span> -->
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php
}
}