*/ function aksrt_get_available_languages(): array { $languages = []; // Polylang if (function_exists('pll_the_languages')) { $pll_langs = pll_the_languages(['raw' => 1]); if (is_array($pll_langs)) { foreach ($pll_langs as $lang) { $languages[] = [ 'code' => $lang['slug'] ?? '', 'name' => $lang['name'] ?? '', 'url' => $lang['url'] ?? '#', 'flag' => $lang['flag'] ?? '', 'active' => !empty($lang['current_lang']), ]; } } return $languages; } // WPML if (defined('ICL_LANGUAGE_CODE') && function_exists('icl_get_languages')) { $wpml_langs = icl_get_languages('skip_missing=0'); if (is_array($wpml_langs)) { foreach ($wpml_langs as $lang) { $languages[] = [ 'code' => $lang['language_code'] ?? '', 'name' => $lang['native_name'] ?? '', 'url' => $lang['url'] ?? '#', 'flag' => $lang['country_flag_url'] ?? '', 'active' => !empty($lang['active']), ]; } } return $languages; } // WordPress 内置:通过 filter 提供语言列表 $filtered = apply_filters('aksrt_available_languages', []); if (is_array($filtered) && !empty($filtered)) { return $filtered; } return []; } /** * 检查是否有多语言插件可用 */ function aksrt_has_multilingual(): bool { if (function_exists('pll_the_languages')) return true; if (defined('ICL_LANGUAGE_CODE')) return true; if (!empty(apply_filters('aksrt_available_languages', []))) return true; return false; } /** * 获取当前语言代码 */ function aksrt_get_current_language(): string { if (function_exists('pll_current_language')) { return pll_current_language('slug'); } if (defined('ICL_LANGUAGE_CODE')) { return ICL_LANGUAGE_CODE; } return get_locale(); } /** * 渲染语言切换器 HTML * * @param string $style dropdown | inline | flags * @return string */ function aksrt_render_language_switcher(string $style = 'dropdown'): string { $languages = aksrt_get_available_languages(); if (count($languages) < 2) return ''; $current = aksrt_get_current_language(); if ($style === 'flags') { $html = '
'; foreach ($languages as $lang) { $active_class = $lang['active'] ? ' is-active' : ''; $html .= ''; if ($lang['flag']) { $html .= '' . esc_attr($lang['code']) . ''; } else { $html .= '' . esc_html(strtoupper($lang['code'])) . ''; } $html .= ''; } $html .= '
'; return $html; } // dropdown style $html = '
'; $html .= ''; $html .= ''; $html .= '
'; return $html; } /** * Header language dropdown (zibll zib_get_translate_language_btn). * Uses SPA i18n_available_langs when i18n enabled and position includes header. * * @param string $class Extra classes. */ function aksrt_get_translate_language_btn(string $class = ''): string { if (!class_exists('\AKSRT\Settings\Settings')) { return ''; } $cfg = \AKSRT\Settings\Settings::get_i18n_config(); if (empty($cfg['enabled'])) { return ''; } $pos = (string) ($cfg['switcherPosition'] ?? 'footer'); if (!in_array($pos, ['header', 'both'], true)) { return ''; } $raw = (string) ($cfg['availableLangs'] ?? ''); $buttons = []; foreach (preg_split('/ | | /', $raw) as $line) { $line = trim($line); if ($line === '' || strpos($line, '|') === false) { continue; } [$code, $label] = array_map('trim', explode('|', $line, 2)); if ($code === '' || $label === '') { continue; } $buttons[] = ['language' => $code, 'text' => $label]; } if (!$buttons) { return ''; } $buttons_html = ''; foreach ($buttons as $button) { $buttons_html .= '
  • ' . esc_html($button['text']) . '
  • '; } $is_mobile = wp_is_mobile(); $dropdown = ''; $hover = !$is_mobile ? ' hover-show' : ''; $toggle = !$is_mobile ? '' : ' data-toggle="dropdown"'; return ''; }