diff --git a/gooddata-sdk/gooddata_sdk/catalog/workspace/service.py b/gooddata-sdk/gooddata_sdk/catalog/workspace/service.py
index b4f5e81cd..c69473319 100644
--- a/gooddata-sdk/gooddata_sdk/catalog/workspace/service.py
+++ b/gooddata-sdk/gooddata_sdk/catalog/workspace/service.py
@@ -922,7 +922,7 @@ def add_metadata_locale(
Args:
workspace_id (str): The ID of the workspace.
target_language (str): The target language for the metadata localization.
- translator_func (Optional[Callable]): A function to translate the source text.
+ translator_func (Callable): A function to translate the source text.
set_locale (bool): Flag to indicate if the locale settings should be updated in the workspace.
Returns:
diff --git a/gooddata-sdk/tests/catalog/fixtures/workspaces/add_metadata_locale.yaml b/gooddata-sdk/tests/catalog/fixtures/workspaces/add_metadata_locale.yaml
new file mode 100644
index 000000000..b826faa4f
--- /dev/null
+++ b/gooddata-sdk/tests/catalog/fixtures/workspaces/add_metadata_locale.yaml
@@ -0,0 +1,2478 @@
+# (C) 2024 GoodData Corporation
+version: 1
+interactions:
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/clean
+ body:
+ locale: fr-FR
+ headers:
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: &id001
+ - PLACEHOLDER
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/set
+ body: '
+
+ Campaign.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Campaign Spend.Revenue per $ vs Spend
+ by Campaign.Spend breakdown and Revenue.The first insight shows a breakdown of spend
+ by category and campaign. The second shows revenue per $ spend, for each campaign,
+ to demonstrate, how campaigns are successful..Dashboard plugin.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.DHO simple.Product & Category.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Top 10 Products.Revenue Trend.Customers Trend.Product Categories Pie Chart.Product Breakdown.Product Saleability.% Revenue
+ per Product by Customer and Category.Campaign channel id.Campaign channel id.Campaign channels.Category.Category.Campaign
+ channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.Order id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.State.State.Customers.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic
+ Week (W1-W53).Date.Date - Month of Year.Generic Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channels.Campaign
+ channels.Campaign channels.Campaigns.Campaigns.Campaigns.Customers.Customers.Customers.Order lines.Order lines.Order lines.Products.Products.Products.Date.Date.Budget.Budget.Campaign
+ channels.Spend.Spend.Campaign
+ channels.Price.Price.Order lines.Quantity.Quantity.Order
+ lines.Order
+ id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter
+ and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic
+ Week (W1-W53).Date.Date - Month of Year.Generic
+ Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channel id.Campaign channel id.Campaign channels.Category.Category.Campaign
+ channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.State.State.Customers.Location.Location.Customers.Revenue per Dollar Spent.Revenue / Top 10.Revenue / Top 10%.Total Revenue.Total Revenue (No Filters).# of Orders.# of Top Customers.# of Valid Orders.Campaign Spend.Order Amount.% Revenue.% Revenue from Top 10 Customers.% Revenue from Top 10% Customers.% Revenue from Top 10% Products.# of Active Customers.% Revenue from Top 10 Products.% Revenue in Category.% Revenue per Product.Revenue.Revenue (Clothing).Revenue (Electronic).Revenue (Home).Revenue (Outdoor).Revenue per Customer.% Revenue per
+ Product by Customer and Category.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.% Revenue per Product.Revenue.Campaign Spend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Campaign Spend.Customers Trend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.# of Active Customers.Revenue per Customer.Active Customers.Percentage of Customers by Region.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.# of Active Customers.Product Breakdown.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Product Categories Pie Chart.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.% Revenue.Product Revenue
+ Comparison (over previous period).Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Revenue.Previous Period.This Period.Product Saleability.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.# of Orders.Revenue.Number of Orders.Revenue and Quantity
+ by Product and Category.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Sum of Quantity.Avg Price.% Revenue in Category.Revenue.Items Sold.Total Revenue.Revenue by Category Trend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Revenue.Revenue by Product.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Revenue per $ vs Spend by Campaign.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Campaign Spend.Revenue per Dollar Spent.Revenue Trend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Revenue.# of Orders.Number of Orders.Top 10 Customers.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.Top 10 Products.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.filterContext.filterContext.'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '56610'
+ Content-Type:
+ - application/xml
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '56630'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Campaign.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Campaign Spend.Revenue per $ vs Spend by Campaign.Spend breakdown and Revenue.The first insight shows a breakdown of spend
+ by category and campaign. The second shows revenue per $ spend, for each
+ campaign, to demonstrate, how campaigns are successful..Dashboard plugin.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.DHO simple.Product & Category.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Top 10 Products.Revenue Trend.Customers Trend.Product Categories Pie Chart.Product Breakdown.Product Saleability.% Revenue per
+ Product by Customer and Category.Campaign channel id.Campaign channel id.Campaign
+ channels.Category.Category.Campaign channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.Order id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.State.State.Customers.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic Week (W1-W53).Date.Date - Month of Year.Generic Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channels.Campaign
+ channels.Campaign channels.Campaigns.Campaigns.Campaigns.Customers.Customers.Customers.Order lines.Order lines.Order lines.Products.Products.Products.Date.Date.Budget.Budget.Campaign
+ channels.Spend.Spend.Campaign
+ channels.Price.Price.Order
+ lines.Quantity.Quantity.Order
+ lines.Order id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter
+ and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic
+ Week (W1-W53).Date.Date - Month of Year.Generic
+ Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channel id.Campaign channel id.Campaign channels.Category.Category.Campaign
+ channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.State.State.Customers.Location.Location.Customers.Revenue per Dollar Spent.Revenue / Top 10.Revenue / Top 10%.Total Revenue.Total Revenue (No Filters).# of Orders.# of Top Customers.# of Valid Orders.Campaign Spend.Order Amount.% Revenue.% Revenue from Top 10 Customers.% Revenue from Top 10% Customers.% Revenue from Top 10% Products.# of Active Customers.% Revenue from Top 10 Products.% Revenue in Category.% Revenue per Product.Revenue.Revenue (Clothing).Revenue (Electronic).Revenue (Home).Revenue (Outdoor).Revenue per Customer.% Revenue per
+ Product by Customer and Category.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.% Revenue per Product.Revenue.Campaign Spend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Campaign Spend.Customers Trend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.# of Active Customers.Revenue per Customer.Active Customers.Percentage of Customers by Region.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.# of Active Customers.Product Breakdown.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Product Categories Pie Chart.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.% Revenue.Product Revenue
+ Comparison (over previous period).Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Revenue.Previous Period.This Period.Product Saleability.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.# of Orders.Revenue.Number of Orders.Revenue and Quantity
+ by Product and Category.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Sum of Quantity.Avg Price.% Revenue in Category.Revenue.Items Sold.Total Revenue.Revenue by Category Trend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Revenue.Revenue by Product.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Revenue per $ vs Spend by Campaign.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Campaign Spend.Revenue per Dollar Spent.Revenue Trend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Revenue.# of Orders.Number of Orders.Top 10 Customers.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.Top 10 Products.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.filterContext.filterContext.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/clean
+ body:
+ locale: fr-FR
+ headers:
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
diff --git a/gooddata-sdk/tests/catalog/fixtures/workspaces/clean_metadata_locale.yaml b/gooddata-sdk/tests/catalog/fixtures/workspaces/clean_metadata_locale.yaml
new file mode 100644
index 000000000..948427aab
--- /dev/null
+++ b/gooddata-sdk/tests/catalog/fixtures/workspaces/clean_metadata_locale.yaml
@@ -0,0 +1,3022 @@
+# (C) 2024 GoodData Corporation
+version: 1
+interactions:
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/clean
+ body:
+ locale: fr-FR
+ headers:
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: &id001
+ - PLACEHOLDER
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/set
+ body: '
+
+ Campaign.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Campaign Spend.Revenue per $ vs Spend
+ by Campaign.Spend breakdown and Revenue.The first insight shows a breakdown of spend
+ by category and campaign. The second shows revenue per $ spend, for each campaign,
+ to demonstrate, how campaigns are successful..Dashboard plugin.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.DHO simple.Product & Category.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Top 10 Products.Revenue Trend.Customers Trend.Product Categories Pie Chart.Product Breakdown.Product Saleability.% Revenue
+ per Product by Customer and Category.Campaign channel id.Campaign channel id.Campaign channels.Category.Category.Campaign
+ channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.Order id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.State.State.Customers.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic
+ Week (W1-W53).Date.Date - Month of Year.Generic Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channels.Campaign
+ channels.Campaign channels.Campaigns.Campaigns.Campaigns.Customers.Customers.Customers.Order lines.Order lines.Order lines.Products.Products.Products.Date.Date.Budget.Budget.Campaign
+ channels.Spend.Spend.Campaign
+ channels.Price.Price.Order lines.Quantity.Quantity.Order
+ lines.Order
+ id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter
+ and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic
+ Week (W1-W53).Date.Date - Month of Year.Generic
+ Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channel id.Campaign channel id.Campaign channels.Category.Category.Campaign
+ channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.State.State.Customers.Location.Location.Customers.Revenue per Dollar Spent.Revenue / Top 10.Revenue / Top 10%.Total Revenue.Total Revenue (No Filters).# of Orders.# of Top Customers.# of Valid Orders.Campaign Spend.Order Amount.% Revenue.% Revenue from Top 10 Customers.% Revenue from Top 10% Customers.% Revenue from Top 10% Products.# of Active Customers.% Revenue from Top 10 Products.% Revenue in Category.% Revenue per Product.Revenue.Revenue (Clothing).Revenue (Electronic).Revenue (Home).Revenue (Outdoor).Revenue per Customer.% Revenue per
+ Product by Customer and Category.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.% Revenue per Product.Revenue.Campaign Spend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Campaign Spend.Customers Trend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.# of Active Customers.Revenue per Customer.Active Customers.Percentage of Customers by Region.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.# of Active Customers.Product Breakdown.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Product Categories Pie Chart.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.% Revenue.Product Revenue
+ Comparison (over previous period).Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Revenue.Previous Period.This Period.Product Saleability.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.# of Orders.Revenue.Number of Orders.Revenue and Quantity
+ by Product and Category.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Sum of Quantity.Avg Price.% Revenue in Category.Revenue.Items Sold.Total Revenue.Revenue by Category Trend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Revenue.Revenue by Product.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Revenue per $ vs Spend by Campaign.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Campaign Spend.Revenue per Dollar Spent.Revenue Trend.Free-form translations are marked by the ''id'' attribute,
+ which is a hash combining the JSON path and the source text''s value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Revenue.# of Orders.Number of Orders.Top 10 Customers.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.Top 10 Products.Free-form
+ translations are marked by the ''id'' attribute, which is a hash combining
+ the JSON path and the source text''s value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.filterContext.filterContext.'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '56610'
+ Content-Type:
+ - application/xml
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '56630'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Campaign.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Campaign Spend.Revenue per $ vs Spend by Campaign.Spend breakdown and Revenue.The first insight shows a breakdown of spend
+ by category and campaign. The second shows revenue per $ spend, for each
+ campaign, to demonstrate, how campaigns are successful..Dashboard plugin.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.DHO simple.Product & Category.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Top 10 Products.Revenue Trend.Customers Trend.Product Categories Pie Chart.Product Breakdown.Product Saleability.% Revenue per
+ Product by Customer and Category.Campaign channel id.Campaign channel id.Campaign
+ channels.Category.Category.Campaign channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.Order id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.State.State.Customers.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic Week (W1-W53).Date.Date - Month of Year.Generic Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channels.Campaign
+ channels.Campaign channels.Campaigns.Campaigns.Campaigns.Customers.Customers.Customers.Order lines.Order lines.Order lines.Products.Products.Products.Date.Date.Budget.Budget.Campaign
+ channels.Spend.Spend.Campaign
+ channels.Price.Price.Order
+ lines.Quantity.Quantity.Order
+ lines.Order id.Order id.Order lines.Order line id.Order line id.Order lines.Order status.Order status.Order lines.Product id.Product id.Products.Product name.Product name.Products.Category.Category.Products.Date - Minute.Minute.Date.Date - Hour.Hour.Date.Date - Date.Date.Date.Date - Week/Year.Week
+ and Year (W52/2020).Date.Date - Month/Year.Month
+ and Year (12/2020).Date.Date - Quarter/Year.Quarter
+ and Year (Q1/2020).Date.Date - Year.Year.Date.Date - Minute of Hour.Generic Minute of the Hour(MI1-MI60).Date.Date - Hour of Day.Generic Hour of the Day(H1-H24).Date.Date - Day of Week.Generic Day of the Week (D1-D7).Date.Date - Day of Month.Generic Day of the Month (D1-D31).Date.Date - Day of Year.Generic Day of the Year (D1-D366).Date.Date - Week of Year.Generic
+ Week (W1-W53).Date.Date - Month of Year.Generic
+ Month (M1-M12).Date.Date - Quarter of Year.Generic Quarter (Q1-Q4).Date.Campaign channel id.Campaign channel id.Campaign channels.Category.Category.Campaign
+ channels.Type.Type.Campaign
+ channels.Campaign
+ id.Campaign id.Campaigns.Campaign name.Campaign name.Campaigns.Customer id.Customer id.Customers.Customer name.Customer name.Customers.Region.Region.Customers.State.State.Customers.Location.Location.Customers.Revenue per Dollar Spent.Revenue / Top 10.Revenue / Top 10%.Total Revenue.Total Revenue (No Filters).# of Orders.# of Top Customers.# of Valid Orders.Campaign Spend.Order Amount.% Revenue.% Revenue from Top 10 Customers.% Revenue from Top 10% Customers.% Revenue from Top 10% Products.# of Active Customers.% Revenue from Top 10 Products.% Revenue in Category.% Revenue per Product.Revenue.Revenue (Clothing).Revenue (Electronic).Revenue (Home).Revenue (Outdoor).Revenue per Customer.% Revenue per
+ Product by Customer and Category.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.% Revenue per Product.Revenue.Campaign Spend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Campaign Spend.Customers Trend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.# of Active Customers.Revenue per Customer.Active Customers.Percentage of Customers by Region.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.# of Active Customers.Product Breakdown.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Product Categories Pie Chart.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.% Revenue.Product Revenue
+ Comparison (over previous period).Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Revenue.Previous Period.This Period.Product Saleability.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.# of Orders.Revenue.Number of Orders.Revenue and Quantity
+ by Product and Category.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Sum of Quantity.Avg Price.% Revenue in Category.Revenue.Items Sold.Total Revenue.Revenue by Category Trend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Revenue.Revenue by Product.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue.Revenue per $ vs Spend by Campaign.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Campaign Spend.Revenue per Dollar Spent.Revenue Trend.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Revenue.# of Orders.Number of Orders.Top 10 Customers.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.Top 10 Products.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Revenue / Top 10.filterContext.filterContext.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/clean
+ body:
+ locale: fr-FR
+ headers:
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
diff --git a/gooddata-sdk/tests/catalog/fixtures/workspaces/get_metadata_localization.yaml b/gooddata-sdk/tests/catalog/fixtures/workspaces/get_metadata_localization.yaml
new file mode 100644
index 000000000..d7299c769
--- /dev/null
+++ b/gooddata-sdk/tests/catalog/fixtures/workspaces/get_metadata_localization.yaml
@@ -0,0 +1,548 @@
+# (C) 2024 GoodData Corporation
+version: 1
+interactions:
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: &id001
+ - PLACEHOLDER
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
diff --git a/gooddata-sdk/tests/catalog/fixtures/workspaces/set_metadata_localization.yaml b/gooddata-sdk/tests/catalog/fixtures/workspaces/set_metadata_localization.yaml
new file mode 100644
index 000000000..36ff5c26a
--- /dev/null
+++ b/gooddata-sdk/tests/catalog/fixtures/workspaces/set_metadata_localization.yaml
@@ -0,0 +1,1085 @@
+# (C) 2024 GoodData Corporation
+version: 1
+interactions:
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/retrieve
+ body:
+ locale: fr-FR
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - br, gzip, deflate
+ Content-Type:
+ - application/json
+ X-GDC-VALIDATE-RELATIONS:
+ - 'true'
+ X-Requested-With:
+ - XMLHttpRequest
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ Content-Type:
+ - application/xml
+ DATE: &id001
+ - PLACEHOLDER
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about
+ its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining
+ the JSON path and the source text's value. Since this hash is hard to read,
+ the source text includes extra details about its general location.
+ - request:
+ method: POST
+ uri: http://localhost:3000/api/v1/actions/workspaces/demo/translations/set
+ body: Free-form
+ translations are marked by the 'id' attribute, which is a hash combining the
+ JSON path and the source text's value. Since this hash is hard to read, the
+ source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining the
+ JSON path and the source text's value. Since this hash is hard to read, the
+ source text includes extra details about its general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form translations are marked by the 'id' attribute,
+ which is a hash combining the JSON path and the source text's value. Since
+ this hash is hard to read, the source text includes extra details about its
+ general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining the
+ JSON path and the source text's value. Since this hash is hard to read, the
+ source text includes extra details about its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining the
+ JSON path and the source text's value. Since this hash is hard to read, the
+ source text includes extra details about its general location.Free-form
+ translations are marked by the 'id' attribute, which is a hash combining the
+ JSON path and the source text's value. Since this hash is hard to read, the
+ source text includes extra details about its general location.
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '47036'
+ Content-Type:
+ - application/xml
+ response:
+ status:
+ code: 204
+ message: No Content
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Expose-Headers:
+ - Content-Disposition, Content-Length, Content-Range, Set-Cookie
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Connection:
+ - keep-alive
+ Content-Security-Policy:
+ - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline''
+ ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com
+ src.litix.io matomo.anywhere.gooddata.com *.jquery.com unpkg.com cdnjs.cloudflare.com;
+ img-src * data: blob:; style-src ''self'' ''unsafe-inline'' fonts.googleapis.com
+ cdn.jsdelivr.net fast.fonts.net; font-src ''self'' data: fonts.gstatic.com
+ *.alicdn.com *.wistia.com cdn.jsdelivr.net info.gooddata.com; frame-src
+ ''self'' *.hsforms.net *.hsforms.com; object-src ''none''; worker-src
+ ''self'' blob:; child-src blob:; connect-src ''self'' *.tiles.mapbox.com
+ *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net
+ matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com
+ *.wistia.net embedwistia-a.akamaihd.net'
+ DATE: *id001
+ Expires:
+ - '0'
+ GoodData-Deployment:
+ - aio
+ Permission-Policy:
+ - geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera
+ 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'none'; payment
+ 'none';
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Server:
+ - nginx
+ Set-Cookie:
+ - SPRING_REDIRECT_URI=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00
+ GMT; HttpOnly; SameSite=Lax
+ Vary:
+ - Origin
+ - Access-Control-Request-Method
+ - Access-Control-Request-Headers
+ X-Content-Type-Options:
+ - nosniff
+ X-GDC-TRACE-ID: *id001
+ X-XSS-Protection:
+ - 1 ; mode=block
+ body:
+ string: ''
diff --git a/gooddata-sdk/tests/catalog/test_catalog_workspace.py b/gooddata-sdk/tests/catalog/test_catalog_workspace.py
index cda94c720..71a054e7b 100644
--- a/gooddata-sdk/tests/catalog/test_catalog_workspace.py
+++ b/gooddata-sdk/tests/catalog/test_catalog_workspace.py
@@ -4,6 +4,7 @@
import json
from pathlib import Path
from typing import List
+from xml.etree import ElementTree as ET
import yaml
from gooddata_sdk import (
@@ -840,3 +841,82 @@ def test_update_workspace_setting(test_config):
finally:
sdk.catalog_workspace.delete_workspace_setting(test_config["workspace"], setting_id)
assert len(sdk.catalog_workspace.list_workspace_settings(test_config["workspace"])) == 0
+
+
+@gd_vcr.use_cassette(str(_fixtures_dir / "get_metadata_localization.yaml"))
+def test_get_metadata_localization(test_config):
+ sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"])
+ test_workspace = test_config["workspace"]
+ xliff = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ tree = ET.ElementTree(ET.fromstring(xliff))
+
+ # Check, if the returned xliff is valid.
+ assert tree is not None
+
+
+@gd_vcr.use_cassette(str(_fixtures_dir / "set_metadata_localization.yaml"))
+def test_set_metadata_localization(test_config):
+ sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"])
+ test_workspace = test_config["workspace"]
+ xliff = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ sdk.catalog_workspace.set_metadata_localization(workspace_id=test_workspace, encoded_xml=xliff)
+
+
+@gd_vcr.use_cassette(str(_fixtures_dir / "add_metadata_locale.yaml"))
+def test_add_metadata_locale(test_config):
+ sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"])
+ test_workspace = test_config["workspace"]
+
+ def translate(
+ to_translate: str,
+ already_translated: bool = False,
+ old_translation: str = "",
+ ):
+ return f"{to_translate}."
+
+ sdk.catalog_workspace.clean_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ xliff_before = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ sdk.catalog_workspace.add_metadata_locale(
+ workspace_id=test_workspace, target_language="fr-FR", translator_func=translate, set_locale=False
+ )
+
+ xliff_after = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ sdk.catalog_workspace.clean_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ assert xliff_before != xliff_after
+
+
+@gd_vcr.use_cassette(str(_fixtures_dir / "clean_metadata_locale.yaml"))
+def test_clean_metadata_locale(test_config):
+ sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"])
+ test_workspace = test_config["workspace"]
+
+ def translate(
+ to_translate: str,
+ already_translated: bool = False,
+ old_translation: str = "",
+ ):
+ return f"{to_translate}."
+
+ sdk.catalog_workspace.clean_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ xliff_before = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ sdk.catalog_workspace.add_metadata_locale(
+ workspace_id=test_workspace, target_language="fr-FR", translator_func=translate, set_locale=False
+ )
+
+ xliff_after = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ assert xliff_before != xliff_after
+
+ sdk.catalog_workspace.clean_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ xliff_after = sdk.catalog_workspace.get_metadata_localization(workspace_id=test_workspace, target_language="fr-FR")
+
+ assert xliff_before == xliff_after
diff --git a/tests-support/tests_support/vcrpy_utils.py b/tests-support/tests_support/vcrpy_utils.py
index 5d34207d2..34af5132d 100644
--- a/tests-support/tests_support/vcrpy_utils.py
+++ b/tests-support/tests_support/vcrpy_utils.py
@@ -42,10 +42,16 @@ def deserialize(self, cassette_string: str) -> dict[str, Any]:
request_body = interaction["request"]["body"]
response_body = interaction["response"]["body"]
if request_body is not None:
- interaction["request"]["body"] = json.dumps(request_body)
+ if isinstance(request_body, str) and request_body.startswith(" str:
request_body = interaction["request"]["body"]
response_body = interaction["response"]["body"]
if request_body is not None:
- interaction["request"]["body"] = json.loads(request_body)
+ try:
+ interaction["request"]["body"] = json.loads(request_body)
+ except (JSONDecodeError, UnicodeDecodeError):
+ # The response can be in XML
+ interaction["request"]["body"] = request_body
if response_body is not None and response_body["string"] != "":
try:
interaction["response"]["body"]["string"] = json.loads(response_body["string"])