fix: if-else fallback

This commit is contained in:
hanyixuanten
2026-07-27 20:00:28 +08:00
parent b34aae160a
commit 1c01c2e318
8 changed files with 95 additions and 17 deletions
+1 -1
View File
@@ -43,7 +43,7 @@ Category and tag names are translated when they are created, edited, or included
## Routing
The **Subdirectory** mode resolves configured language paths such as `/en/example-post/`. The **Domain binding** mode maps a request host to a language using one `domain=language` entry per line in Settings. Both modes can be enabled together: a language with a domain binding uses that domain, while an unbound target language uses its subdirectory. This keeps one URL strategy per language and avoids duplicate URLs. When only subdirectory mode is enabled, the domain-binding field is hidden.
The **Subdirectory** mode resolves configured language paths such as `/en/example-post/`. The **Domain binding** mode maps a request host to a language using one `domain=language` entry per line in Settings. Both modes can be enabled together. Links keep the active request mode: pages opened through a language subdirectory continue linking within that subdirectory, while pages opened through a bound domain continue linking within that domain. When only subdirectory mode is enabled, the domain-binding field is hidden.
Post, page, term, and home links are generated for the active language. For example, a theme's "back to home" link that uses `home_url()` resolves to the bound language domain or language subdirectory.
+1 -1
View File
@@ -42,7 +42,7 @@ Btranslate 是一个 WordPress 插件骨架,使用百度翻译 API 持久化
## 路由
**子目录** 模式会解析配置语言对应的路径,例如 `/en/example-post/`。**子域名** 模式通过主机名映射语言:在设置中每行填写一条 `domain=language`。两种模式可以同时启用:已绑定域名的语言使用该域名,未绑定域名的目标语言使用子目录,从而确保每种语言只有一种 URL 策略并避免重复内容。只启用子目录模式时,域名绑定字段不会显示。
**子目录** 模式会解析配置语言对应的路径,例如 `/en/example-post/`。**子域名** 模式通过主机名映射语言:在设置中每行填写一条 `domain=language`。两种模式可以同时启用,链接会保持当前请求的入口模式:从语言子目录打开的页面继续生成子目录链接,从绑定域名打开的页面继续生成该域名下的链接。只启用子目录模式时,域名绑定字段不会显示。
文章、页面、术语和首页链接会按当前语言生成。例如,主题中使用 `home_url()` 的“返回首页”链接会解析为已绑定语言的域名或语言子目录。
+3 -2
View File
@@ -29,19 +29,20 @@ class BTRANSLATE_Admin {
$settings = (array) $settings;
$bindings = array();
$routing_modes = BTRANSLATE_Settings::routing_modes( $settings['routing_mode'] ?? array() );
$target_languages = array_values( array_filter( array_map( 'sanitize_key', explode( ',', (string) ( $settings['target_languages'] ?? 'en' ) ) ) ) );
foreach ( preg_split( '/\r\n|\r|\n/', (string) ( $settings['domain_bindings'] ?? '' ) ) as $line ) {
$parts = array_map( 'trim', explode( '=', $line, 2 ) );
$domain = 2 === count( $parts ) ? BTRANSLATE_Settings::normalize_domain( $parts[0] ) : '';
$language = 2 === count( $parts ) ? sanitize_key( $parts[1] ) : '';
if ( '' !== $domain && '' !== $language ) {
if ( '' !== $domain && in_array( $language, $target_languages, true ) && ! in_array( $language, $bindings, true ) ) {
$bindings[ $domain ] = $language;
}
}
return array(
'source_language' => sanitize_key( $settings['source_language'] ?? 'zh' ),
'target_languages' => array_values( array_filter( array_map( 'sanitize_key', explode( ',', (string) ( $settings['target_languages'] ?? 'en' ) ) ) ) ),
'target_languages' => $target_languages,
'routing_mode' => $routing_modes,
'domain_bindings' => $bindings,
'fallback_language' => sanitize_key( $settings['fallback_language'] ?? 'zh' ),
+80 -3
View File
@@ -39,6 +39,12 @@ class BTRANSLATE_Language_Router {
$bindings = (array) $settings['domain_bindings'];
if ( BTRANSLATE_Settings::is_routing_mode_enabled( 'domain' ) && '' !== $host && isset( $bindings[ $host ] ) && BTRANSLATE_Settings::is_supported_language( $bindings[ $host ] ) ) {
if ( ! empty( $wp->query_vars['btranslate_language'] ) ) {
$wp->query_vars = array( 'error' => '404' );
return;
}
$wp->query_vars['btranslate_language'] = sanitize_key( $bindings[ $host ] );
}
}
@@ -62,13 +68,13 @@ class BTRANSLATE_Language_Router {
return $url;
}
if ( BTRANSLATE_Settings::is_routing_mode_enabled( 'domain' ) ) {
if ( BTRANSLATE_Settings::is_routing_mode_enabled( 'domain' ) && $this->request_uses_domain( $language ) ) {
$domain = array_search( $language, (array) $settings['domain_bindings'], true );
$parts = wp_parse_url( $url );
if ( false !== $domain && is_array( $parts ) && ! empty( $parts['host'] ) ) {
$scheme = isset( $parts['scheme'] ) ? $parts['scheme'] : 'https';
$path = isset( $parts['path'] ) ? $parts['path'] : '/';
$path = $this->source_path( isset( $parts['path'] ) ? $parts['path'] : '/' );
$query = isset( $parts['query'] ) ? '?' . $parts['query'] : '';
$fragment = isset( $parts['fragment'] ) ? '#' . $parts['fragment'] : '';
@@ -84,11 +90,12 @@ class BTRANSLATE_Language_Router {
if ( ! is_array( $parts ) || empty( $parts['path'] ) ) {
return $url;
}
$parts = $this->source_origin_parts( $parts );
$scheme = isset( $parts['scheme'] ) ? $parts['scheme'] . '://' : '//';
$host = isset( $parts['host'] ) ? $parts['host'] : '';
$port = isset( $parts['port'] ) ? ':' . $parts['port'] : '';
$path = '/' . $language . '/' . ltrim( $parts['path'], '/' );
$path = $this->localized_path( $parts['path'], $language );
$query = isset( $parts['query'] ) ? '?' . $parts['query'] : '';
$fragment = isset( $parts['fragment'] ) ? '#' . $parts['fragment'] : '';
@@ -98,4 +105,74 @@ class BTRANSLATE_Language_Router {
public function localize_home_url( $url, $path, $scheme, $blog_id ) {
return $this->localized_url( $url );
}
private function request_uses_domain( $language ) {
$host = isset( $_SERVER['HTTP_HOST'] ) ? BTRANSLATE_Settings::normalize_domain( wp_unslash( $_SERVER['HTTP_HOST'] ) ) : '';
$bindings = (array) BTRANSLATE_Settings::get()['domain_bindings'];
return '' !== $host && isset( $bindings[ $host ] ) && sanitize_key( $bindings[ $host ] ) === $language;
}
private function source_origin_parts( $parts ) {
$host = isset( $_SERVER['HTTP_HOST'] ) ? BTRANSLATE_Settings::normalize_domain( wp_unslash( $_SERVER['HTTP_HOST'] ) ) : '';
$bindings = (array) BTRANSLATE_Settings::get()['domain_bindings'];
if ( '' === $host || ! isset( $bindings[ $host ] ) ) {
return $parts;
}
$home_parts = wp_parse_url( (string) get_option( 'home', '' ) );
if ( ! is_array( $home_parts ) || empty( $home_parts['host'] ) ) {
return $parts;
}
$parts['scheme'] = isset( $home_parts['scheme'] ) ? $home_parts['scheme'] : 'https';
$parts['host'] = $home_parts['host'];
if ( isset( $home_parts['port'] ) ) {
$parts['port'] = $home_parts['port'];
} else {
unset( $parts['port'] );
}
return $parts;
}
private function localized_path( $path, $language ) {
$home_path = $this->home_path();
$relative = $this->relative_path( $path );
$languages = array_map( 'preg_quote', BTRANSLATE_Settings::target_languages() );
if ( ! empty( $languages ) ) {
$relative = preg_replace( '#^(?:' . implode( '|', $languages ) . ')(?=/|$)#', $language, $relative, 1 );
}
if ( $language !== strtok( $relative, '/' ) ) {
$relative = $language . '/' . $relative;
}
return '/' . ( '' !== $home_path ? trim( $home_path, '/' ) . '/' : '' ) . ltrim( $relative, '/' );
}
private function source_path( $path ) {
$home_path = $this->home_path();
$relative = $this->relative_path( $path );
$languages = array_map( 'preg_quote', BTRANSLATE_Settings::target_languages() );
if ( ! empty( $languages ) ) {
$relative = preg_replace( '#^(?:' . implode( '|', $languages ) . ')(?=/|$)/?#', '', $relative, 1 );
}
return '/' . ( '' !== $home_path ? trim( $home_path, '/' ) . '/' : '' ) . ltrim( $relative, '/' );
}
private function relative_path( $path ) {
return ltrim( (string) preg_replace( '#^' . preg_quote( $this->home_path(), '#' ) . '(?=/|$)#', '', $path, 1 ), '/' );
}
private function home_path() {
$home_path = wp_parse_url( (string) get_option( 'home', '' ), PHP_URL_PATH );
return is_string( $home_path ) ? untrailingslashit( $home_path ) : '';
}
}
+6 -2
View File
@@ -58,12 +58,16 @@ class BTRANSLATE_Plugin {
$this->router->register();
$this->sitemap_controller->register();
$this->content_controller->register();
if ( get_option( 'btranslate_flush_rewrite_rules', false ) ) {
delete_option( 'btranslate_flush_rewrite_rules' );
flush_rewrite_rules();
}
}
public function refresh_rewrite_rules( $old_value, $new_value ) {
if ( (array) $old_value !== (array) $new_value ) {
$this->router->register_rewrite_rules();
flush_rewrite_rules();
update_option( 'btranslate_flush_rewrite_rules', 1, false );
}
}
}
+1 -7
View File
@@ -40,13 +40,7 @@ class BTRANSLATE_Settings {
}
public static function subdirectory_languages() {
$languages = self::target_languages();
if ( self::is_routing_mode_enabled( 'domain' ) ) {
$languages = array_diff( $languages, array_values( (array) self::get()['domain_bindings'] ) );
}
return array_values( $languages );
return self::target_languages();
}
public static function is_supported_language( $language ) {
@@ -111,8 +111,9 @@ class BTRANSLATE_Sitemap_Controller {
}
$port = isset( $parts['port'] ) ? ':' . $parts['port'] : '';
$path = isset( $parts['path'] ) ? '/' . trim( $parts['path'], '/' ) : '';
return $parts['scheme'] . '://' . $parts['host'] . $port . '/sitemap.xml';
return $parts['scheme'] . '://' . $parts['host'] . $port . $path . '/sitemap.xml';
}
private function rewrite_sitemap( $xml, $source_url ) {
@@ -5,6 +5,7 @@ defined( 'ABSPATH' ) || exit;
class BTRANSLATE_Uninstaller {
private const OPTION_NAMES = array(
'btranslate_settings',
'btranslate_flush_rewrite_rules',
'btranslate_translation_task',
'btranslate_retranslation_batch',
);