PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.4.0
Translate and Go multilingual – Automatic AI translation – wpLingua v2.4.0
2.16.4 2.16.3 2.16.2 2.16.1 2.16.0 2.15.2 2.15.1 2.15.0 2.14.3 2.14.2 2.14.1 2.14.0 2.13.1 2.13.0 2.12.3 2.12.2 2.12.1 trunk 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.2.0 1.2.1 All 109 releases
wplingua / wplingua.php

wplingua.php in Translate and Go multilingual – Automatic AI translation – wpLingua 2.4.0, at wplingua.php

314 lines 11.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: wpLingua
4 * Plugin URI: https://wplingua.com/
5 * Description: An all-in-one solution that makes your websites multilingual and translates them automatically, without word or page limits. The highlights: a free first language, an on-page visual editor for editing translations, a customizable language switcher, search engine optimization (SEO), self-hosted data and more!
6 * Author: wpLingua Translation Service
7 * Author URI: https://wplingua.com/
8 * Text Domain: wplingua
9 * Domain Path: /languages/
10 * Version: 2.4.0
11 * Requires PHP: 7.4
12 * License: GPL v2 or later
13 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
14 */
15
16
17 // If this file is called directly, abort.
18 if ( ! defined( 'WPINC' ) ) {
19 die;
20 }
21
22
23 // Define wpLingua constants
24 define( 'WPLNG_API_URL', 'https://api.wplingua.com' );
25 define( 'WPLNG_API_VERSION', '2.0' );
26 define( 'WPLNG_API_SSLVERIFY', true );
27 define( 'WPLNG_PLUGIN_VERSION', '2.4.0' );
28 define( 'WPLNG_PLUGIN_FILE', plugin_basename( __FILE__ ) );
29 define( 'WPLNG_PLUGIN_PATH', dirname( __FILE__ ) );
30 define( 'WPLNG_MAX_TRANSLATIONS', 256 );
31 define( 'WPLNG_MAX_FILE_SIZE', 5000000 );
32
33
34 // Define debug constants
35 defined( 'WPLNG_LOG_JSON_DEBUG' ) || define( 'WPLNG_LOG_JSON_DEBUG', false );
36 defined( 'WPLNG_LOG_AJAX_DEBUG' ) || define( 'WPLNG_LOG_AJAX_DEBUG', false );
37
38
39 // Load all needed PHP files
40 require_once WPLNG_PLUGIN_PATH . '/loader.php';
41
42
43 /**
44 * Loads wpLingua plugin's translated strings.
45 *
46 * @return void
47 */
48 function wplng_load_plugin_textdomain() {
49 load_plugin_textdomain(
50 'wplingua',
51 false,
52 'wplingua/languages'
53 );
54 }
55
56
57 /**
58 * Register all wpLingua Hook
59 *
60 * @return void
61 */
62 function wplng_start() {
63
64 // Define $wplng_request_uri
65 if ( isset( $_SERVER['REQUEST_URI'] ) ) {
66
67 $request_uri = sanitize_url( $_SERVER['REQUEST_URI'] );
68
69 // Check if the referer is clean
70 if ( strtolower( esc_url_raw( $request_uri ) ) !== strtolower( $request_uri ) ) {
71 return;
72 }
73
74 global $wplng_request_uri;
75 $wplng_request_uri = $request_uri;
76
77 }
78
79 // The plugin version has changed
80 if ( get_option( 'wplng_version' ) !== WPLNG_PLUGIN_VERSION ) {
81 wplng_clear_translations_cache();
82 wplng_clear_slugs_cache();
83 update_option( 'wplng_version', WPLNG_PLUGIN_VERSION, true );
84 }
85
86 // Load plugin text domain /languages/
87 add_action( 'init', 'wplng_load_plugin_textdomain' );
88
89 // Display a notice if incompatibility is detected
90 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_plugin', 1 );
91 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_multisite', 1 );
92 // add_action( 'admin_notices', 'wplng_admin_notice_incompatible_sub_folder', 1 );
93 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_php_version', 1 );
94
95 // Return if incompatibility is detected
96 if ( ! empty( wplng_get_incompatible_plugins() )
97 || is_multisite()
98 // || get_option( 'siteurl' ) !== get_option( 'home' )
99 || ( version_compare( PHP_VERSION, '7.4' ) < 0 )
100 ) {
101 return;
102 }
103
104 // Register plugin settings
105 add_action( 'admin_init', 'wplng_register_settings' );
106
107 // Add settings link in plugin list
108 add_filter( 'plugin_action_links_' . WPLNG_PLUGIN_FILE, 'wplng_settings_link' );
109
110 // Redirect to the settings page on plugin activation
111 add_action( 'activated_plugin', 'wplng_plugin_activation_redirect' );
112
113 // Set footer text for options pages
114 add_filter( 'admin_footer_text', 'wplng_admin_footer_text', 11 );
115 add_filter( 'update_footer', 'wplng_update_footer', 11 );
116
117 // Print head script (JSON with all languages informations)
118 add_action( 'toplevel_page_wplingua-settings', 'wplng_inline_script_languages' );
119
120 if ( empty( wplng_get_api_data() ) ) {
121
122 // Add Register option page in back office menu
123 add_action( 'admin_menu', 'wplng_create_menu_register' );
124
125 // Enqueue CSS and JS files for register option pages
126 add_action( 'admin_enqueue_scripts', 'wplng_option_page_register_assets' );
127
128 // Display a notice if the plugin is activate but not configured
129 add_action( 'admin_notices', 'wplng_admin_notice_no_key_set', 1 );
130
131 } else {
132
133 /**
134 * Back office
135 */
136
137 // Add menu in back office
138 add_action( 'admin_menu', 'wplng_create_menu' );
139
140 // Add admin Bar menu
141 add_action( 'admin_bar_menu', 'wplng_admin_bar_menu', 81 );
142
143 // Switcher in nav menu options
144 add_action( 'admin_enqueue_scripts', 'wplng_switcher_nav_menu_inline_scripts' );
145 add_action( 'admin_head-nav-menus.php', 'wp_nav_menu_switcher_box_add_register' );
146 add_action( 'wp_nav_menu_item_custom_fields', 'wp_nav_menu_switcher_box_edit', 10, 2 );
147
148 // Enqueue CSS and JS files for option pages
149 add_action( 'admin_enqueue_scripts', 'wplng_option_page_settings_assets' );
150 add_action( 'admin_enqueue_scripts', 'wplng_option_page_switcher_assets' );
151 add_action( 'admin_enqueue_scripts', 'wplng_option_page_exclusions_assets' );
152 add_action( 'admin_enqueue_scripts', 'wplng_option_page_dictionary_assets' );
153 add_action( 'admin_enqueue_scripts', 'wplng_option_page_link_media_assets' );
154
155 // Update flags URL
156 add_action( 'update_option_wplng_flags_style', 'wplng_options_switcher_update_flags_style', 10, 2 );
157
158 // Reset API data on API key changing
159 add_action( 'update_option_wplng_api_key', 'wplng_on_update_option_wplng_api_key', 10, 2 );
160
161 /**
162 * wplng_translation : CPT, taxo, meta
163 */
164
165 // Register wplng_translation CPT
166 add_action( 'init', 'wplng_register_post_type_translation' );
167
168 // Add metabox for wplng_translation
169 add_action( 'add_meta_boxes_wplng_translation', 'wplng_translation_add_meta_box' );
170
171 // Save metabox on posts saving
172 add_action( 'save_post_wplng_translation', 'wplng_translation_save_meta_boxes_data', 10, 2 );
173
174 // Clear translation cache on trash / untrash
175 add_action( 'trashed_post', 'wplng_clear_translations_cache_trash_untrash' );
176 add_action( 'untrash_post', 'wplng_clear_translations_cache_trash_untrash' );
177 add_action( 'delete_post', 'wplng_clear_translations_cache_trash_untrash' );
178
179 // Enqueue Script for wplng_translation admin
180 add_action( 'admin_print_scripts-post-new.php', 'wplng_translation_assets' );
181 add_action( 'admin_print_scripts-post.php', 'wplng_translation_assets' );
182
183 // Remove Quick edit from translations list
184 add_filter( 'post_row_actions', 'wplng_translation_remove_quick_edit', 10, 2 );
185
186 // Ajax function for regenerate translation on edit page
187 add_action( 'wp_ajax_wplng_ajax_translation', 'wplng_ajax_generate_translation' );
188
189 // Ajax function for edit modal: Get HTML modal
190 add_action( 'wp_ajax_wplng_ajax_edit_modal', 'wplng_ajax_edit_modal' );
191
192 // Ajax function for edit modal: Save modal
193 add_action( 'wp_ajax_wplng_ajax_save_modal', 'wplng_ajax_save_modal' );
194
195 // Display 100 translation in admin area by default
196 add_filter( 'get_user_option_edit_wplng_translation_per_page', 'wplng_translation_per_page' );
197
198 // Filter translations by status
199 add_action( 'restrict_manage_posts', 'wplng_restrict_manage_posts_translation_status' );
200 add_filter( 'parse_query', 'wplng_posts_filter_translation_status' );
201
202 // Translation status on website translations list
203 add_filter( 'post_class', 'wplng_post_class_translation_status', 10, 3 );
204 add_filter( 'post_row_actions', 'wplng_post_row_actions_translation_status', 10, 2 );
205 add_filter( 'manage_wplng_translation_posts_columns', 'wplng_translation_status_columns' );
206 add_action( 'manage_wplng_translation_posts_custom_column', 'wplng_translation_status_item', 10, 2 );
207 add_action( 'admin_head-edit.php', 'wplng_translation_status_style', 10, 2 );
208
209 /**
210 * wplng_translation : CPT, taxo, meta
211 */
212
213 // Register wplng_translation CPT
214 add_action( 'init', 'wplng_register_post_type_slug' );
215
216 // Add metabox for wplng_slug
217 add_action( 'add_meta_boxes_wplng_slug', 'wplng_slug_add_meta_box' );
218
219 // Save metabox on posts saving
220 add_action( 'save_post_wplng_slug', 'wplng_slug_save_meta_boxes_data', 10, 2 );
221
222 // Clear slugs cache on trash / untrash
223 add_action( 'trashed_post', 'wplng_clear_slugs_cache_trash_untrash' );
224 add_action( 'untrash_post', 'wplng_clear_slugs_cache_trash_untrash' );
225 add_action( 'delete_post', 'wplng_clear_slugs_cache_trash_untrash' );
226
227 // Enqueue Script for wplng_translation admin
228 add_action( 'admin_print_scripts-post-new.php', 'wplng_slug_assets' );
229 add_action( 'admin_print_scripts-post.php', 'wplng_slug_assets' );
230
231 // Remove Quick edit from slugs list
232 add_filter( 'post_row_actions', 'wplng_slug_remove_quick_edit', 10, 2 );
233
234 // Ajax function for regenerate slug on edit page
235 add_action( 'wp_ajax_wplng_ajax_slug', 'wplng_ajax_generate_slug' );
236
237 // Display 100 translation in admin area by default
238 add_filter( 'get_user_option_edit_wplng_slug_per_page', 'wplng_slug_per_page' );
239
240 // Filter slugs by status
241 add_action( 'restrict_manage_posts', 'wplng_restrict_manage_posts_slug_status' );
242 add_filter( 'parse_query', 'wplng_posts_filter_slug_status' );
243
244 // Translation status on website slugs list
245 add_filter( 'post_class', 'wplng_post_class_slug_status', 10, 3 );
246 add_filter( 'post_row_actions', 'wplng_post_row_actions_slug_status', 10, 2 );
247 add_filter( 'manage_wplng_slug_posts_columns', 'wplng_slug_status_columns' );
248 add_action( 'manage_wplng_slug_posts_custom_column', 'wplng_slug_status_item', 10, 2 );
249 add_action( 'admin_head-edit.php', 'wplng_slug_status_style', 10, 2 );
250
251 /**
252 * Front
253 */
254
255 // Enqueue CSS and JS files
256 add_action( 'wp_enqueue_scripts', 'wplng_register_assets' );
257
258 // Add languages switcher before </body>
259 add_action( 'wp_footer', 'wplng_switcher_wp_footer' );
260
261 // Add languages switcher in nav menu
262 add_filter( 'wp_nav_menu_objects', 'wplng_switcher_nav_menu_replace_items' );
263 add_filter( 'nav_menu_link_attributes', 'wplng_add_nav_menu_link_attributes_atts', 10, 2 );
264
265 // Set alternate links with hreflang parametters
266 add_action( 'wp_head', 'wplng_link_alternate_hreflang', 2 );
267
268 // Disable web browser automatic translation
269 add_action( 'language_attributes', 'wplng_disable_web_browser_auto_translate' );
270
271 /**
272 * OB and REQUEST_URI
273 */
274
275 // Manage URL with REQUEST_URI and start OB
276 add_action( 'init', 'wplng_ob_start', 1 );
277
278 // Redirect page if is called wiht an untranslate slug
279 add_action( 'template_redirect', 'wplng_redirect_translated_slug' );
280
281 /**
282 * Features
283 */
284
285 // Search from translated languages
286 if ( ! empty( get_option( 'wplng_translate_search' ) )
287 && wplng_api_feature_is_allow( 'search' )
288 ) {
289 add_action( 'parse_query', 'wplng_translate_search_query' );
290 } else {
291 add_filter( 'wplng_url_is_translatable', 'wplng_exclude_search', 20 );
292 }
293
294 /**
295 * Shortcode
296 */
297
298 add_shortcode( 'wplng_switcher', 'wplng_shortcode_switcher' );
299 add_shortcode( 'wplng_notranslate', 'wplng_shortcode_notranslate' );
300 add_shortcode( 'wplng_only', 'wplng_shortcode_only' );
301
302 /**
303 * Gutenberg
304 */
305
306 add_filter( 'block_categories_all', 'wplng_block_category' );
307 add_action( 'init', 'wplng_register_block' );
308 add_action( 'enqueue_block_editor_assets', 'wplng_register_block_assets' );
309
310 }
311
312 }
313 wplng_start();
314