<?php

/*
 * a fully static class to manage strings translations on admin side
 *
 * @since 1.6
 */
class PLL_Admin_Strings {
	static protected $strings = array(); // strings to translate
	static protected $default_strings; // default strings to register

	/*
	 * init: add filters
	 *
	 * @since 1.6
	 */
	static public function init() {
		// default strings translations sanitization
		add_filter('pll_sanitize_string_translation', array(__CLASS__, 'sanitize_string_translation'), 10, 2);
	}

	/*
	 * 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 wether the string table should display a multiline textarea or a single line input, defaults to single line
	 */
	static public function register_string($name, $string, $context = 'polylang', $multiline = false) {
		// backward compatibility with Polylang older than 1.1
		if (is_bool($context)) {
			$multiline = $context;
			$context = 'polylang';
		}

		$to_register = compact('name', 'string', 'context', 'multiline');
		if (!in_array($to_register, self::$strings) && $to_register['string'])
			self::$strings[] = $to_register;
	}

	/*
	 * get registered strings
	 *
	 * @since 0.6.1
	 *
	 * @return array list of all registered strings
	 */
	static public function &get_strings() {
		self::$default_strings = array(
			'options' => array(
				'blogname'        => __('Site Title'),
				'blogdescription' => __('Tagline'),
				'date_format'     => __('Date Format'),
				'time_format'     => __('Time Format'),
			),
			'widget_title' => __('Widget title', 'polylang'),
			'widget_text'  => __('Widget text', 'polylang'),
		);

		// WP strings
		foreach (self::$default_strings['options'] as $option => $string)
			self::register_string($string, get_option($option), 'WordPress');

		// widgets titles
		global $wp_registered_widgets;
		$sidebars = wp_get_sidebars_widgets();
		foreach ($sidebars as $sidebar => $widgets) {
			if ($sidebar == 'wp_inactive_widgets' || 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]) || !is_object($wp_registered_widgets[$widget]['callback'][0]) || !method_exists($wp_registered_widgets[$widget]['callback'][0], 'get_settings'))
					continue;

				$widget_settings = $wp_registered_widgets[$widget]['callback'][0]->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'])) {
					if (isset($widget_settings[$number]['title']) && $title = $widget_settings[$number]['title'])
						self::register_string(self::$default_strings['widget_title'], $title, 'Widget');

					if (isset($widget_settings[$number]['text']) && $text = $widget_settings[$number]['text'])
						self::register_string(self::$default_strings['widget_text'], $text, 'Widget', true);
				}
			}
		}

		// allow plugins to modify our list of strings, mainly for use by our PLL_WPML_Compat class
		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, translation to sanitize
	 * @param string $name unique name for the string
	 * @return string
	 */
	static public function sanitize_string_translation($translation, $name) {
		$translation = wp_unslash(trim($translation));

		if (false !== ($option = array_search($name, self::$default_strings['options'], true)))
			$translation = sanitize_option($option, $translation);

		if ($name == self::$default_strings['widget_title'])
			$translation = strip_tags($translation);

		if ($name == self::$default_strings['widget_text'] && !current_user_can('unfiltered_html'))
			$translation = wp_unslash( wp_filter_post_kses( addslashes($translation) ) ); // wp_filter_post_kses() expects slashed

		return $translation;
	}
}
