2015-07-24 17:02:42 +00:00
< ? php
/*
* Name : Language Filter
* Version : 0.1
* Description : Filters out postings in languages not spoken by the users
* Author : Tobias Diekershoff < https :// f . diekershoff . de / u / tobias >
* License : MIT
*/
2017-11-05 13:59:45 +00:00
use Friendica\App ;
2018-01-17 00:51:12 +00:00
use Friendica\Core\Addon ;
2018-01-22 19:03:11 +00:00
use Friendica\Core\L10n ;
2017-11-05 16:15:34 +00:00
use Friendica\Core\PConfig ;
2017-10-05 12:58:44 +00:00
2015-07-24 17:02:42 +00:00
/* Define the hooks we want to use
* that is , we have settings , we need to save the settings and we want
* to modify the content of a posting when friendica prepares it .
*/
2017-11-05 13:59:45 +00:00
function langfilter_install ()
{
2018-01-17 00:51:12 +00:00
Addon :: registerHook ( 'prepare_body' , 'addon/langfilter/langfilter.php' , 'langfilter_prepare_body' , 10 );
2018-01-20 13:57:41 +00:00
Addon :: registerHook ( 'addon_settings' , 'addon/langfilter/langfilter.php' , 'langfilter_addon_settings' );
Addon :: registerHook ( 'addon_settings_post' , 'addon/langfilter/langfilter.php' , 'langfilter_addon_settings_post' );
2015-07-24 17:02:42 +00:00
}
2017-11-05 13:59:45 +00:00
function langfilter_uninstall ()
{
2018-01-17 00:51:12 +00:00
Addon :: unregisterHook ( 'prepare_body' , 'addon/langfilter/langfilter.php' , 'langfilter_prepare_body' );
2018-01-20 13:57:41 +00:00
Addon :: unregisterHook ( 'addon_settings' , 'addon/langfilter/langfilter.php' , 'langfilter_addon_settings' );
Addon :: unregisterHook ( 'addon_settings_post' , 'addon/langfilter/langfilter.php' , 'langfilter_addon_settings_post' );
2015-07-24 17:02:42 +00:00
}
/* The settings
* 1 st check if somebody logged in is calling
* 2 nd get the current settings
* 3 rd parse a SMARTY3 template , replacing some translateable strings for the form
*/
2017-11-05 13:59:45 +00:00
function langfilter_addon_settings ( App $a , & $s )
{
if ( ! local_user ()) {
2015-07-24 17:02:42 +00:00
return ;
2017-11-05 13:59:45 +00:00
}
2017-11-05 16:15:34 +00:00
$enable_checked = ( intval ( PConfig :: get ( local_user (), 'langfilter' , 'disable' )) ? '' : ' checked="checked" ' );
$languages = PConfig :: get ( local_user (), 'langfilter' , 'languages' );
$minconfidence = PConfig :: get ( local_user (), 'langfilter' , 'minconfidence' ) * 100 ;
$minlength = PConfig :: get ( local_user (), 'langfilter' , 'minlength' );
2015-07-24 17:02:42 +00:00
2017-11-05 13:59:45 +00:00
if ( ! $languages ) {
2015-07-24 17:02:42 +00:00
$languages = 'en,de,fr,it,es' ;
2017-11-05 13:59:45 +00:00
}
2015-07-24 17:02:42 +00:00
2017-11-05 13:59:45 +00:00
$t = get_markup_template ( " settings.tpl " , " addon/langfilter/ " );
2018-01-15 13:15:33 +00:00
$s .= replace_macros ( $t , [
2018-01-22 19:03:11 +00:00
'$title' => L10n :: t ( " Language Filter " ),
2018-03-29 15:45:42 +00:00
'$intro' => L10n :: t ( 'This addon tries to identify the language posts are writen in. If it does not match any language specifed below, posts will be hidden by collapsing them.' ),
2018-01-22 19:03:11 +00:00
'$enabled' => [ 'langfilter_enable' , L10n :: t ( 'Use the language filter' ), $enable_checked , '' ],
2018-03-29 13:22:05 +00:00
'$languages' => [ 'langfilter_languages' , L10n :: t ( 'Able to read' ), $languages , L10n :: t ( 'List of abbreviations (iso2 codes) for languages you speak, comma separated. For example "de,it".' )],
2018-01-22 19:03:11 +00:00
'$minconfidence' => [ 'langfilter_minconfidence' , L10n :: t ( 'Minimum confidence in language detection' ), $minconfidence , L10n :: t ( 'Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value.' )],
2018-03-29 15:45:42 +00:00
'$minlength' => [ 'langfilter_minlength' , L10n :: t ( 'Minimum length of message body' ), $minlength , L10n :: t ( 'Minimum number of characters in message body for filter to be used. Posts shorter than this will not be filtered. Note: Language detection is unreliable for short content (<200 characters).' )],
2018-01-22 19:03:11 +00:00
'$submit' => L10n :: t ( 'Save Settings' ),
2018-01-15 13:15:33 +00:00
]);
2015-07-24 17:02:42 +00:00
return ;
}
2017-11-05 13:59:45 +00:00
2015-07-24 17:02:42 +00:00
/* Save the settings
* 1 st check it ' s a logged in user calling
* 2 nd check the langfilter form is to be saved
* 3 rd save the settings to the DB for later usage
*/
2017-11-05 13:59:45 +00:00
function langfilter_addon_settings_post ( App $a , & $b )
{
if ( ! local_user ()) {
2015-07-24 17:02:42 +00:00
return ;
2017-11-05 13:59:45 +00:00
}
2015-07-24 17:02:42 +00:00
2017-11-05 13:59:45 +00:00
if ( $_POST [ 'langfilter-settings-submit' ]) {
2017-11-05 16:15:34 +00:00
PConfig :: set ( local_user (), 'langfilter' , 'languages' , trim ( $_POST [ 'langfilter_languages' ]));
2017-11-05 13:59:45 +00:00
$enable = (( x ( $_POST , 'langfilter_enable' )) ? intval ( $_POST [ 'langfilter_enable' ]) : 0 );
$disable = 1 - $enable ;
2017-11-05 16:15:34 +00:00
PConfig :: set ( local_user (), 'langfilter' , 'disable' , $disable );
2017-11-05 13:59:45 +00:00
$minconfidence = 0 + $_POST [ 'langfilter_minconfidence' ];
if ( ! $minconfidence ) {
$minconfidence = 0 ;
2017-11-05 16:15:34 +00:00
} elseif ( $minconfidence < 0 ) {
2017-11-05 13:59:45 +00:00
$minconfidence = 0 ;
2017-11-05 16:15:34 +00:00
} elseif ( $minconfidence > 100 ) {
2017-11-05 13:59:45 +00:00
$minconfidence = 100 ;
}
2017-11-05 16:15:34 +00:00
PConfig :: set ( local_user (), 'langfilter' , 'minconfidence' , $minconfidence / 100.0 );
2017-11-05 13:59:45 +00:00
$minlength = 0 + $_POST [ 'langfilter_minlength' ];
if ( ! $minlength ) {
$minlength = 32 ;
2017-11-05 16:15:34 +00:00
} elseif ( $minlengt8h < 0 ) {
2017-11-05 13:59:45 +00:00
$minlength = 32 ;
}
2017-11-05 16:15:34 +00:00
PConfig :: set ( local_user (), 'langfilter' , 'minlength' , $minlength );
2017-11-05 13:59:45 +00:00
2018-01-22 19:03:11 +00:00
info ( L10n :: t ( 'Language Filter Settings saved.' ) . EOL );
2015-07-24 17:02:42 +00:00
}
}
2017-11-05 13:59:45 +00:00
2015-07-24 17:02:42 +00:00
/* Actually filter postings by their language
* 1 st check if the user wants to filter postings
* 2 nd get the user settings which languages shall be not filtered out
2015-09-22 10:29:06 +00:00
* 3 rd extract the language of a posting
2015-07-24 17:02:42 +00:00
* 4 th if the determined language does not fit to the spoken languages
* of the user , then collapse the posting , but provide a link to
* expand it again .
*/
2017-11-05 13:59:45 +00:00
function langfilter_prepare_body ( App $a , & $b )
{
$logged_user = local_user ();
if ( ! $logged_user ) {
return ;
}
2015-09-09 17:41:38 +00:00
2017-11-05 13:59:45 +00:00
// Never filter own messages
// TODO: find a better way to extract this
2018-01-01 22:17:15 +00:00
$logged_user_profile = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
2017-11-05 13:59:45 +00:00
if ( $logged_user_profile == $b [ 'item' ][ 'author-link' ]) {
return ;
}
2015-07-24 17:02:42 +00:00
2017-11-05 13:59:45 +00:00
// Don't filter if language filter is disabled
2017-11-05 16:15:34 +00:00
if ( PConfig :: get ( $logged_user , 'langfilter' , 'disable' )) {
2017-11-05 13:59:45 +00:00
return ;
}
2015-09-10 07:54:26 +00:00
2017-11-05 13:59:45 +00:00
// Don't filter if body lenght is below minimum
2017-11-05 16:15:34 +00:00
$minlen = PConfig :: get ( local_user (), 'langfilter' , 'minlength' );
2017-11-05 13:59:45 +00:00
if ( ! $minlen ) {
$minlen = 32 ;
}
if ( strlen ( $b [ 'item' ][ 'body' ]) < $minlen ) {
return ;
}
2016-10-01 16:15:32 +00:00
2017-11-05 16:15:34 +00:00
$spoken_config = PConfig :: get ( local_user (), 'langfilter' , 'languages' );
$minconfidence = PConfig :: get ( local_user (), 'langfilter' , 'minconfidence' );
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
// Don't filter if no spoken languages are configured
if ( ! $spoken_config )
return ;
$spoken_languages = explode ( ',' , $spoken_config );
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
// Extract the language of the post
$opts = $b [ 'item' ][ 'postopts' ];
if ( ! $opts ) {
// no options associated to post
return ;
}
if ( ! preg_match ( '/\blang=([^;]*);([^:]*)/' , $opts , $matches )) {
// no lang options associated to post
return ;
}
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
$lang = $matches [ 1 ];
$confidence = $matches [ 2 ];
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
// Do not filter if language detection confidence is too low
if ( $minconfidence && $confidence < $minconfidence ) {
return ;
}
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
$iso2 = Text_LanguageDetect_ISO639 :: nameToCode2 ( $lang );
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
if ( ! $iso2 ) {
return ;
}
$spoken = in_array ( $iso2 , $spoken_languages );
2015-09-22 10:29:06 +00:00
2017-11-05 13:59:45 +00:00
if ( ! $spoken ) {
$rnd = random_string ( 8 );
2018-03-29 13:22:05 +00:00
$b [ 'html' ] = '<div id="langfilter-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'langfilter-' . $rnd . '\'); >' . L10n :: t ( 'Hidden content in %s - Click to open/close' , $lang ) . '</div><div id="langfilter-' . $rnd . '" style="display: none; " >' . $b [ 'html' ] . '</div>' ;
2017-11-05 13:59:45 +00:00
}
2015-07-24 17:02:42 +00:00
}