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

335 lines 11.9 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.7.2
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.7.2' );
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: Edit
193 add_action( 'admin_print_scripts-post.php', 'wplng_translation_edit_assets' );
194
195 // Enqueue Script for wplng_translation admin: List
196 add_action( 'admin_print_scripts-edit.php', 'wplng_translation_list_assets' );
197
198 // Remove Quick edit from translations list
199 add_filter( 'post_row_actions', 'wplng_translation_remove_quick_edit', 10, 2 );
200
201 // Ajax function for regenerate translation on edit page
202 add_action( 'wp_ajax_wplng_ajax_translation', 'wplng_ajax_generate_translation' );
203
204 // Ajax function for edit modal: Get HTML modal
205 add_action( 'wp_ajax_wplng_ajax_edit_modal', 'wplng_ajax_edit_modal' );
206
207 // Ajax function for edit modal: Save modal
208 add_action( 'wp_ajax_wplng_ajax_save_modal', 'wplng_ajax_save_modal' );
209
210 // Ajax function for edit modal: HeartBeat
211 add_action( 'wp_ajax_wplng_ajax_heartbeat', 'wplng_ajax_heartbeat' );
212 add_action( 'wp_ajax_nopriv_wplng_ajax_heartbeat', 'wplng_ajax_heartbeat' );
213
214 // Display 100 translation in admin area by default
215 add_filter( 'get_user_option_edit_wplng_translation_per_page', 'wplng_translation_per_page' );
216
217 // Filter translations by status
218 add_action( 'restrict_manage_posts', 'wplng_restrict_manage_posts_translation_status' );
219 add_filter( 'parse_query', 'wplng_posts_filter_translation_status' );
220
221 // Translation status on website translations list
222 add_filter( 'post_class', 'wplng_post_class_translation_status', 10, 3 );
223 add_filter( 'post_row_actions', 'wplng_post_row_actions_translation_status', 10, 2 );
224 add_filter( 'manage_wplng_translation_posts_columns', 'wplng_translation_status_columns' );
225 add_action( 'manage_wplng_translation_posts_custom_column', 'wplng_translation_status_item', 10, 2 );
226
227 /**
228 * wplng_slug : CPT, taxo, meta
229 */
230
231 // Register wplng_translation CPT
232 add_action( 'init', 'wplng_register_post_type_slug' );
233
234 // Add metabox for wplng_slug
235 add_action( 'add_meta_boxes_wplng_slug', 'wplng_slug_add_meta_box' );
236
237 // Save metabox on posts saving
238 add_action( 'save_post_wplng_slug', 'wplng_slug_save_meta_boxes_data', 10, 2 );
239
240 // Clear slugs cache on trash / untrash
241 add_action( 'trashed_post', 'wplng_clear_slugs_cache_trash_untrash' );
242 add_action( 'untrash_post', 'wplng_clear_slugs_cache_trash_untrash' );
243 add_action( 'delete_post', 'wplng_clear_slugs_cache_trash_untrash' );
244
245 // Enqueue Script for wplng_slug admin: Edit
246 add_action( 'admin_print_scripts-post.php', 'wplng_slug_edit_assets' );
247
248 // Enqueue Script for wplng_slug admin: List
249 add_action( 'admin_print_scripts-edit.php', 'wplng_slug_list_assets' );
250
251 // Remove Quick edit from slugs list
252 add_filter( 'post_row_actions', 'wplng_slug_remove_quick_edit', 10, 2 );
253
254 // Ajax function for regenerate slug on edit page
255 add_action( 'wp_ajax_wplng_ajax_slug', 'wplng_ajax_generate_slug' );
256
257 // Display 100 translation in admin area by default
258 add_filter( 'get_user_option_edit_wplng_slug_per_page', 'wplng_slug_per_page' );
259
260 // Filter slugs by status
261 add_action( 'restrict_manage_posts', 'wplng_restrict_manage_posts_slug_status' );
262 add_filter( 'parse_query', 'wplng_posts_filter_slug_status' );
263
264 // Translation status on website slugs list
265 add_filter( 'post_class', 'wplng_post_class_slug_status', 10, 3 );
266 add_filter( 'post_row_actions', 'wplng_post_row_actions_slug_status', 10, 2 );
267 add_filter( 'manage_wplng_slug_posts_columns', 'wplng_slug_status_columns' );
268 add_action( 'manage_wplng_slug_posts_custom_column', 'wplng_slug_status_item', 10, 2 );
269
270 /**
271 * Front
272 */
273
274 // Enqueue CSS and JS files
275 add_action( 'wp_enqueue_scripts', 'wplng_register_assets' );
276
277 // Script JS in page
278 add_action( 'wp_footer', 'wplng_on_page_script' );
279
280 // Add languages switcher before </body>
281 add_action( 'wp_footer', 'wplng_switcher_wp_footer' );
282
283 // Add languages switcher in nav menu
284 add_filter( 'wp_nav_menu_objects', 'wplng_switcher_nav_menu_replace_items' );
285 add_filter( 'nav_menu_link_attributes', 'wplng_add_nav_menu_link_attributes_atts', 10, 2 );
286
287 // Set alternate links with hreflang parametters
288 add_action( 'wp_head', 'wplng_link_alternate_hreflang', 1 );
289
290 // Disable web browser automatic translation
291 add_action( 'language_attributes', 'wplng_disable_web_browser_auto_translate' );
292
293 /**
294 * OB and REQUEST_URI
295 */
296
297 // Manage URL with REQUEST_URI and start OB
298 add_action( 'init', 'wplng_ob_start', 1 );
299
300 // Redirect page if is called with an untranslate slug
301 add_action( 'template_redirect', 'wplng_redirect_translated_slug' );
302
303 /**
304 * Features
305 */
306
307 // Search from translated languages
308 if ( ! empty( get_option( 'wplng_translate_search' ) )
309 && wplng_api_feature_is_allow( 'search' )
310 ) {
311 add_action( 'parse_query', 'wplng_translate_search_query' );
312 } else {
313 add_filter( 'wplng_url_is_translatable', 'wplng_exclude_search', 20 );
314 }
315
316 /**
317 * Shortcode
318 */
319
320 add_shortcode( 'wplng_switcher', 'wplng_shortcode_switcher' );
321 add_shortcode( 'wplng_notranslate', 'wplng_shortcode_notranslate' );
322 add_shortcode( 'wplng_only', 'wplng_shortcode_only' );
323
324 /**
325 * Gutenberg
326 */
327
328 add_filter( 'block_categories_all', 'wplng_block_category' );
329 add_action( 'init', 'wplng_register_block' );
330 add_action( 'enqueue_block_editor_assets', 'wplng_register_block_assets' );
331
332 }
333 }
334 wplng_start();
335