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;