diff --git a/give.php b/give.php index 32167a132c..cd271810c4 100644 --- a/give.php +++ b/give.php @@ -246,6 +246,7 @@ final class Give Give\DonationSpam\ServiceProvider::class, Give\Settings\ServiceProvider::class, Give\FeatureFlags\OptionBasedFormEditor\ServiceProvider::class, + Give\ThirdPartySupport\ServiceProvider::class, ]; /** diff --git a/src/DonationForms/Blocks/DonationFormBlock/Controllers/BlockRenderController.php b/src/DonationForms/Blocks/DonationFormBlock/Controllers/BlockRenderController.php index 4279f412fd..8d2aa0887a 100644 --- a/src/DonationForms/Blocks/DonationFormBlock/Controllers/BlockRenderController.php +++ b/src/DonationForms/Blocks/DonationFormBlock/Controllers/BlockRenderController.php @@ -9,10 +9,12 @@ use Give\DonationForms\Models\DonationForm; use Give\Framework\EnqueueScript; use Give\Framework\Routes\RouteListener; +use Give\Helpers\Language; class BlockRenderController { /** + * @unreleased Add locale support * @since 3.2.0 include form url for new tab format. * @since 3.0.0 * @@ -38,6 +40,7 @@ public function render(array $attributes) $embedId = $blockAttributes->blockId ?? ''; + $locale = Language::getLocale(); $viewUrl = $this->getViewUrl($donationForm, $embedId); $formUrl = esc_url(add_query_arg(['p' => $blockAttributes->formId], site_url('?post_type=give_forms'))); $formViewUrl = $this->getFormViewUrl($donationForm); @@ -46,7 +49,7 @@ public function render(array $attributes) * Note: iframe-resizer uses querySelectorAll so using a data attribute makes the most sense to target. * It will also generate a dynamic ID - so when we have multiple embeds on a page there will be no conflict. */ - return "
"; + return "
"; } /** diff --git a/src/DonationForms/Blocks/DonationFormBlock/resources/app/index.tsx b/src/DonationForms/Blocks/DonationFormBlock/resources/app/index.tsx index 801becc0d9..ae179ab04b 100644 --- a/src/DonationForms/Blocks/DonationFormBlock/resources/app/index.tsx +++ b/src/DonationForms/Blocks/DonationFormBlock/resources/app/index.tsx @@ -87,8 +87,19 @@ function DonationFormBlockApp({ const roots = document.querySelectorAll('.root-data-givewp-embed'); +/** + * @unreleased Add locale support + */ roots.forEach((root) => { - const dataSrc = root.getAttribute('data-src'); + let dataSrcUrl = root.getAttribute('data-src'); + const locale = root.getAttribute('data-form-locale'); + if (locale) { + const url = new URL(dataSrcUrl); + url.searchParams.set('locale', locale); + dataSrcUrl = url.toString(); + } + + const dataSrc = dataSrcUrl; const embedId = root.getAttribute('data-givewp-embed-id'); const formFormat = root.getAttribute('data-form-format'); const openFormButton = root.getAttribute('data-open-form-button'); diff --git a/src/DonationForms/DataTransferObjects/DonationConfirmationReceiptViewRouteData.php b/src/DonationForms/DataTransferObjects/DonationConfirmationReceiptViewRouteData.php index 6f9497a3c0..43d4af9d41 100644 --- a/src/DonationForms/DataTransferObjects/DonationConfirmationReceiptViewRouteData.php +++ b/src/DonationForms/DataTransferObjects/DonationConfirmationReceiptViewRouteData.php @@ -15,7 +15,6 @@ class DonationConfirmationReceiptViewRouteData public $receiptId; /** - * * @since 3.0.0 */ public static function fromRequest(array $request): self diff --git a/src/DonationForms/DataTransferObjects/DonationFormPreviewRouteData.php b/src/DonationForms/DataTransferObjects/DonationFormPreviewRouteData.php index 52bf4b8566..dfb3867a25 100644 --- a/src/DonationForms/DataTransferObjects/DonationFormPreviewRouteData.php +++ b/src/DonationForms/DataTransferObjects/DonationFormPreviewRouteData.php @@ -28,9 +28,9 @@ class DonationFormPreviewRouteData /** * Convert data from request into DTO * - * @param array{form-id: string, form-settings: string, form-blocks: string} $request - * * @since 3.0.0 + * + * @param array{form-id: string, form-settings: string, form-blocks: string} $request */ public static function fromRequest(array $request): self { diff --git a/src/DonationForms/DataTransferObjects/DonationFormViewRouteData.php b/src/DonationForms/DataTransferObjects/DonationFormViewRouteData.php index d36f86b669..da3eac8db8 100644 --- a/src/DonationForms/DataTransferObjects/DonationFormViewRouteData.php +++ b/src/DonationForms/DataTransferObjects/DonationFormViewRouteData.php @@ -13,7 +13,6 @@ class DonationFormViewRouteData public $formId; /** - * * @since 3.0.0 */ public static function fromRequest(array $request): self diff --git a/src/DonationForms/DonationFormsAdminPage.php b/src/DonationForms/DonationFormsAdminPage.php index 7571be524e..12bdd9e2c8 100644 --- a/src/DonationForms/DonationFormsAdminPage.php +++ b/src/DonationForms/DonationFormsAdminPage.php @@ -2,7 +2,10 @@ namespace Give\DonationForms; +use Give\Helpers\Language; + /** + * @unreleased Add locale support * @since 3.15.0 */ class DonationFormsAdminPage @@ -15,6 +18,6 @@ public function addFormSubmenuLink() remove_submenu_page('edit.php?post_type=give_forms', 'post-new.php?post_type=give_forms'); add_submenu_page('edit.php?post_type=give_forms', __('Add Form', 'give'), __('Add Form', 'give'), 'edit_give_forms', - 'edit.php?post_type=give_forms&page=givewp-form-builder', '', 1); + 'edit.php?post_type=give_forms&page=givewp-form-builder&locale=' . Language::getLocale(), '', 1); } } diff --git a/src/DonationForms/ServiceProvider.php b/src/DonationForms/ServiceProvider.php index 80f81a0384..b9b630d6c0 100644 --- a/src/DonationForms/ServiceProvider.php +++ b/src/DonationForms/ServiceProvider.php @@ -6,8 +6,8 @@ use Give\DonationForms\Actions\AddHoneyPotFieldToDonationForms; use Give\DonationForms\Actions\DispatchDonateControllerDonationCreatedListeners; use Give\DonationForms\Actions\DispatchDonateControllerSubscriptionCreatedListeners; -use Give\DonationForms\Actions\ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe; use Give\DonationForms\Actions\PrintFormMetaTags; +use Give\DonationForms\Actions\ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe; use Give\DonationForms\Actions\SanitizeDonationFormPreviewRequest; use Give\DonationForms\Actions\StoreBackwardsCompatibleFormMeta; use Give\DonationForms\AsyncData\Actions\GetAsyncFormDataForListView; @@ -45,6 +45,7 @@ use Give\Framework\Migrations\MigrationsRegister; use Give\Framework\Routes\Route; use Give\Helpers\Hooks; +use Give\Helpers\Language; use Give\Log\Log; use Give\ServiceProviders\ServiceProvider as ServiceProviderInterface; @@ -247,26 +248,37 @@ private function registerRoutes() Route::post('authenticate', AuthenticationRoute::class); /** + * @unreleased Add locale support * @since 3.0.0 */ Route::get('donation-form-view', static function (array $request) { ini_set('display_errors', 0); $routeData = DonationFormViewRouteData::fromRequest($request); + if ($locale = $request['locale'] ?? '') { + Language::switchToLocale($locale); + } + return give(DonationFormViewController::class)->show($routeData); }); /** + * @unreleased Add locale support * @since 3.0.0 */ Route::get('donation-confirmation-receipt-view', static function (array $request) { ini_set('display_errors', 0); $routeData = DonationConfirmationReceiptViewRouteData::fromRequest($request); + if ($locale = $request['locale'] ?? '') { + Language::switchToLocale($locale); + } + return give(DonationConfirmationReceiptViewController::class)->show($routeData); }); /** + * @unreleased Add locale support * @since 3.0.0 */ Route::post('donation-form-view-preview', static function () { @@ -274,6 +286,10 @@ private function registerRoutes() $requestData = (new SanitizeDonationFormPreviewRequest())($_REQUEST); $routeData = DonationFormPreviewRouteData::fromRequest($requestData); + if ($locale = $requestData['locale'] ?? '') { + Language::switchToLocale($locale); + } + return give(DonationFormViewController::class)->preview($routeData); }); } diff --git a/src/DonationForms/V2/DonationFormsAdminPage.php b/src/DonationForms/V2/DonationFormsAdminPage.php index 2d33e7f278..16182f9141 100644 --- a/src/DonationForms/V2/DonationFormsAdminPage.php +++ b/src/DonationForms/V2/DonationFormsAdminPage.php @@ -5,6 +5,7 @@ use Give\DonationForms\V2\ListTable\DonationFormsListTable; use Give\FeatureFlags\OptionBasedFormEditor\OptionBasedFormEditor; use Give\Helpers\EnqueueScript; +use Give\Helpers\Language; use WP_Post; use WP_REST_Request; @@ -90,6 +91,8 @@ public function highlightAllFormsMenuItem() /** * Load scripts + * + * @unreleased Add locale support */ public function loadScripts() { @@ -107,6 +110,7 @@ public function loadScripts() 'supportedAddons' => $this->getSupportedAddons(), 'supportedGateways' => $this->getSupportedGateways(), 'isOptionBasedFormEditorEnabled' => OptionBasedFormEditor::isEnabled(), + 'locale' => Language::getLocale(), ]; EnqueueScript::make('give-admin-donation-forms', 'assets/dist/js/give-admin-donation-forms.js') diff --git a/src/DonationForms/V2/Endpoints/ListDonationForms.php b/src/DonationForms/V2/Endpoints/ListDonationForms.php index ad8004c40f..6e7cbba1eb 100644 --- a/src/DonationForms/V2/Endpoints/ListDonationForms.php +++ b/src/DonationForms/V2/Endpoints/ListDonationForms.php @@ -5,6 +5,7 @@ use Give\DonationForms\V2\ListTable\DonationFormsListTable; use Give\Framework\Database\DB; use Give\Framework\QueryBuilder\QueryBuilder; +use Give\Helpers\Language; use WP_REST_Request; use WP_REST_Response; @@ -108,6 +109,7 @@ public function registerRoute() } /** + * @unreleased Add locale support * @since 2.24.0 Change this to use the new ListTable class * * @param WP_REST_Request $request @@ -131,7 +133,8 @@ public function handleRequest(WP_REST_Request $request): WP_REST_Response foreach ($items as $i => &$item) { $item['name'] = get_the_title($item['id']); - $item['edit'] = get_edit_post_link($item['id'], 'edit'); + $item['edit'] = add_query_arg(['locale' => Language::getLocale()], + get_edit_post_link($item['id'], 'edit')); $item['permalink'] = get_permalink($item['id']); $item['v3form'] = (bool)give_get_meta($item['id'], 'formBuilderSettings'); $item['status_raw'] = $forms[$i]->status->getValue(); diff --git a/src/DonationForms/V2/ListTable/Columns/TitleColumn.php b/src/DonationForms/V2/ListTable/Columns/TitleColumn.php index 37439cf0fb..ad94d68fff 100644 --- a/src/DonationForms/V2/ListTable/Columns/TitleColumn.php +++ b/src/DonationForms/V2/ListTable/Columns/TitleColumn.php @@ -6,6 +6,7 @@ use Give\DonationForms\V2\Models\DonationForm; use Give\Framework\ListTable\ModelColumn; +use Give\Helpers\Language; /** * @since 2.24.0 @@ -38,6 +39,7 @@ public function getLabel(): string } /** + * @unreleased Add locale support * @since 3.0.0 remove html tags from title * @since 2.24.0 * @@ -49,7 +51,7 @@ public function getCellValue($model): string { return sprintf( '%s', - get_edit_post_link( $model->id ), + add_query_arg(['locale' => Language::getLocale()], get_edit_post_link($model->id)), wp_strip_all_tags($model->title) ); } diff --git a/src/DonationForms/V2/resources/components/DonationFormsListTable.tsx b/src/DonationForms/V2/resources/components/DonationFormsListTable.tsx index 38993e202f..24f295d905 100644 --- a/src/DonationForms/V2/resources/components/DonationFormsListTable.tsx +++ b/src/DonationForms/V2/resources/components/DonationFormsListTable.tsx @@ -27,6 +27,7 @@ declare global { supportedAddons: Array; supportedGateways: Array; isOptionBasedFormEditorEnabled: boolean; + locale: string; }; GiveNextGen?: { @@ -267,7 +268,10 @@ export default function DonationFormsListTable() { )} {__('Add Form', 'give')} diff --git a/src/DonationForms/resources/app/utilities/getCurrentFormUrlData.js b/src/DonationForms/resources/app/utilities/getCurrentFormUrlData.js index d06364b5cc..391c5a3421 100644 --- a/src/DonationForms/resources/app/utilities/getCurrentFormUrlData.js +++ b/src/DonationForms/resources/app/utilities/getCurrentFormUrlData.js @@ -1,7 +1,10 @@ +/** + * @unreleased Add locale support + */ export default function getCurrentFormUrlData() { - const originUrl = window.top.location.href; + const originUrl = window.top.location.href; - const isEmbed = window.frameElement !== null; + const isEmbed = window.frameElement !== null; const getEmbedId = () => { if (!isEmbed) { @@ -15,9 +18,28 @@ export default function getCurrentFormUrlData() { return window.frameElement.id; }; + const getLocale = () => { + if (!isEmbed) { + return null; + } + + if (window.frameElement.hasAttribute('data-form-locale')) { + return window.frameElement.getAttribute('data-form-locale'); + } + + let locale = ''; + if (window.frameElement.src) { + const url = new URL(window.frameElement.src); + locale = url.searchParams.get('locale') || ''; + } + + return locale; + }; + return { originUrl, isEmbed, embedId: getEmbedId(), - } -} \ No newline at end of file + locale: getLocale(), + }; +} diff --git a/src/DonationForms/resources/app/utilities/handleFormRedirect.ts b/src/DonationForms/resources/app/utilities/handleFormRedirect.ts index ed79116bf9..bc64107ab5 100644 --- a/src/DonationForms/resources/app/utilities/handleFormRedirect.ts +++ b/src/DonationForms/resources/app/utilities/handleFormRedirect.ts @@ -1,10 +1,20 @@ -import isRouteInlineRedirect from "@givewp/forms/app/utilities/isRouteInlineRedirect"; +import isRouteInlineRedirect from '@givewp/forms/app/utilities/isRouteInlineRedirect'; +import getCurrentFormUrlData from '@givewp/forms/app/utilities/getCurrentFormUrlData'; +/** + * @unreleased Add locale support + */ export default async function handleRedirect(url: string, inlineRedirectRoutes: string[]) { const redirectUrl = new URL(url); const redirectUrlParams = new URLSearchParams(redirectUrl.search); const shouldRedirectInline = isRouteInlineRedirect(redirectUrlParams, inlineRedirectRoutes); + const {locale} = getCurrentFormUrlData(); + + if (locale) { + redirectUrl.searchParams.set('locale', locale); + } + if (shouldRedirectInline) { // redirect inside iframe window.location.assign(redirectUrl); @@ -12,4 +22,4 @@ export default async function handleRedirect(url: string, inlineRedirectRoutes: // redirect outside iframe window.top.location.assign(redirectUrl); } -} \ No newline at end of file +} diff --git a/src/DonationForms/resources/app/utilities/handleFormSubmitRequest.ts b/src/DonationForms/resources/app/utilities/handleFormSubmitRequest.ts index 1d74ae4e76..fb69ef1d3a 100644 --- a/src/DonationForms/resources/app/utilities/handleFormSubmitRequest.ts +++ b/src/DonationForms/resources/app/utilities/handleFormSubmitRequest.ts @@ -14,6 +14,9 @@ import getCurrentFormUrlData from '@givewp/forms/app/utilities/getCurrentFormUrl import postFormData from '@givewp/forms/app/utilities/postFormData'; import convertValuesToFormData from '@givewp/forms/app/utilities/convertValuesToFormData'; +/** + * @unreleased Add locale support + */ export default async function handleSubmitRequest( values, setError, @@ -31,13 +34,14 @@ export default async function handleSubmitRequest( } try { - const {originUrl, isEmbed, embedId} = getCurrentFormUrlData(); + const {originUrl, isEmbed, embedId, locale} = getCurrentFormUrlData(); const formValues = { ...values, originUrl, isEmbed, embedId, + locale, }; const formData = convertValuesToFormData(formValues); @@ -80,4 +84,4 @@ export default async function handleSubmitRequest( message: error?.message ?? __('Something went wrong, please try again or contact support.', 'give'), }); } -}; \ No newline at end of file +} diff --git a/src/FormBuilder/FormBuilderRouteBuilder.php b/src/FormBuilder/FormBuilderRouteBuilder.php index 8a56eec977..0b3abe72f5 100644 --- a/src/FormBuilder/FormBuilderRouteBuilder.php +++ b/src/FormBuilder/FormBuilderRouteBuilder.php @@ -2,6 +2,8 @@ namespace Give\FormBuilder; +use Give\Helpers\Language; + class FormBuilderRouteBuilder { const SLUG = 'givewp-form-builder'; @@ -12,30 +14,39 @@ class FormBuilderRouteBuilder protected $donationFormID; /** + * @var string + */ + protected $locale; + + /** + * @unreleased Add locale support * @since 3.0.0 * * @param int|string $donationFormID */ - protected function __construct($donationFormID) + protected function __construct($donationFormID, string $locale = '') { $this->donationFormID = $donationFormID; + $this->locale = ! empty($locale) ? $locale : Language::getLocale(); } /** + * @unreleased Add locale support * @since 3.0.0 */ - public static function makeCreateFormRoute(): self + public static function makeCreateFormRoute(string $locale = ''): self { // @todo Refactor create route so as not to mix types for $donationFormID. - return new self('new'); + return new self('new', $locale); } /** + * @unreleased Add locale support * @since 3.0.0 */ - public static function makeEditFormRoute(int $donationFormID): self + public static function makeEditFormRoute(int $donationFormID, string $locale = ''): self { - return new self($donationFormID); + return new self($donationFormID, $locale); } /** @@ -47,6 +58,7 @@ public function __toString() } /** + * @unreleased Add locale support * @since 3.0.0 */ public function getUrl(): string @@ -56,6 +68,7 @@ public function getUrl(): string 'post_type' => 'give_forms', 'page' => self::SLUG, 'donationFormID' => $this->donationFormID, + 'locale' => $this->locale, ], admin_url('edit.php') ); diff --git a/src/FormBuilder/Routes/CreateFormRoute.php b/src/FormBuilder/Routes/CreateFormRoute.php index 3185de8245..93815f1d8b 100644 --- a/src/FormBuilder/Routes/CreateFormRoute.php +++ b/src/FormBuilder/Routes/CreateFormRoute.php @@ -9,6 +9,7 @@ use Give\FormBuilder\Actions\GenerateDefaultDonationFormBlockCollection; use Give\FormBuilder\FormBuilderRouteBuilder; use Give\Helpers\Hooks; +use Give\Helpers\Language; /** * Route to create a new form @@ -16,6 +17,7 @@ class CreateFormRoute { /** + * @unreleased Add locale support * @since 3.1.0 updated default form blocks to be generated from block models instead of json * @since 3.0.0 * @@ -25,12 +27,18 @@ class CreateFormRoute public function __invoke() { if (isset($_GET['page']) && FormBuilderRouteBuilder::SLUG === $_GET['page']) { + $locale = $_GET['locale'] ?? ''; + // Little hack for alpha users to make sure the form builder is loaded. if (!isset($_GET['donationFormID'])) { - wp_redirect(FormBuilderRouteBuilder::makeCreateFormRoute()); + wp_redirect(FormBuilderRouteBuilder::makeCreateFormRoute($locale)->getUrl()); exit(); } if ('new' === $_GET['donationFormID']) { + // Make sure the Form will be created using the proper locale + $locale = $_GET['locale'] ?? ''; + Language::switchToLocale($locale); + $form = new DonationForm([ 'title' => __('GiveWP Donation Form', 'give'), 'status' => DonationFormStatus::DRAFT(), @@ -45,7 +53,7 @@ public function __invoke() $form->save(); - wp_redirect(FormBuilderRouteBuilder::makeEditFormRoute($form->id)); + wp_redirect(FormBuilderRouteBuilder::makeEditFormRoute($form->id, $locale)->getUrl()); exit(); } } diff --git a/src/FormBuilder/Routes/EditFormRoute.php b/src/FormBuilder/Routes/EditFormRoute.php index 865487da65..5fbae0819c 100644 --- a/src/FormBuilder/Routes/EditFormRoute.php +++ b/src/FormBuilder/Routes/EditFormRoute.php @@ -11,6 +11,7 @@ class EditFormRoute { /** + * @unreleased Add locale support * @since 3.0.3 Use isV3Form() method instead of 'post_content' to check if the form is built with Visual Builder * @since 3.0.0 * @@ -19,12 +20,13 @@ class EditFormRoute public function __invoke() { if (isset($_GET['post'], $_GET['action']) && 'edit' === $_GET['action']) { + $locale = $_GET['locale'] ?? ''; // This conditional will be also triggered by WP edit bulk action // WP sends an array of IDs so if that is the case here, we can skip this if ( ! is_array($_GET['post'])) { $post = get_post(abs($_GET['post'])); if ('give_forms' === $post->post_type && Utils::isV3Form($post->ID)) { - wp_redirect(FormBuilderRouteBuilder::makeEditFormRoute($post->ID)); + wp_redirect(FormBuilderRouteBuilder::makeEditFormRoute($post->ID, $locale)->getUrl()); exit(); } } diff --git a/src/FormBuilder/Routes/RegisterFormBuilderPageRoute.php b/src/FormBuilder/Routes/RegisterFormBuilderPageRoute.php index b61ace3ead..7a0fb2e714 100644 --- a/src/FormBuilder/Routes/RegisterFormBuilderPageRoute.php +++ b/src/FormBuilder/Routes/RegisterFormBuilderPageRoute.php @@ -58,6 +58,7 @@ public function __invoke() /** * Render page with scripts * + * @unreleased Add locale support * @since 3.1.0 set translations for scripts * @since 3.0.0 * @@ -75,6 +76,9 @@ public function renderPage() wp_die(__('Donation form does not exist.')); } + $locale = give_clean($_GET['locale']) ?? ''; + Language::switchToLocale($locale); + wp_enqueue_style( '@givewp/form-builder/registrars', GIVE_PLUGIN_URL . 'build/formBuilderRegistrars.css' diff --git a/src/FormBuilder/resources/js/form-builder/src/common/storage/drivers/rest-api.ts b/src/FormBuilder/resources/js/form-builder/src/common/storage/drivers/rest-api.ts index 58b5cca5c5..57d61fdf7e 100644 --- a/src/FormBuilder/resources/js/form-builder/src/common/storage/drivers/rest-api.ts +++ b/src/FormBuilder/resources/js/form-builder/src/common/storage/drivers/rest-api.ts @@ -1,11 +1,22 @@ import {__} from '@wordpress/i18n'; -import {StorageDriver} from "@givewp/form-builder/common/storage/interface"; +import {StorageDriver} from '@givewp/form-builder/common/storage/interface'; // @ts-ignore const storageData = window.giveStorageData; // @ts-ignore const jQuery = window.jQuery; +/** + * @unreleased + */ +const addLocaleToUrl = (url: string) => { + const urlParams = new URLSearchParams(window.location.search); + const locale = urlParams.get('locale'); + const newUrl = new URL(url); + newUrl.searchParams.set('locale', locale); + return newUrl.toString(); +}; + const restApiStorageDriver: StorageDriver = { save: ({blocks, formSettings}) => { return new Promise((resolve, reject) => { @@ -49,7 +60,7 @@ const restApiStorageDriver: StorageDriver = { return new Promise((resolve, reject) => { jQuery .post({ - url: storageData.previewURL, + url: addLocaleToUrl(storageData.previewURL), headers: { 'X-WP-Nonce': storageData.nonce, }, diff --git a/src/Framework/Routes/Router.php b/src/Framework/Routes/Router.php index 52a85ae9e1..22bc03d97d 100644 --- a/src/Framework/Routes/Router.php +++ b/src/Framework/Routes/Router.php @@ -3,6 +3,7 @@ namespace Give\Framework\Routes; use Give\Framework\Exceptions\Primitives\InvalidArgumentException; +use Give\Helpers\Language; use function is_callable; use function str_contains; @@ -89,6 +90,7 @@ protected function getDataFromGetRequest(): array } /** + * @unreleased Add locale support * @since 3.0.0 * * @param string $type @@ -107,6 +109,7 @@ protected function addRoute(string $type, string $method, string $uri, $action) } $request = $this->getRequestDataByType($type); + $request['locale'] = ! empty($request['locale']) ? $request['locale'] : Language::getLocale(); if (is_callable($action)) { return $action($request); diff --git a/src/Helpers/Language.php b/src/Helpers/Language.php index d98f4329b1..d881e746e4 100644 --- a/src/Helpers/Language.php +++ b/src/Helpers/Language.php @@ -52,4 +52,24 @@ public static function getRelativePath(): string return trailingslashit($giveRelativePath); } + + /** + * @unreleased + */ + public static function getLocale() + { + return apply_filters('givewp_locale', get_locale()); + } + + /** + * @unreleased + */ + public static function switchToLocale(string $locale) + { + if (empty($locale) || $locale == get_locale()) { + return; + } + + switch_to_locale($locale); + } } diff --git a/src/ThirdPartySupport/Polylang/Helpers/Polylang.php b/src/ThirdPartySupport/Polylang/Helpers/Polylang.php new file mode 100644 index 0000000000..465d072bee --- /dev/null +++ b/src/ThirdPartySupport/Polylang/Helpers/Polylang.php @@ -0,0 +1,26 @@ +model->get_language($pllCurrentLangCode); + + $locale = $pllCurrentLang && $pllCurrentLang->locale != $locale ? $pllCurrentLang->locale : $locale; + } + + return $locale; + } +} diff --git a/src/ThirdPartySupport/ServiceProvider.php b/src/ThirdPartySupport/ServiceProvider.php new file mode 100644 index 0000000000..eee8aaa3e2 --- /dev/null +++ b/src/ThirdPartySupport/ServiceProvider.php @@ -0,0 +1,48 @@ +get_requested_lang(); + $wpmlLocale = $sitepress->get_locale($requestedLang); + $locale = $wpmlLocale != $locale ? $wpmlLocale : $locale; + } + + return $locale; + } +} diff --git a/tests/Unit/DonationForms/Endpoints/TestListDonationForms.php b/tests/Unit/DonationForms/Endpoints/TestListDonationForms.php index e1c3e509b1..bee7d21d2b 100644 --- a/tests/Unit/DonationForms/Endpoints/TestListDonationForms.php +++ b/tests/Unit/DonationForms/Endpoints/TestListDonationForms.php @@ -5,6 +5,7 @@ use Exception; use Give\DonationForms\V2\Endpoints\ListDonationForms; use Give\DonationForms\V2\ListTable\DonationFormsListTable; +use Give\Helpers\Language; use Give\Tests\TestCase; use Give\Tests\TestTraits\RefreshDatabase; use Give\Tests\Unit\DonationForms\TestTraits\LegacyDonationFormAdapter; @@ -109,7 +110,8 @@ public function getMockColumns(array $donationForms, string $sortDirection = 'de $expectedItem[$column::getId()] = $column->getCellValue($donationForm); } $expectedItem['name'] = $donationForm->title; - $expectedItem['edit'] = get_edit_post_link($donationForm->id, 'edit'); + $expectedItem['edit'] = add_query_arg(['locale' => Language::getLocale()], + get_edit_post_link($donationForm->id, 'edit')); $expectedItem['permalink'] = get_permalink($donationForm->id); $expectedItem['v3form'] = false;