As the sun rises and the forest mist clears, and the clouds return and the caves darken, these changes of light and shadow are the morning and evening in the mountains. Wildflowers bloom with their subtle fragrance, fine trees flourish with their dense shade, the wind and frost are pure and clean, and the water recedes to reveal the rocks—these are the four seasons in the mountains. Going out in the morning and returning in the evening, the scenery of the four seasons is different, and the joy is endless.至于负者歌于途,行者休于树,前者呼,后者应,伛偻提携,往来而不绝者,滁人游也。临溪而渔,溪深而鱼肥,酿泉为酒,泉香而酒洌,山肴野蔌,杂然而前陈者,太守宴也。宴酣之乐,非丝非竹,射者中,弈者胜,觥筹交错,起坐而喧哗者,众宾欢也。苍颜白发,颓然乎其间者,太守醉也。
<?php
/**
* @package Polylang
*/
/**
* A fully static class to manage strings translations on admin side
*
* @since 1.6
*/
class PLL_Admin_Strings {
/**
* Stores the strings to translate.
*
* @var array {
* @type string $name A unique name for the string.
* @type string $string The actual string to translate.
* @type string $context The group in which the string is registered.
* @type bool $multiline Whether the string table should display a multiline textarea or a single line input.
* }
*/
protected static $strings = array();
/**
* The strings to register by default.
*
* @var string[]|null
*/
protected static $default_strings;
/**
* Add filters
*
* @since 1.6
*
* @return void
*/
public static function init() {
// default strings translations sanitization
add_filter( 'pll_sanitize_string_translation', array( self::class, 'sanitize_string_translation' ), 10, 5 );
}
/**
* Register strings for translation making sure it is not duplicate or empty
*
* @since 0.6
*
* @param string $name A unique name for the string
* @param string $string The string to register
* @param string $context Optional, the group in which the string is registered, defaults to 'polylang'
* @param bool $multiline Optional, whether the string table should display a multiline textarea or a single line input, defaults to single line
* @return void
*/
public static function register_string( $name, $string, $context = 'Polylang', $multiline = false ) {
if ( $string && is_scalar( $string ) ) {
self::$strings[ md5( $string ) ] = compact( 'name', 'string', 'context', 'multiline' );
}
}
/**
* Get registered strings
*
* @since 0.6.1
*
* @return array list of all registered strings
*/
public static function &get_strings() {
self::$default_strings = array(
'widget_title' => __( 'Widget title', 'polylang' ),
'widget_text' => __( 'Widget text', 'polylang' ),
);
global $wp_registered_widgets;
$sidebars = wp_get_sidebars_widgets();
foreach ( $sidebars as $sidebar => $widgets ) {
if ( 'wp_inactive_widgets' == $sidebar || empty( $widgets ) ) {
continue;
}
foreach ( $widgets as $widget ) {
// Nothing can be done if the widget is created using pre WP2.8 API. There is no object, so we can't access it to get the widget options.
if ( ! isset( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! $wp_registered_widgets[ $widget ]['callback'][0] instanceof WP_Widget ) {
continue;
}
$widget_instance = $wp_registered_widgets[ $widget ]['callback'][0];
$widget_settings = $widget_instance->get_settings();
$number = $wp_registered_widgets[ $widget ]['params'][0]['number'];
// Don't enable widget translation if the widget is visible in only one language or if there is no title.
if ( ! empty( $widget_settings[ $number ]['pll_lang'] ) ) {
continue;
}
// Widget title.
if ( ! empty( $widget_settings[ $number ]['title'] ) ) {
self::register_string( self::$default_strings['widget_title'], $widget_settings[ $number ]['title'], 'Widget' );
}
// Text of the Widget text.
if ( ! empty( $widget_settings[ $number ]['text'] ) ) {
self::register_string( self::$default_strings['widget_text'], $widget_settings[ $number ]['text'], 'Widget', true );
}
// Content of the widget custom html.
if ( $widget_instance instanceof WP_Widget_Custom_HTML && ! empty( $widget_settings[ $number ]['content'] ) ) {
self::register_string( self::$default_strings['widget_text'], $widget_settings[ $number ]['content'], 'Widget', true );
}
}
}
/**
* Filter the list of strings registered for translation
* Mainly for use by our PLL_WPML_Compat class
*
* @since 1.0.2
*
* @param array $strings list of strings
*/
self::$strings = apply_filters( 'pll_get_strings', self::$strings );
return self::$strings;
}
/**
* Performs the sanitization ( before saving in DB ) of default strings translations
*
* @since 1.6
*
* @param string $translation The string translation.
* @param string $name The name as defined in pll_register_string. Unused.
* @param string $context The context as defined in pll_register_string. Unused.
* @param string $original The original string to translate. Unused.
* @param string $previous The previous string translation.
* @return string
*/
public static function sanitize_string_translation( $translation, $name, $context, $original, $previous ) {
if ( trim( $previous ) === trim( $translation ) ) {
// Don't overwrite the translation to prevent breaking the string.
return $translation;
}
if ( $name === self::$default_strings['widget_title'] ) {
return sanitize_text_field( $translation );
}
if ( ! current_user_can( 'unfiltered_html' ) ) {
$translation = wp_kses_post( $translation );
}
return $translation;
}
}