Title: [Plugin: Polylang] pll_register_string problem
Last modified: August 20, 2016

---

# [Plugin: Polylang] pll_register_string problem

 *  Resolved [jussi.r](https://wordpress.org/support/users/jussir-1/)
 * (@jussir-1)
 * [13 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/)
 * Hey,
 * I’m using polylang 0.9.3 and I’ve made a simple plugin for a widget to make a
   list my posts of different post types (I use Types plugin too). You can set a
   title and a description text for the widget, but of course only widget’s title
   is visible at “Strings translation” tab of Polylang settings.
 * So I’m trying to use pll_register_string function. I use it at the “update” function
   what is called when you save the widget’s settings. The problem is that the string
   doesn’t come visible to the “Strings translation” list and I don’t know why.
 * Here is my plugin code (sorry, there is a lot of code you don’t need to see):
 *     ```
       <?php
       /*
       Plugin Name: Post list
       Plugin URI:
       Description: Widget to list posts with specified post type
       Author: nnn
       Version: 1000
       Author URI:
       */
   
       class post_list extends WP_Widget
       {
         function post_list()
         {
           $widget_ops = array('classname' => 'post_list', 'description' => 'Post types: press-releases, media-tours, media-event' );
           $this->WP_Widget('post_list', 'Post list', $widget_ops);
         }
   
         function form($instance)
         {
           $instance = wp_parse_args( (array) $instance, array( 'title' => '','max_posts'=>2,'post_type'=>'post', "text"=>'' ) );
           $title = $instance['title'];
       	$max_posts = $instance['max_posts'];
       	$post_type = $instance['post_type'];
       	$text = $instance['text'];
   
       ?>
         <p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" /></label>
         <p><label for="<?php echo $this->get_field_id('text'); ?>">Text: <input class="widefat" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>" type="text" value="<?php echo attribute_escape($text); ?>" /></label>
         <p><label for="<?php echo $this->get_field_id('max_posts'); ?>">Max. posts: <input class="widefat" id="<?php echo $this->get_field_id('max_posts'); ?>" name="<?php echo $this->get_field_name('max_posts'); ?>" type="text" value="<?php echo attribute_escape($max_posts); ?>" /></label></p>
         <p><label for="<?php echo $this->get_field_id('post_type'); ?>">Post type: <input class="widefat" id="<?php echo $this->get_field_id('post_type'); ?>" name="<?php echo $this->get_field_name('post_type'); ?>" type="text" value="<?php echo attribute_escape($post_type); ?>" /></label></p>
       <?php
         }
   
         function makeEventDate($start,$end){
   
       	$start = strtotime($start,true);
       	$end = strtotime($end,true);
   
       	$startMonthYear = strtotime(date("Y-m",$start) . "-01",true);
       	$endMonthYear = strtotime(date("Y-m",$end) . "-01",true);
   
       	$startYear=date("Y",$start);
       	$endYear=date("Y",$end);
   
       	if($startYear<$endYear){
       		$startDate = date_i18n("F d, Y",$start);
       	}else{
       		$startDate = date_i18n("F d",$start);
       	}
   
       	if($endMonthYear>$startMonthYear){
       		$endDate = date_i18n("F d",$end);
       	}else{
       		$endDate = date("d",$end);
       	}
   
       	return $startDate . " - " . $endDate . ", " . $endYear;
   
       }
   
        function dateFormat($postID, $type){
       	$date="";
   
       	if($type == "media-tours"){
       		$date = $this->makeEventDate(get_post_meta($postID, 'start_date', true),get_post_meta($postID, 'end_date', true));
       	}else{
       		$date = get_post_meta($postID, 'date', true);
       		$date = strtotime($date,true);
       		$date = date_i18n("F d, Y",$date);
       	}
   
       	return $date;
       }
   
        function urlGet($postID, $type){
       	$URL="";
   
       	if($type=="media-follow-up"){
       		$URL=get_post_meta($postID, 'url', true);
       	}else{
       		$URL=get_permalink($postID);
       	}
   
       	return $URL;
        }
   
         function update($new_instance, $old_instance)
         {
           $instance = $old_instance;
           $instance['title'] = $new_instance['title'];
           $instance['max_posts'] = $new_instance['max_posts'];
           $instance['post_type'] = $new_instance['post_type'];
           $instance['text'] = $new_instance['text'];
   
           pll_register_string("Post list text",$instance['text'] );
   
           return $instance;
         }
   
         function widget($args, $instance)
         {
           extract($args, EXTR_SKIP);
   
           echo $before_widget;
   
           $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);
       	$max_posts = $instance['max_posts'];
       	$post_type = $instance['post_type'];
       	$text = $instance['text'];
   
       	echo '<div class="post_list ' . $post_type . '">'
       	. '<div class="' . $post_type . '_icon icon"></div>'
       	. '<div class="description">'
       	. $before_title . $title . $after_title
       	. '<i>'
       	. pll__($text)
       	. '</i></div><div class="posts">';
   
       	$args = array( 'post_type' => $post_type, 'numberposts'=>$max_posts );
       	$recent_posts = wp_get_recent_posts( $args );
       	foreach( $recent_posts as $recent ){
       	$post = get_post( $recent["ID"] );
   
       	echo '<span class="date">' .  $this->dateFormat($recent["ID"],$post_type) . "</span><br>"
       		. '<a href="' . $this->urlGet($recent["ID"],$post_type) . '">' .   $recent["post_title"].'</a><br>';
   
       	}
   
       	echo "</div></div>";
           echo $after_widget;
         }
   
       }
       add_action( 'widgets_init', create_function('', 'return register_widget("post_list");') );?>
       ```
   
 * I understand the string should come visible to “Strings translation” tab when
   I save plugins settings.
 * [http://wordpress.org/extend/plugins/polylang/](http://wordpress.org/extend/plugins/polylang/)

Viewing 10 replies - 1 through 10 (of 10 total)

 *  Thread Starter [jussi.r](https://wordpress.org/support/users/jussir-1/)
 * (@jussir-1)
 * [13 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106490)
 * So I’m trying to make it possible to translate that $text too.
 *  Plugin Author [Chouby](https://wordpress.org/support/users/chouby/)
 * (@chouby)
 * [13 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106511)
 * In fact, the function pll_register_string has some effect only on the strings
   translation page and your update function is not called on this page (it should
   be called only when you update the widget settings)
 * I would try to add something like this to your constructor (which is called on
   all pages):
 *     ```
       global $polylang;
       if (isset($polylang)) {
         $settings = $this->get_settings();
         pll_register_string("Post list text", $settings['text']);
       }
       ```
   
 *  Thread Starter [jussi.r](https://wordpress.org/support/users/jussir-1/)
 * (@jussir-1)
 * [13 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106518)
 * I thought it saves the string to a database or something.
 * I have three of those widgets and every one of them has different setting for
   $text. Hmmm.. How does the widget title go to “Strings translation”?
 *  Thread Starter [jussi.r](https://wordpress.org/support/users/jussir-1/)
 * (@jussir-1)
 * [13 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106524)
 * Could this be used for this purpose somehow?
    [http://adambrown.info/p/wp_hooks/hook/widget_text](http://adambrown.info/p/wp_hooks/hook/widget_text)
 * EDIT: I solved my problem by adding these lines to polylang admin.php
 *     ```
       if (isset($widget_settings[$number]['text']) && $title = $widget_settings[$number]['text'])
       					$this->register_string(__('Widget text', 'polylang'), $title);
       ```
   
 *  [v4ssi](https://wordpress.org/support/users/v4ssi/)
 * (@v4ssi)
 * [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106620)
 * Sorry for necroposting.
    How is possible get the last solution without change
   the admin.php ? I tried to understand how do it with hooks/override on functions.
   php but i’m not getting any point.
 *  Plugin Author [Chouby](https://wordpress.org/support/users/chouby/)
 * (@chouby)
 * [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106621)
 * Could you better explain what you want to achieve?
 *  [v4ssi](https://wordpress.org/support/users/v4ssi/)
 * (@v4ssi)
 * [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106622)
 * Hello Chouby, thank you for you attention.
 * I need to have the possibility to modify the “widget-text content” from strings-
   translations of your awesome plugin.
    And the code that jussi.r wrote it’s good
   but force me to change the function directly into the plugin files, that i don’t
   want do.
 * I tried to achieve this result using hooks/override but today i’m really stunned
   and i don’t arrive to my objective.
 * And i don’t want use forking/svn too.
 * Thank you.
 * p.s.
    Sry for my english.
 *  Plugin Author [Chouby](https://wordpress.org/support/users/chouby/)
 * (@chouby)
 * [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106623)
 * The best in my opinion is to use the possibility to have a widget displayed for
   only one language (Polylang adds this option in most widgets including the text
   widget).
 * Otherwise you can add use this code in a custom plugin or in functions.php
 *     ```
       add_filters('pll_get_strings', 'add_widget_text');
   
       function add_widget_text($strings) {
       	global $wp_registered_widgets;
       	$sidebars = wp_get_sidebars_widgets();
       	foreach ($sidebars as $sidebar => $widgets) {
       		if ($sidebar == 'wp_inactive_widgets' || !isset($widgets))
       			continue;
   
       		foreach ($widgets as $widget) {
       			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'];
   
       			if (isset($widget_settings[$number]['text']) && $text = $widget_settings[$number]['text'])
       				$strings[] = array('widget text', $text, 'Widget', true);
       		}
       	}
       	return $strings;
       }
       ```
   
 * That’s not tested
 *  [v4ssi](https://wordpress.org/support/users/v4ssi/)
 * (@v4ssi)
 * [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106624)
 * I was not far when i tried alone but not enough near. 😀
    I tried to debug the
   code for 3 hours, like a dumb, because the server gave to me “internal server
   error 500 “. Also if loggin was active, wordpress and server too weren’t new 
   log.
 * Anyway i found the problem and fixed it. Thanks you so much Chouby. ^^
 *     ```
       add_filter('pll_get_strings', 'add_widget_text');
       function add_widget_text($strings) {
       	global $wp_registered_widgets;
       	$sidebars = wp_get_sidebars_widgets();
   
       	foreach ($sidebars as $sidebar => $widgets) {
       		if ($sidebar == 'wp_inactive_widgets' || !isset($widgets))
       			continue;
   
       		foreach ($widgets as $widget) {
       			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'];
   
       			if (isset($widget_settings[$number]['text']) && $text = $widget_settings[$number]['text'])
       				$strings[] = array('name' => 'Widget text', 'string' => $text, 'context' => 'Widget', 'multiline' => true);
       		}
       	}
       	return $strings;
       }
       ```
   
 * add_filter instead of add_filters
    And i added the names to the array keys.
 * They are added at the end of the pages but whocares. ^^
 * Update:
    If i edit the text the query works but in the frontend the widget remain
   with the “default” language. I think that the problem is the widget option “The
   widget is displayed for: All languages” that if turned ON override the visualization
   of the translation and if it’s turned OFF hide the widget for the other language.
 *  [v4ssi](https://wordpress.org/support/users/v4ssi/)
 * (@v4ssi)
 * [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106625)
 * I’ve found the solution of the second problem.
    Just add in functions.php this
   line:
 * `add_filter('widget_text', 'pll__', 1);`
 * That i’ve taken from core.php line 117.
 * Thank you again Chouby.

Viewing 10 replies - 1 through 10 (of 10 total)

The topic ‘[Plugin: Polylang] pll_register_string problem’ is closed to new replies.

 * ![](https://ps.w.org/polylang/assets/icon-256x256.png?rev=3433336)
 * [Polylang](https://wordpress.org/plugins/polylang/)
 * [Frequently Asked Questions](https://wordpress.org/plugins/polylang/#faq)
 * [Support Threads](https://wordpress.org/support/plugin/polylang/)
 * [Active Topics](https://wordpress.org/support/plugin/polylang/active/)
 * [Unresolved Topics](https://wordpress.org/support/plugin/polylang/unresolved/)
 * [Reviews](https://wordpress.org/support/plugin/polylang/reviews/)

 * 10 replies
 * 3 participants
 * Last reply from: [v4ssi](https://wordpress.org/support/users/v4ssi/)
 * Last activity: [12 years, 7 months ago](https://wordpress.org/support/topic/plugin-polylang-pll_register_string-problem/#post-3106625)
 * Status: resolved