start_controls_section( 'section_content', array( 'label' => __( 'Content', 'elementor' ) ) // phpcs:ignore WordPress.WP.I18n ); $this->add_control( 'layout', array( 'label' => __( 'Layout', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SELECT, 'options' => array( 'horizontal' => __( 'Horizontal', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'vertical' => __( 'Vertical', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'dropdown' => __( 'Dropdown', 'connect-polylang-elementor' ), ), 'default' => 'horizontal', 'prefix_class' => 'cpel-switcher--layout-', 'render_type' => 'template', ) ); $this->add_control( 'align_items', array( 'label' => __( 'Alignment', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::CHOOSE, 'options' => array( 'left' => array( 'title' => __( 'Left', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'icon' => 'eicon-h-align-left', ), 'center' => array( 'title' => __( 'Center', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'icon' => 'eicon-h-align-center', ), 'right' => array( 'title' => __( 'Right', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'icon' => 'eicon-h-align-right', ), 'justify' => array( 'title' => __( 'Stretch', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'icon' => 'eicon-h-align-stretch', ), ), 'prefix_class' => 'cpel-switcher--align-', ) ); $this->add_control( 'hide_current', array( 'label' => __( 'Hides the current language', 'polylang' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => '', 'separator' => 'before', ) ); $this->add_control( 'hide_missing', array( 'label' => __( 'Hides languages with no translation', 'polylang' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => '', ) ); $this->add_control( 'show_country_flag', array( 'label' => __( 'Displays flags', 'polylang' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => 'yes', ) ); $this->add_control( 'show_language_name', array( 'label' => __( 'Displays language names', 'polylang' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => 'yes', ) ); $this->add_control( 'show_language_code', array( 'label' => __( 'Displays language codes', 'connect-polylang-elementor' ), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => '', ) ); $this->end_controls_section(); /** Style: Main menu */ $this->start_controls_section( 'main_section', array( 'label' => __( 'Main Menu', 'connect-polylang-elementor' ), 'tab' => Controls_Manager::TAB_STYLE, ) ); $this->start_controls_tabs( 'tabs_menu_item_style' ); $this->start_controls_tab( 'tab_menu_item_normal', array( 'label' => __( 'Normal', 'elementor' ) ) // phpcs:ignore WordPress.WP.I18n ); $this->add_group_control( Group_Control_Typography::get_type(), array( 'name' => 'typography_menu_item', 'global' => array( 'default' => Global_Typography::TYPOGRAPHY_PRIMARY ), 'selector' => '{{WRAPPER}} .cpel-switcher__lang a', ) ); $this->add_control( 'color_menu_item', array( 'label' => __( 'Text Color', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::COLOR, 'global' => array( 'default' => Global_Colors::COLOR_TEXT ), 'default' => '', 'selectors' => array( '{{WRAPPER}} .cpel-switcher__lang a' => 'color: {{VALUE}}', '{{WRAPPER}} .cpel-switcher__icon' => 'color: {{VALUE}}', ), ) ); $this->add_control( 'bg_dropdown_item', array( 'label' => __( 'Background Color', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::COLOR, 'default' => '#FFFFFF', 'selectors' => array( '{{WRAPPER}}.cpel-switcher--layout-dropdown .cpel-switcher__lang a' => 'background-color: {{VALUE}};', ), 'condition' => array( 'layout' => 'dropdown' ), ) ); $this->end_controls_tab(); $this->start_controls_tab( 'tab_menu_item_hover', array( 'label' => __( 'Hover', '__elementor' ) ) // phpcs:ignore WordPress.WP.I18n ); $this->add_group_control( Group_Control_Typography::get_type(), array( 'name' => 'typography_menu_item_hover', 'global' => array( 'default' => Global_Typography::TYPOGRAPHY_PRIMARY ), 'selector' => '{{WRAPPER}} .cpel-switcher__lang a:hover, {{WRAPPER}} .cpel-switcher__lang a:focus', ) ); $this->add_control( 'color_menu_item_hover', array( 'label' => __( 'Text Color', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::COLOR, 'global' => array( 'default' => Global_Colors::COLOR_ACCENT ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__lang a:hover, {{WRAPPER}} .cpel-switcher__lang a:focus' => 'color: {{VALUE}}', ), ) ); $this->add_control( 'bg_dropdown_hover', array( 'label' => __( 'Background Color', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::COLOR, 'default' => '#D9D9D9', 'selectors' => array( '{{WRAPPER}}.cpel-switcher--layout-dropdown .cpel-switcher__lang a:hover, {{WRAPPER}}.cpel-switcher--layout-dropdown .cpel-switcher__lang a:focus' => 'background-color: {{VALUE}};', ), 'condition' => array( 'layout' => 'dropdown' ), ) ); $this->end_controls_tab(); $this->start_controls_tab( 'tab_menu_item_active', array( 'label' => __( 'Active', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'condition' => array( 'hide_current!' => 'yes', 'layout!' => 'dropdown', ), ) ); $this->add_group_control( Group_Control_Typography::get_type(), array( 'name' => 'typography_menu_item_active', 'global' => array( 'default' => Global_Typography::TYPOGRAPHY_PRIMARY ), 'selector' => '{{WRAPPER}} .cpel-switcher__lang.cpel-switcher__lang--active a', ) ); $this->add_control( 'color_menu_item_active', array( 'label' => __( 'Text Color', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::COLOR, 'default' => '', 'selectors' => array( '{{WRAPPER}} .cpel-switcher__lang--active a' => 'color: {{VALUE}}' ), ) ); $this->end_controls_tab(); $this->end_controls_tabs(); $this->add_responsive_control( 'padding_horizontal_menu_item', array( 'label' => __( 'Horizontal Padding', 'connect-polylang-elementor' ), 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'max' => 50 ), ), 'separator' => 'before', 'selectors' => array( '{{WRAPPER}} .cpel-switcher__lang a' => 'padding-left: {{SIZE}}{{UNIT}}; padding-right: {{SIZE}}{{UNIT}}', ), ) ); $this->add_responsive_control( 'padding_vertical_menu_item', array( 'label' => __( 'Vertical Padding', 'connect-polylang-elementor' ), 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'max' => 50 ), ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__lang a' => 'padding-top: {{SIZE}}{{UNIT}}; padding-bottom: {{SIZE}}{{UNIT}}', ), ) ); $this->add_responsive_control( 'menu_space_between', array( 'label' => __( 'Space Between', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'max' => 100 ), ), 'default' => array( 'size' => 15 ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__nav' => '--cpel-switcher-space: {{SIZE}}{{UNIT}};', ), 'condition' => array( 'layout!' => 'dropdown' ), ) ); $this->end_controls_section(); /** * Style: Dropdown */ $this->start_controls_section( 'dropdown_section', array( 'label' => __( 'Dropdown', 'connect-polylang-elementor' ), 'tab' => Controls_Manager::TAB_STYLE, 'condition' => array( 'layout' => 'dropdown' ), ) ); $this->add_control( 'dropdown_on', array( 'label' => __( 'Drop', 'connect-polylang-elementor' ), 'type' => Controls_Manager::SELECT, 'options' => array( 'click' => __( 'On Click', 'connect-polylang-elementor' ), 'hover' => __( 'On Mouse Hover', 'connect-polylang-elementor' ), ), 'default' => 'click', 'prefix_class' => 'cpel-switcher--drop-on-', ) ); $this->add_control( 'dropdown_to', array( 'label' => __( 'Drop Direction', 'connect-polylang-elementor' ), 'type' => Controls_Manager::CHOOSE, 'options' => array( 'down' => array( 'title' => __( 'Down', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'icon' => 'eicon-arrow-down', ), 'up' => array( 'title' => __( 'Up', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'icon' => 'eicon-arrow-up', ), ), 'default' => 'down', 'prefix_class' => 'cpel-switcher--drop-to-', ) ); $this->add_control( 'dropdown_icon', array( 'label' => __( 'Icon', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::ICONS, 'fa4compatibility' => 'icon', 'recommended' => array( 'fa-solid' => array( 'chevron-down', 'angle-down', 'caret-down', 'plus', ), ), 'label_block' => false, 'skin' => 'inline', 'exclude_inline_options' => 'svg', 'default' => array( 'value' => 'fas fa-caret-down', 'library' => 'fa-solid', ), ) ); $this->add_control( 'dropdown_icon_indent', array( 'label' => __( 'Icon Spacing', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'max' => 50 ), ), 'default' => array( 'size' => '10' ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__icon' => 'padding-left: {{SIZE}}{{UNIT}};' ), 'condition' => array( 'dropdown_icon[value]!' => '', ), ) ); $this->end_controls_section(); /** * Style: Language flag */ $this->start_controls_section( 'country_flag_section', array( 'label' => __( 'Flag', 'polylang' ), // phpcs:ignore WordPress.WP.I18n 'tab' => Controls_Manager::TAB_STYLE, 'condition' => array( 'show_country_flag' => 'yes' ), ) ); $this->add_control( 'svg_flag', array( 'label' => __( 'Scalable Image', 'connect-polylang-elementor' ), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => 'yes', ) ); $this->add_control( 'aspect_ratio_flag', array( 'label' => __( 'Aspect Ratio', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SELECT, 'options' => array( '43' => '4:3', '11' => '1:1', ), 'default' => '43', 'prefix_class' => 'cpel-switcher--aspect-ratio-', 'condition' => array( 'svg_flag' => 'yes' ), ) ); $this->add_responsive_control( 'size_flag', array( 'label' => __( 'Size', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'min' => 16 ), ), 'default' => array( 'size' => 20 ), 'selectors' => array( '{{WRAPPER}}.cpel-switcher--aspect-ratio-11 .cpel-switcher__flag' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};', '{{WRAPPER}}.cpel-switcher--aspect-ratio-43 .cpel-switcher__flag' => 'width: {{SIZE}}{{UNIT}}; height: calc({{SIZE}}{{UNIT}} * 0.75);', ), 'condition' => array( 'svg_flag' => 'yes' ), ) ); $this->add_responsive_control( 'border_radius_flag', array( 'label' => __( 'Border Radius', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SLIDER, 'size_units' => array( 'px', '%' ), 'range' => array( '%' => array( 'max' => 50 ), ), 'default' => array( 'size' => 0 ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__flag img' => 'border-radius: {{SIZE}}{{UNIT}}' ), 'condition' => array( 'svg_flag' => 'yes' ), ) ); $this->end_controls_section(); /** * Style: Language name */ $this->start_controls_section( 'language_name_section', array( 'label' => __( 'Language Name', 'connect-polylang-elementor' ), 'tab' => Controls_Manager::TAB_STYLE, 'condition' => array( 'show_language_name' => 'yes' ), ) ); $this->add_responsive_control( 'text_indent_language_name', array( 'label' => __( 'Text Indent', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'max' => 50 ), ), 'default' => array( 'size' => '10' ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__name' => is_rtl() ? 'padding-right: {{SIZE}}{{UNIT}};' : 'padding-left: {{SIZE}}{{UNIT}};', ), ) ); $this->end_controls_section(); /** * Style: Language code */ $this->start_controls_section( 'language_code_section', array( 'label' => __( 'Language Code', 'connect-polylang-elementor' ), 'tab' => Controls_Manager::TAB_STYLE, 'condition' => array( 'show_language_code' => 'yes' ), ) ); $this->add_control( 'uppercase_language_code', array( 'label' => _x( 'Uppercase', 'Typography Control', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => 'yes', ) ); $this->add_responsive_control( 'text_indent_language_code', array( 'label' => __( 'Text Indent', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::SLIDER, 'range' => array( 'px' => array( 'max' => 50 ), ), 'default' => array( 'size' => '10' ), 'selectors' => array( '{{WRAPPER}} .cpel-switcher__code' => is_rtl() ? 'padding-right: {{SIZE}}{{UNIT}};' : 'padding-left: {{SIZE}}{{UNIT}};', ), ) ); $this->add_control( 'before_language_code', array( 'label' => __( 'Before', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::TEXT, ) ); $this->add_control( 'after_language_code', array( 'label' => __( 'After', 'elementor' ), // phpcs:ignore WordPress.WP.I18n 'type' => Controls_Manager::TEXT, ) ); $this->end_controls_section(); } /** * Render the widget output on the frontend. * * Written in PHP and used to generate the final HTML. * * @since 2.0.0 * * @access protected * * @uses pll_the_languages() Holds Polylang languages for switcher. * @uses pll_current_language() Get the current language. * @return void */ protected function render() { // Get the widget settings. $settings = $this->get_active_settings(); // Add render attributes for Elementor. $this->add_render_attribute( array( 'nav' => array( 'class' => 'cpel-switcher__nav', ), 'icon' => array( 'class' => array( 'cpel-switcher__icon', empty( $settings['dropdown_icon']['value'] ) ? '' : $settings['dropdown_icon']['value'], ), 'aria-hidden' => 'true', ), ) ); // Get the available languages for switcher. $languages = pll_the_languages( array( 'raw' => 1 ) ); $lang_curr = strtolower( pll_current_language() ); // Max number of items in language dropdown if ( 'dropdown' === $settings['layout'] ) { $this->add_render_attribute( '_wrapper', 'style', '--langs:' . ( absint( count( $languages ) - 1 ) ) ); } if ( ! empty( $languages ) ) { $lang_links = array(); foreach ( $languages as $lang_code => $language ) { // Hide the current language. if ( 'yes' === $settings['hide_current'] && $language['current_lang'] ) { continue; } // Hide language without translation. if ( 'yes' === $settings['hide_missing'] && $language['no_translation'] ) { continue; } // Language code. $language_code = sprintf( '%s%s%s', $settings['before_language_code'] ? $settings['before_language_code'] : '', 'yes' === $settings['uppercase_language_code'] ? strtoupper( $language['slug'] ) : strtolower( $language['slug'] ), $settings['after_language_code'] ? $settings['after_language_code'] : '' ); // Language flag. $language_flag = ''; if ( $settings['show_country_flag'] ) { $flag_code = cpel_flag_code( $language['flag'] ); $flag_svg = $flag_code ? cpel_flag_svg( $flag_code ) : false; if ( 'yes' === $settings['svg_flag'] && $flag_svg ) { // If data uri encoded flags are preferred. if ( ! defined( 'PLL_ENCODED_FLAGS' ) || PLL_ENCODED_FLAGS ) { $file_contents = file_get_contents( CPEL_DIR . $flag_svg['path'] ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents $flag_svg['src'] = 'data:image/svg+xml;base64,' . base64_encode( $file_contents ); } else { $flag_svg['src'] = $flag_svg['url']; } $language_flag = \PLL_Language::get_flag_html( $flag_svg, '', $language['name'] ); } elseif ( $flag_code ) { $flag_information = method_exists( '\PLL_Language', 'get_flag_information' ) ? \PLL_Language::get_flag_information( $flag_code ) : \PLL_Language::get_flag_informations( $flag_code ); $language_flag = \PLL_Language::get_flag_html( $flag_information, '', $language['name'] ); } else { $language_flag = '' . esc_attr( $language['name'] ) . ''; } if ( $flag_code ) { $language_flag = '' . $language_flag . ''; } else { $language_flag = '' . $language_flag . ''; } } // Language link. $lang_links[ strtolower( $lang_code ) ] = sprintf( '%3$s%4$s%5$s', esc_attr( $language['locale'] ), esc_url( $language['url'] ), $language_flag, $settings['show_language_name'] ? '' . esc_html( $language['name'] ) . '' : '', $settings['show_language_code'] ? '' . esc_html( $language_code ) . '' : '' ); } $output = ''; echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } }