PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.10.4
Translate and Go multilingual – Automatic AI translation – wpLingua v2.10.4
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.10.4, at wplingua.php

354 lines 12.8 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.10.4
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', '3.0' );
26 define( 'WPLNG_API_SSLVERIFY', true );
27 define( 'WPLNG_PLUGIN_VERSION', '2.10.4' );
28 define( 'WPLNG_PLUGIN_FILE', plugin_basename( __FILE__ ) );
29 define( 'WPLNG_PLUGIN_PATH', __DIR__ );
30 define( 'WPLNG_PHP_MIN_VERSION', '7.4' );
31 define( 'WPLNG_MAX_TRANSLATIONS_STR', 220 );
32 define( 'WPLNG_MAX_TRANSLATIONS_CHAR', 4200 );
33 define( 'WPLNG_MAX_FILE_SIZE', 5000000 );
34
35
36 // Define debug constants
37 defined( 'WPLNG_DEBUG_JSON' ) || define( 'WPLNG_DEBUG_JSON', false );
38 defined( 'WPLNG_DEBUG_AJAX' ) || define( 'WPLNG_DEBUG_AJAX', false );
39 defined( 'WPLNG_DEBUG_REST' ) || define( 'WPLNG_DEBUG_REST', false );
40 defined( 'WPLNG_DEBUG_BEAT' ) || define( 'WPLNG_DEBUG_BEAT', false );
41 defined( 'WPLNG_DEBUG_XML' ) || define( 'WPLNG_DEBUG_XML', false );
42
43
44 // Load all needed PHP files
45 require_once WPLNG_PLUGIN_PATH . '/loader.php';
46
47
48 /**
49 * Loads wpLingua plugin's translated strings.
50 *
51 * @return void
52 */
53 function wplng_load_plugin_textdomain() {
54 load_plugin_textdomain(
55 'wplingua',
56 false,
57 'wplingua/languages'
58 );
59 }
60
61
62 /**
63 * Register all wpLingua Hook
64 *
65 * @return void
66 */
67 function wplng_start() {
68
69 // Setup $wplng_class_reload
70 global $wplng_class_reload;
71 $wplng_class_reload = false;
72
73 // Setup $wplng_request_uri
74 if ( isset( $_SERVER['REQUEST_URI'] ) ) {
75
76 $request_uri = sanitize_url( $_SERVER['REQUEST_URI'] );
77
78 // Check if the referer is clean
79 if ( strtolower( esc_url_raw( $request_uri ) ) !== strtolower( $request_uri ) ) {
80 return;
81 }
82
83 global $wplng_request_uri;
84 $wplng_request_uri = $request_uri;
85 }
86
87 // The plugin version has changed
88 if ( get_option( 'wplng_version' ) !== WPLNG_PLUGIN_VERSION ) {
89 update_option( 'wplng_version', WPLNG_PLUGIN_VERSION, true );
90 wplng_clear_translations_cache();
91 wplng_clear_slugs_cache();
92 }
93
94 // Load plugin text domain /languages/
95 add_action( 'init', 'wplng_load_plugin_textdomain' );
96
97 // Display a notice if incompatibility is detected
98 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_plugin', 1 );
99 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_multisite', 1 );
100 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_sub_folder', 1 );
101 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_php_version', 1 );
102 add_action( 'admin_notices', 'wplng_admin_notice_incompatible_htaccess', 1 );
103
104 // Return if incompatibility is detected
105 if ( ! empty( wplng_get_incompatible_plugins() )
106 || is_multisite()
107 || wplng_website_in_sub_folder()
108 || ( version_compare( PHP_VERSION, WPLNG_PHP_MIN_VERSION ) < 0 )
109 || ! wplng_htaccess_is_valid()
110 ) {
111 return;
112 }
113
114 // Register plugin settings
115 add_action( 'admin_init', 'wplng_register_settings' );
116
117 // Add settings link in plugin list
118 add_filter( 'plugin_action_links_' . WPLNG_PLUGIN_FILE, 'wplng_settings_link' );
119
120 // Redirect to the settings page on plugin activation
121 add_action( 'activated_plugin', 'wplng_plugin_activation_redirect' );
122
123 // Set footer text for options pages
124 add_filter( 'admin_footer_text', 'wplng_admin_footer_text', 11 );
125 add_filter( 'update_footer', 'wplng_update_footer', 11 );
126
127 // Print head script (JSON with all languages informations)
128 add_action( 'toplevel_page_wplingua-settings', 'wplng_inline_script_languages' );
129
130 if ( empty( wplng_get_api_data() ) ) {
131
132 // Add Register option page in back office menu
133 add_action( 'admin_menu', 'wplng_create_menu_register' );
134
135 // Enqueue CSS and JS files for register option pages
136 add_action( 'admin_enqueue_scripts', 'wplng_option_page_register_assets' );
137
138 // Display a notice if the plugin is activate but not configured
139 add_action( 'admin_notices', 'wplng_admin_notice_no_key_set', 1 );
140
141 } else {
142
143 /**
144 * Back office
145 */
146
147 // Add menu in back office
148 add_action( 'admin_menu', 'wplng_create_menu' );
149
150 // Add admin Bar menu
151 add_action( 'admin_bar_menu', 'wplng_admin_bar_menu', 81 );
152 add_action( 'admin_bar_menu', 'wplng_admin_bar_edit', 81 );
153
154 // Switcher in nav menu options
155 add_action( 'admin_enqueue_scripts', 'wplng_switcher_nav_menu_inline_scripts' );
156 add_action( 'admin_head-nav-menus.php', 'wp_nav_menu_switcher_box_add_register' );
157 add_action( 'wp_nav_menu_item_custom_fields', 'wp_nav_menu_switcher_box_edit', 10, 2 );
158
159 // Enqueue CSS and JS files for option pages
160 add_action( 'admin_enqueue_scripts', 'wplng_option_page_settings_assets' );
161 add_action( 'admin_enqueue_scripts', 'wplng_option_page_switcher_assets' );
162 add_action( 'admin_enqueue_scripts', 'wplng_option_page_exclusions_assets' );
163 add_action( 'admin_enqueue_scripts', 'wplng_option_page_dictionary_assets' );
164 add_action( 'admin_enqueue_scripts', 'wplng_option_page_link_media_assets' );
165
166 // Update flags URL
167 add_action( 'update_option_wplng_flags_style', 'wplng_options_switcher_update_flags_style', 10, 2 );
168
169 // Reset API data on API key changing
170 add_action( 'update_option_wplng_api_key', 'wplng_on_update_option_wplng_api_key', 10, 2 );
171
172 // Add edit link on page and post list
173 add_filter( 'page_row_actions', 'wplng_row_edit_translation_link', 10, 2 );
174 add_filter( 'post_row_actions', 'wplng_row_edit_translation_link', 10, 2 );
175
176 // Special notice
177 add_action( 'admin_notices', 'wplng_admin_notice_bf');
178
179 /**
180 * wplng_translation : CPT, taxo, meta
181 */
182
183 // Register wplng_translation CPT
184 add_action( 'init', 'wplng_register_post_type_translation' );
185
186 // Add metabox for wplng_translation
187 add_action( 'add_meta_boxes_wplng_translation', 'wplng_translation_add_meta_box' );
188
189 // Save metabox on posts saving
190 add_action( 'save_post_wplng_translation', 'wplng_translation_save_meta_boxes_data', 10, 2 );
191
192 // Clear translation cache on trash / untrash
193 add_action( 'trashed_post', 'wplng_clear_translations_cache_trash_untrash' );
194 add_action( 'untrash_post', 'wplng_clear_translations_cache_trash_untrash' );
195 add_action( 'delete_post', 'wplng_clear_translations_cache_trash_untrash' );
196
197 // Enqueue Script for wplng_translation admin: Edit
198 add_action( 'admin_print_scripts-post.php', 'wplng_translation_edit_assets' );
199
200 // Enqueue Script for wplng_translation admin: List
201 add_action( 'admin_print_scripts-edit.php', 'wplng_translation_list_assets' );
202
203 // Only show translations for the website languages
204 add_action( 'pre_get_posts', 'wplng_filter_wplng_translation_posts' );
205
206 // Remove Quick edit from translations list
207 add_filter( 'post_row_actions', 'wplng_translation_remove_quick_edit', 10, 2 );
208
209 // Ajax function for regenerate translation on edit page
210 add_action( 'wp_ajax_wplng_ajax_translation', 'wplng_ajax_generate_translation' );
211
212 // Ajax function for edit modal: Get HTML modal
213 add_action( 'wp_ajax_wplng_ajax_edit_modal', 'wplng_ajax_edit_modal' );
214
215 // Ajax function for edit modal: Save modal
216 add_action( 'wp_ajax_wplng_ajax_save_modal', 'wplng_ajax_save_modal' );
217
218 // Ajax function for edit modal: HeartBeat
219 add_action( 'wp_ajax_wplng_ajax_heartbeat', 'wplng_ajax_heartbeat' );
220 add_action( 'wp_ajax_nopriv_wplng_ajax_heartbeat', 'wplng_ajax_heartbeat' );
221
222 // Display 100 translation in admin area by default
223 add_filter( 'get_user_option_edit_wplng_translation_per_page', 'wplng_translation_per_page' );
224
225 // Filter translations by status
226 add_action( 'restrict_manage_posts', 'wplng_restrict_manage_posts_translation_status' );
227 add_filter( 'parse_query', 'wplng_posts_filter_translation_status' );
228
229 // Translation status on website translations list
230 add_filter( 'post_class', 'wplng_post_class_translation_status', 10, 3 );
231 add_filter( 'post_row_actions', 'wplng_post_row_actions_translation_status', 10, 2 );
232 add_filter( 'manage_wplng_translation_posts_columns', 'wplng_translation_status_columns' );
233 add_action( 'manage_wplng_translation_posts_custom_column', 'wplng_translation_status_item', 10, 2 );
234
235 /**
236 * wplng_slug : CPT, taxo, meta
237 */
238
239 // Register wplng_translation CPT
240 add_action( 'init', 'wplng_register_post_type_slug' );
241
242 // Add metabox for wplng_slug
243 add_action( 'add_meta_boxes_wplng_slug', 'wplng_slug_add_meta_box' );
244
245 // Save metabox on posts saving
246 add_action( 'save_post_wplng_slug', 'wplng_slug_save_meta_boxes_data', 10, 2 );
247
248 // Clear slugs cache on trash / untrash
249 add_action( 'trashed_post', 'wplng_clear_slugs_cache_trash_untrash' );
250 add_action( 'untrash_post', 'wplng_clear_slugs_cache_trash_untrash' );
251 add_action( 'delete_post', 'wplng_clear_slugs_cache_trash_untrash' );
252
253 // Enqueue Script for wplng_slug admin: Edit
254 add_action( 'admin_print_scripts-post.php', 'wplng_slug_edit_assets' );
255
256 // Enqueue Script for wplng_slug admin: List
257 add_action( 'admin_print_scripts-edit.php', 'wplng_slug_list_assets' );
258
259 // Only show slugs for the website languages
260 add_action( 'pre_get_posts', 'wplng_filter_wplng_slug_posts' );
261
262 // Remove Quick edit from slugs list
263 add_filter( 'post_row_actions', 'wplng_slug_remove_quick_edit', 10, 2 );
264
265 // Ajax function for regenerate slug on edit page
266 add_action( 'wp_ajax_wplng_ajax_slug', 'wplng_ajax_generate_slug' );
267
268 // Display 100 translation in admin area by default
269 add_filter( 'get_user_option_edit_wplng_slug_per_page', 'wplng_slug_per_page' );
270
271 // Filter slugs by status
272 add_action( 'restrict_manage_posts', 'wplng_restrict_manage_posts_slug_status' );
273 add_filter( 'parse_query', 'wplng_posts_filter_slug_status' );
274
275 // Translation status on website slugs list
276 add_filter( 'post_class', 'wplng_post_class_slug_status', 10, 3 );
277 add_filter( 'post_row_actions', 'wplng_post_row_actions_slug_status', 10, 2 );
278 add_filter( 'manage_wplng_slug_posts_columns', 'wplng_slug_status_columns' );
279 add_action( 'manage_wplng_slug_posts_custom_column', 'wplng_slug_status_item', 10, 2 );
280
281 /**
282 * Front
283 */
284
285 // Enqueue CSS and JS files
286 add_action( 'wp_enqueue_scripts', 'wplng_register_assets' );
287
288 // Script JS in page
289 add_action( 'wp_footer', 'wplng_on_page_script' );
290
291 // Add languages switcher before </body>
292 add_action( 'wp_footer', 'wplng_switcher_wp_footer' );
293
294 // Add languages switcher in nav menu
295 add_filter( 'wp_nav_menu_objects', 'wplng_switcher_nav_menu_replace_items' );
296 add_filter( 'nav_menu_link_attributes', 'wplng_add_nav_menu_link_attributes_atts', 10, 2 );
297
298 // Set alternate links with hreflang parametters
299 add_action( 'wp_head', 'wplng_link_alternate_hreflang', 1 );
300
301 // Disable web browser automatic translation
302 add_action( 'language_attributes', 'wplng_disable_web_browser_auto_translate' );
303
304 /**
305 * OB and REQUEST_URI
306 */
307
308 // Manage URL with REQUEST_URI and start OB
309 add_action( 'init', 'wplng_ob_start', 1 );
310
311 // Redirect page if is called with an untranslate slug
312 add_action( 'template_redirect', 'wplng_redirect_translated_slug' );
313
314 /**
315 * Features
316 */
317
318 // Search from translated languages
319 if ( ! empty( get_option( 'wplng_translate_search' ) )
320 && wplng_api_feature_is_allow( 'search' )
321 ) {
322 add_action( 'parse_query', 'wplng_translate_search_query' );
323 } else {
324 add_filter( 'wplng_url_is_translatable', 'wplng_exclude_search', 20 );
325 }
326
327 // Redirect by browser language
328 $browser_language_redirect = get_option( 'wplng_browser_language_redirect' );
329 if ( $browser_language_redirect === 'js_only' ) {
330 add_action( 'wp_head', 'wplng_browser_language_redirect_js_only', 2 );
331 } elseif ( $browser_language_redirect === 'php_js' ) {
332 add_action( 'template_redirect', 'wplng_browser_language_redirect_php_js' );
333 }
334
335 /**
336 * Shortcode
337 */
338
339 add_shortcode( 'wplng_switcher', 'wplng_shortcode_switcher' );
340 add_shortcode( 'wplng_notranslate', 'wplng_shortcode_notranslate' );
341 add_shortcode( 'wplng_only', 'wplng_shortcode_only' );
342
343 /**
344 * Gutenberg
345 */
346
347 add_filter( 'block_categories_all', 'wplng_block_category' );
348 add_action( 'init', 'wplng_register_block' );
349 add_action( 'enqueue_block_editor_assets', 'wplng_register_block_assets' );
350
351 }
352 }
353 wplng_start();
354