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

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