aboutsummaryrefslogtreecommitdiff
path: root/mod/translation_editor/lib
diff options
context:
space:
mode:
Diffstat (limited to 'mod/translation_editor/lib')
-rw-r--r--mod/translation_editor/lib/events.php9
-rw-r--r--mod/translation_editor/lib/functions.php581
-rw-r--r--mod/translation_editor/lib/hooks.php45
3 files changed, 635 insertions, 0 deletions
diff --git a/mod/translation_editor/lib/events.php b/mod/translation_editor/lib/events.php
new file mode 100644
index 000000000..21492088c
--- /dev/null
+++ b/mod/translation_editor/lib/events.php
@@ -0,0 +1,9 @@
+<?php
+
+ function translation_editor_upgrade_event($event, $type, $object){
+
+ if(defined("UPGRADING") && (UPGRADING == "upgrading")){
+ // call action hook function to avoid coding the same thing twice
+ translation_editor_actions_hook("action", "upgrading", null, null);
+ }
+ } \ No newline at end of file
diff --git a/mod/translation_editor/lib/functions.php b/mod/translation_editor/lib/functions.php
new file mode 100644
index 000000000..2c12c9dad
--- /dev/null
+++ b/mod/translation_editor/lib/functions.php
@@ -0,0 +1,581 @@
+<?php
+
+ /**
+ * Returns array of all available plugins and their individual language keys
+ *
+ * @param string $current_language
+ *
+ * @return array || false
+ */
+ function translation_editor_get_plugins($current_language){
+ global $CONFIG;
+
+ $result = false;
+
+ if(!empty($current_language)){
+ translation_editor_reload_all_translations();
+ translation_editor_load_translations($current_language);
+
+ $result = array();
+ $core = array();
+ $custom_keys = array();
+ $plugins_result = array();
+
+ $backup_full = $CONFIG->translations;
+ $plugins = elgg_get_plugins();
+
+ // Core translation
+ $CONFIG->translations = array();
+ $plugin_language = $CONFIG->path . "languages" . DIRECTORY_SEPARATOR . "en.php";
+
+ if(file_exists($plugin_language)){
+ include($plugin_language);
+
+ unset($CONFIG->translations["en"][""]);
+
+ $plugin_keys = $CONFIG->translations["en"];
+
+ $key_count = count($plugin_keys);
+
+ if(array_key_exists($current_language, $backup_full)){
+ $exists_count = $key_count - count(array_diff_key($plugin_keys, $backup_full[$current_language]));
+ } else {
+ $exists_count = 0;
+ }
+
+ if($custom_content = translation_editor_read_translation($current_language, "core")){
+ $custom_count = count($custom_content);
+ } else {
+ $custom_count = 0;
+ }
+
+ $core["core"]["total"] = $key_count;
+ $core["core"]["exists"] = $exists_count;
+ $core["core"]["custom"] = $custom_count;
+ }
+
+ // Custom Keys
+ $CONFIG->translations = array();
+ $custom_keys_original = $CONFIG->dataroot . "translation_editor" . DIRECTORY_SEPARATOR . "custom_keys" . DIRECTORY_SEPARATOR . "en.php";
+
+ if(file_exists($custom_keys_original)){
+ include($custom_keys_original);
+
+ unset($CONFIG->translations["en"][""]);
+
+ $plugin_keys = $CONFIG->translations["en"];
+
+ $key_count = count($plugin_keys);
+
+ if(array_key_exists($current_language, $backup_full)){
+ $exists_count = $key_count - count(array_diff_key($plugin_keys, $backup_full[$current_language]));
+ } else {
+ $exists_count = 0;
+ }
+
+ if($custom_content = translation_editor_read_translation($current_language, "custom_keys")){
+ $custom_count = count($custom_content);
+ } else {
+ $custom_count = 0;
+ }
+
+ $custom_keys["custom_keys"]["total"] = $key_count;
+ $custom_keys["custom_keys"]["exists"] = $exists_count;
+ $custom_keys["custom_keys"]["custom"] = $custom_count;
+ } else {
+ $custom_keys["custom_keys"]["total"] = 0;
+ $custom_keys["custom_keys"]["exists"] = 0;
+ $custom_keys["custom_keys"]["custom"] = 0;
+ }
+
+ // Plugin translations
+ foreach($plugins as $plugin){
+
+ $title = $plugin->title;
+
+ $CONFIG->translations = array();
+ $plugin_language = $plugin->getPath() . DIRECTORY_SEPARATOR. "languages" . DIRECTORY_SEPARATOR . "en.php";
+
+ if(file_exists($plugin_language)){
+
+ include($plugin_language);
+
+ unset($CONFIG->translations["en"][""]);
+
+ $plugin_keys = $CONFIG->translations["en"];
+
+ $key_count = count($plugin_keys);
+
+ if(array_key_exists($current_language, $backup_full)){
+ $exists_count = $key_count - count(array_diff_key($plugin_keys, $backup_full[$current_language]));
+ } else {
+ $exists_count = 0;
+ }
+
+ if($custom_content = translation_editor_read_translation($current_language, $title)){
+ $custom_count = count($custom_content);
+ } else {
+ $custom_count = 0;
+ }
+
+ $plugins_result[$title]["total"] = $key_count;
+ $plugins_result[$title]["exists"] = $exists_count;
+ $plugins_result[$title]["custom"] = $custom_count;
+ }
+ }
+
+ ksort($plugins_result);
+
+ $result = $core + $custom_keys + $plugins_result;
+
+ $CONFIG->translations = $backup_full;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns translation data for a specific plugin
+ *
+ * @param string $current_language
+ * @param string $plugin
+ *
+ * @return array || false
+ */
+ function translation_editor_get_plugin($current_language, $plugin){
+ global $CONFIG;
+
+ $result = false;
+
+ if(!empty($current_language) && !empty($plugin)){
+
+ translation_editor_reload_all_translations();
+ translation_editor_load_translations($current_language);
+
+ $result = array();
+ $result["total"] = 0;
+
+ $backup_full = $CONFIG->translations;
+
+ $CONFIG->translations = array();
+ $base_path = $CONFIG->path;
+
+ if($plugin == "core"){
+ // Core translation
+ $plugin_language = $base_path . "languages" . DIRECTORY_SEPARATOR . "en.php";
+ } elseif($plugin == "custom_keys"){
+ $plugin_language = $CONFIG->dataroot . "translation_editor" . DIRECTORY_SEPARATOR . "custom_keys" . DIRECTORY_SEPARATOR . "en.php";
+ } else {
+ // Plugin translations
+ $plugin_language = $base_path . "mod" . DIRECTORY_SEPARATOR . $plugin . DIRECTORY_SEPARATOR. "languages" . DIRECTORY_SEPARATOR . "en.php";
+ }
+
+ // Fetch translations
+ if(file_exists($plugin_language)){
+ include($plugin_language);
+
+ unset($CONFIG->translations["en"][""]);
+
+ $plugin_keys = $CONFIG->translations["en"];
+
+ $key_count = count($plugin_keys);
+
+ if(array_key_exists($current_language, $backup_full)){
+ $exists_count = $key_count - count(array_diff_key($plugin_keys, $backup_full[$current_language]));
+ } else {
+ $exists_count = 0;
+ }
+
+ if($custom_content = translation_editor_read_translation($current_language, $plugin)){
+ $custom = $custom_content;
+ } else {
+ $custom = array();
+ }
+
+ $result["total"] = $key_count;
+ $result["exists"] = $exists_count;
+ $result["en"] = $plugin_keys;
+ $result["current_language"] = array_intersect_key($backup_full[$current_language], $plugin_keys);
+ $result["custom"] = $custom;
+ }
+
+ $CONFIG->translations = $backup_full;
+ }
+
+ return $result;
+ }
+
+ function translation_editor_compare_translations($current_language, $translated){
+ global $CONFIG;
+
+ $result = false;
+
+ if(!empty($current_language) && !empty($translated)){
+ $result = array();
+
+ $backup_full = $CONFIG->translations;
+
+ $CONFIG->translations = array();
+ translation_editor_reload_all_translations();
+
+ foreach($translated as $key => $value){
+ $original = clean_line_breaks(trim(html_entity_decode($CONFIG->translations[$current_language][$key], ENT_NOQUOTES, "UTF-8")));
+ $new = clean_line_breaks(trim(html_entity_decode($value, ENT_NOQUOTES, "UTF-8")));
+
+ if($original != $new && strlen($new) > 0){
+ $result[$key] = $new;
+ }
+ }
+
+ $CONFIG->translations = $backup_full;
+ }
+
+ return $result;
+ }
+
+ function clean_line_breaks($string){
+ return preg_replace("/(\r\n)|(\n|\r)/", PHP_EOL, $string);
+ }
+
+
+ function translation_editor_write_translation($current_language, $plugin, $translation){
+ global $CONFIG;
+
+ $result = false;
+
+ if(!empty($current_language) && !empty($plugin) && !empty($translation)){
+ translation_editor_check_file_structure($current_language);
+
+ $base_dir = $CONFIG->dataroot . "translation_editor" . DIRECTORY_SEPARATOR;
+ $contents = json_encode($translation);
+
+ if($bytes = file_put_contents($base_dir . $current_language . DIRECTORY_SEPARATOR . $plugin . ".json", $contents)){
+ $result = $bytes;
+ }
+ }
+
+ return $result;
+ }
+
+ function translation_editor_read_translation($current_language, $plugin){
+ $result = false;
+
+ if(!empty($current_language) && !empty($plugin)){
+ $base_dir = elgg_get_data_path() . "translation_editor" . DIRECTORY_SEPARATOR;
+
+ if(file_exists($base_dir . $current_language . DIRECTORY_SEPARATOR . $plugin . ".json")){
+ if($contents = file_get_contents($base_dir . $current_language . DIRECTORY_SEPARATOR . $plugin . ".json")){
+ $result = json_decode($contents, true);
+ }
+
+ }
+ }
+
+ return $result;
+ }
+
+ function translation_editor_load_translations($current_language = ""){
+ global $CONFIG;
+
+ if(empty($current_language)){
+ $current_language = get_current_language();
+ }
+
+ // check if update is needed
+ $main_ts = datalist_get("te_last_update_" . $current_language);
+ $site_ts = get_private_setting($CONFIG->site_guid, "te_last_update_" . $current_language);
+
+ if(!empty($main_ts)){
+ if(empty($site_ts) || ($main_ts > $site_ts)){
+ if(translation_editor_merge_translations($current_language)){
+ set_private_setting($CONFIG->site_guid, "te_last_update_" . $current_language, time());
+ }
+ }
+ } else {
+ translation_editor_merge_translations($current_language, true);
+ }
+
+ // load translations
+ if($translations = translation_editor_read_translation($current_language, "translation_editor_merged_" . $CONFIG->site_guid)){
+ add_translation($current_language, $translations);
+ }
+ }
+
+ function translation_editor_load_custom_languages(){
+ if($custom_languages = elgg_get_plugin_setting("custom_languages", "translation_editor")){
+ $custom_languages = explode(",", $custom_languages);
+
+ foreach($custom_languages as $lang){
+ add_translation($lang, array("" => ""));
+ }
+ }
+ }
+
+ function translation_editor_reload_all_translations(){
+ global $CONFIG;
+
+ static $run_once;
+
+ if(isset($run_once)){
+ $CONFIG->translations = $run_once;
+ } else {
+
+ foreach($CONFIG->language_paths as $path => $dummy){
+ if($handle = opendir($path)){
+ while($language = readdir($handle)){
+ if(is_file($path . $language)){
+ include($path . $language);
+ }
+ }
+
+ closedir($handle);
+ }
+ }
+
+ $run_once = $CONFIG->translations;
+ }
+ }
+
+ function translation_editor_check_file_structure($current_language){
+ $result = false;
+
+ if(!empty($current_language)){
+ $base_dir = elgg_get_data_path() . "translation_editor" . DIRECTORY_SEPARATOR;
+ if(!file_exists($base_dir)){
+ mkdir($base_dir);
+ }
+
+ if(!file_exists($base_dir . $current_language . DIRECTORY_SEPARATOR)){
+ mkdir($base_dir . $current_language . DIRECTORY_SEPARATOR);
+ }
+
+ $result = true;
+ }
+
+ return $result;
+ }
+
+ function translation_editor_delete_translation($current_language, $plugin){
+ $result = false;
+
+ if(!empty($current_language) && !empty($plugin)){
+ $filename = elgg_get_data_path() . "translation_editor" . DIRECTORY_SEPARATOR . $current_language . DIRECTORY_SEPARATOR . $plugin . ".json";
+
+ if(file_exists($filename)){
+ $result = unlink($filename);
+ }
+ }
+
+ return $result;
+ }
+
+ function translation_editor_get_language_completeness($current_language){
+ $result = false;
+
+ if(!empty($current_language) && $current_language != "en"){
+ $plugins = translation_editor_get_plugins($current_language);
+
+ $english_count = 0;
+ $current_count = 0;
+
+ foreach($plugins as $plugin){
+ $english_count += $plugin["total"];
+ $current_count += $plugin["exists"];
+ }
+
+ $result = round(($current_count / $english_count) * 100, 2);
+ }
+
+ return $result;
+ }
+
+ function translation_editor_is_translation_editor($user_guid = 0){
+ static $editors_cache;
+
+ $result = false;
+
+ if(empty($user_guid)){
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+
+ if(!empty($user_guid)){
+ // preload all editors
+ if(!isset($editors_cache)){
+ $editors_cache = array();
+
+ $options = array(
+ "type" => "user",
+ "limit" => false,
+ "metadata_name_value_pairs" => array(
+ "name" => "translation_editor",
+ "value" => true
+ ),
+ "callback" => "translation_editor_guid_only"
+ );
+
+ if($guids = elgg_get_entities_from_metadata($options)){
+ $editors_cache = $guids;
+ }
+ }
+
+ // is the user an editor or an admin
+ if(in_array($user_guid, $editors_cache)){
+ $result = true;
+ } elseif(($user = get_user($user_guid)) && $user->isAdmin()){
+ $result = true;
+ } elseif (elgg_get_plugin_setting('everybody_translate', 'translation_editor') == 'yes') {
+ $result = true;
+ }
+ }
+
+ return $result;
+ }
+
+ function translation_editor_unregister_translations(){
+ global $CONFIG;
+
+ $result = false;
+
+ if($disabled_languages = translation_editor_get_disabled_languages()){
+ foreach($CONFIG->translations as $key => $dummy){
+ if(in_array($key, $disabled_languages)){
+ unset($CONFIG->translations[$key]);
+ }
+ }
+
+ $result = true;
+ }
+
+ return $result;
+ }
+
+ function translation_editor_search_translation($query, $language = "en"){
+ $result = false;
+
+ $plugins = translation_editor_get_plugins($language);
+ $found = array();
+
+ foreach($plugins as $plugin => $data){
+ if($translations = translation_editor_get_plugin($language, $plugin)){
+ foreach($translations["en"] as $key => $value){
+ if(stristr($key, $query) || stristr($value, $query) || (array_key_exists($key, $translations["current_language"]) && stristr($translations["current_language"][$key], $query))){
+ if(!array_key_exists($plugin, $found)){
+ $found[$plugin] = array(
+ "en" => array(),
+ "current_language" => array()
+ );
+ }
+
+ $found[$plugin]["en"][$key] = $value;
+ if(array_key_exists($key, $translations["current_language"])){
+ $found[$plugin]["current_language"][$key] = $translations["current_language"][$key];
+ }
+ }
+ }
+
+ if(!empty($found)){
+ $result = $found;
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ function translation_editor_merge_translations($language = "", $update = false){
+ global $CONFIG;
+
+ $result = false;
+
+ if(empty($language)){
+ $language = get_current_language();
+ }
+
+ if(!empty($language)){
+ $translations = array();
+
+ if($core = translation_editor_read_translation($language, "core")){
+ $translations = $core;
+ }
+
+ if($custom_keys = translation_editor_read_translation($language, "custom_keys")){
+ $translations += $custom_keys;
+ }
+
+ if($plugins = elgg_get_plugins()){
+ foreach($plugins as $plugin){
+ if($plugin_translation = translation_editor_read_translation($language, $plugin->title)){
+ $translations += $plugin_translation;
+ }
+ }
+ }
+
+ if(!empty($translations)){
+ if(translation_editor_write_translation($language, "translation_editor_merged_" . $CONFIG->site_guid, $translations)){
+ $result = true;
+ }
+ } else {
+ if(translation_editor_delete_translation($language, "translation_editor_merged_" . $CONFIG->site_guid)){
+ $result = true;
+ }
+ }
+ }
+
+ if($result){
+ elgg_trigger_event("language:merge", "translation_editor", $language);
+ }
+
+ // reset language cache on all sites
+ if($update){
+ $ts = time();
+
+ datalist_set("te_last_update_" . $language, $ts);
+ set_private_setting($CONFIG->site_guid, "te_last_update_" . $language, $ts);
+ }
+
+ return $result;
+ }
+
+ /**
+ * parses a string meant for printf and returns an array of found parameters
+ *
+ * @param string $string
+ * @return array
+ */
+ function translation_editor_get_string_parameters($string, $count = true) {
+ $valid = '/%[-+]?(?:[ 0]|\'.)?a?\d*(?:\.\d*)?[%bcdeEufFgGosxX]/';
+
+ $result = array();
+
+ if(!empty($string)){
+ if(!$string = preg_replace('/^[^%]*/', '', $string)){
+ // no results
+ } elseif(preg_match_all($valid, $string, $matches)) {
+ $result = $matches[0];
+ }
+ }
+
+ if($count){
+ $result = count($result);
+ }
+
+ return $result;
+ }
+
+ function translation_editor_get_disabled_languages(){
+ static $result;
+
+ if(!isset($result)){
+ $result = false;
+
+ if($disabled_languages = elgg_get_plugin_setting(TRANSLATION_EDITOR_DISABLED_LANGUAGE, "translation_editor")){
+ $result = string_to_tag_array($disabled_languages);
+ }
+ }
+
+ return $result;
+ }
+
+ function translation_editor_guid_only($row){
+ return (int) $row->guid;
+ }
diff --git a/mod/translation_editor/lib/hooks.php b/mod/translation_editor/lib/hooks.php
new file mode 100644
index 000000000..486fb0b7a
--- /dev/null
+++ b/mod/translation_editor/lib/hooks.php
@@ -0,0 +1,45 @@
+<?php
+
+ function translation_editor_user_hover_menu($hook, $type, $return, $params) {
+ $user = $params['entity'];
+
+ if (elgg_is_admin_logged_in() && !($user->isAdmin())){
+ // TODO: replace with a single toggle editor action?
+ if(translation_editor_is_translation_editor($user->getGUID())){
+ $url = "action/translation_editor/unmake_translation_editor?user=" . $user->getGUID();
+ $title = elgg_echo("translation_editor:action:unmake_translation_editor");
+ } else {
+ $url = "action/translation_editor/make_translation_editor?user=" . $user->getGUID();
+ $title = elgg_echo("translation_editor:action:make_translation_editor");
+ }
+
+ $item = new ElggMenuItem('translation_editor', $title, $url);
+ $item->setSection('admin');
+ $item->setConfirmText(elgg_echo("question:areyousure"));
+ $return[] = $item;
+
+ return $return;
+ }
+ }
+
+ function translation_editor_actions_hook($hook, $type, $return, $params){
+ $allowed_actions = array(
+ "admin/plugins/activate",
+ "admin/plugins/deactivate",
+ "admin/plugins/activate_all",
+ "admin/plugins/deactivate_all",
+ "admin/plugins/set_priority",
+ "upgrading" // not actualy an action but comes from events.php
+ );
+
+ if(!empty($type) && in_array($type, $allowed_actions)){
+ // make sure we have all translations
+ translation_editor_reload_all_translations();
+
+ if($languages = get_installed_translations()){
+ foreach($languages as $key => $desc){
+ remove_private_setting(elgg_get_site_entity()->getGUID(), "te_last_update_" . $key);
+ }
+ }
+ }
+ } \ No newline at end of file