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

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