shopify_app 9.0.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -2
  3. data/CHANGELOG.md +159 -0
  4. data/README.md +221 -130
  5. data/app/assets/javascripts/shopify_app/itp_helper.js +6 -6
  6. data/app/assets/javascripts/shopify_app/storage_access.js +36 -7
  7. data/app/controllers/concerns/shopify_app/authenticated.rb +2 -2
  8. data/app/controllers/shopify_app/callback_controller.rb +20 -7
  9. data/app/controllers/shopify_app/extension_verification_controller.rb +20 -0
  10. data/app/controllers/shopify_app/sessions_controller.rb +71 -22
  11. data/app/views/shopify_app/sessions/enable_cookies.html.erb +3 -1
  12. data/app/views/shopify_app/sessions/request_storage_access.html.erb +2 -1
  13. data/app/views/shopify_app/sessions/top_level_interaction.html.erb +1 -0
  14. data/app/views/shopify_app/shared/redirect.html.erb +1 -0
  15. data/config/locales/cs.yml +23 -0
  16. data/config/locales/da.yml +20 -0
  17. data/config/locales/de.yml +5 -5
  18. data/config/locales/en.yml +1 -1
  19. data/config/locales/es.yml +3 -3
  20. data/config/locales/fi.yml +20 -0
  21. data/config/locales/fr.yml +3 -3
  22. data/config/locales/hi.yml +23 -0
  23. data/config/locales/it.yml +2 -3
  24. data/config/locales/ja.yml +1 -1
  25. data/config/locales/ko.yml +19 -0
  26. data/config/locales/ms.yml +22 -0
  27. data/config/locales/nb.yml +21 -0
  28. data/config/locales/nl.yml +3 -3
  29. data/config/locales/pl.yml +21 -0
  30. data/config/locales/pt-BR.yml +9 -10
  31. data/config/locales/pt-PT.yml +22 -0
  32. data/config/locales/sv.yml +21 -0
  33. data/config/locales/th.yml +20 -0
  34. data/config/locales/tr.yml +22 -0
  35. data/config/locales/zh-CN.yml +3 -3
  36. data/config/locales/zh-TW.yml +1 -2
  37. data/docs/Quickstart.md +44 -16
  38. data/docs/Releasing.md +0 -1
  39. data/docs/install-on-dev-shop.png +0 -0
  40. data/docs/test-your-app.png +0 -0
  41. data/karma.conf.js +1 -0
  42. data/lib/generators/shopify_app/add_after_authenticate_job/add_after_authenticate_job_generator.rb +2 -2
  43. data/lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb +39 -0
  44. data/lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb +62 -0
  45. data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +0 -6
  46. data/lib/generators/shopify_app/home_controller/templates/index.html.erb +1 -1
  47. data/lib/generators/shopify_app/install/install_generator.rb +27 -11
  48. data/lib/generators/shopify_app/install/templates/_flash_messages.html.erb +1 -17
  49. data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +11 -10
  50. data/lib/generators/shopify_app/install/templates/flash_messages.js +26 -0
  51. data/lib/generators/shopify_app/install/templates/shopify_app.js +15 -0
  52. data/lib/generators/shopify_app/install/templates/shopify_app.rb +6 -3
  53. data/lib/generators/shopify_app/install/templates/shopify_app_index.js +2 -0
  54. data/lib/generators/shopify_app/install/templates/shopify_provider.rb +1 -0
  55. data/lib/generators/shopify_app/install/templates/user_agent.rb +5 -0
  56. data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +1 -1
  57. data/lib/generators/shopify_app/shop_model/templates/shop.rb +1 -1
  58. data/lib/generators/shopify_app/user_model/templates/db/migrate/create_users.erb +16 -0
  59. data/lib/generators/shopify_app/user_model/templates/user.rb +7 -0
  60. data/lib/generators/shopify_app/user_model/templates/users.yml +4 -0
  61. data/lib/generators/shopify_app/user_model/user_model_generator.rb +38 -0
  62. data/lib/shopify_app/configuration.rb +22 -10
  63. data/lib/shopify_app/controller_concerns/login_protection.rb +66 -15
  64. data/lib/shopify_app/engine.rb +4 -0
  65. data/lib/shopify_app/managers/webhooks_manager.rb +1 -1
  66. data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +33 -0
  67. data/lib/shopify_app/session/in_memory_session_store.rb +1 -1
  68. data/lib/shopify_app/session/in_memory_shop_session_store.rb +4 -0
  69. data/lib/shopify_app/session/in_memory_user_session_store.rb +4 -0
  70. data/lib/shopify_app/session/session_repository.rb +38 -13
  71. data/lib/shopify_app/session/session_storage.rb +0 -22
  72. data/lib/shopify_app/session/shop_session_storage.rb +30 -0
  73. data/lib/shopify_app/session/user_session_storage.rb +31 -0
  74. data/lib/shopify_app/utils.rb +7 -0
  75. data/lib/shopify_app/version.rb +1 -1
  76. data/lib/shopify_app.rb +48 -29
  77. data/package-lock.json +7227 -5
  78. data/package.json +9 -9
  79. data/service.yml +1 -1
  80. data/shopify_app.gemspec +10 -5
  81. data/translation.yml +1 -1
  82. data/yarn.lock +2555 -1886
  83. metadata +117 -19
  84. data/lib/generators/shopify_app/home_controller/templates/shopify_app_ready_script.html.erb +0 -7
@@ -8,6 +8,11 @@ module ShopifyApp
8
8
  def callback
9
9
  if auth_hash
10
10
  login_shop
11
+
12
+ if ShopifyApp::SessionRepository.user_storage.present? && user_session.blank?
13
+ return redirect_to(login_url_with_optional_shop)
14
+ end
15
+
11
16
  install_webhooks
12
17
  install_scripttags
13
18
  perform_after_authenticate_job
@@ -15,7 +20,7 @@ module ShopifyApp
15
20
  redirect_to return_address
16
21
  else
17
22
  flash[:error] = I18n.t('could_not_log_in')
18
- redirect_to login_url
23
+ redirect_to(login_url_with_optional_shop)
19
24
  end
20
25
  end
21
26
 
@@ -56,9 +61,14 @@ module ShopifyApp
56
61
  api_version: ShopifyApp.configuration.api_version
57
62
  )
58
63
 
59
- session[:shopify] = ShopifyApp::SessionRepository.store(session_store)
60
- session[:shopify_domain] = shop_name
61
64
  session[:shopify_user] = associated_user
65
+ if session[:shopify_user].present?
66
+ session[:user_id] = ShopifyApp::SessionRepository.store_user_session(session_store, associated_user)
67
+ else
68
+ session[:shop_id] = ShopifyApp::SessionRepository.store_shop_session(session_store)
69
+ end
70
+ session[:shopify_domain] = shop_name
71
+ session[:user_session] = auth_hash&.extra&.session
62
72
  end
63
73
 
64
74
  def install_webhooks
@@ -66,7 +76,7 @@ module ShopifyApp
66
76
 
67
77
  WebhooksManager.queue(
68
78
  shop_name,
69
- token,
79
+ shop_session&.token || user_session.token,
70
80
  ShopifyApp.configuration.webhooks
71
81
  )
72
82
  end
@@ -76,7 +86,7 @@ module ShopifyApp
76
86
 
77
87
  ScripttagsManager.queue(
78
88
  shop_name,
79
- token,
89
+ shop_session&.token || user_session.token,
80
90
  ShopifyApp.configuration.scripttags
81
91
  )
82
92
  end
@@ -86,10 +96,13 @@ module ShopifyApp
86
96
 
87
97
  return unless config && config[:job].present?
88
98
 
99
+ job = config[:job]
100
+ job = job.constantize if job.is_a?(String)
101
+
89
102
  if config[:inline] == true
90
- config[:job].perform_now(shop_domain: session[:shopify_domain])
103
+ job.perform_now(shop_domain: session[:shopify_domain])
91
104
  else
92
- config[:job].perform_later(shop_domain: session[:shopify_domain])
105
+ job.perform_later(shop_domain: session[:shopify_domain])
93
106
  end
94
107
  end
95
108
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyApp
4
+ class ExtensionVerificationController < ActionController::Base
5
+ protect_from_forgery with: :null_session
6
+ before_action :verify_request
7
+
8
+ private
9
+
10
+ def verify_request
11
+ hmac_header = request.headers['HTTP_X_SHOPIFY_HMAC_SHA256']
12
+ request_body = request.body.read
13
+ secret = ShopifyApp.configuration.secret
14
+ digest = OpenSSL::Digest.new('sha256')
15
+
16
+ expected_hmac = Base64.strict_encode64(OpenSSL::HMAC.digest(digest, secret, request_body))
17
+ head(:unauthorized) unless ActiveSupport::SecurityUtils.secure_compare(expected_hmac, hmac_header)
18
+ end
19
+ end
20
+ end
@@ -3,6 +3,7 @@ module ShopifyApp
3
3
  include ShopifyApp::LoginProtection
4
4
 
5
5
  layout false, only: :new
6
+
6
7
  after_action only: [:new, :create] do |controller|
7
8
  controller.response.headers.except!('X-Frame-Options')
8
9
  end
@@ -16,36 +17,41 @@ module ShopifyApp
16
17
  end
17
18
 
18
19
  def enable_cookies
19
- return unless validate_shop
20
+ return unless validate_shop_presence
20
21
 
21
22
  render(:enable_cookies, layout: false, locals: {
22
23
  does_not_have_storage_access_url: top_level_interaction_path(
23
- shop: sanitized_shop_name
24
+ shop: sanitized_shop_name,
25
+ return_to: params[:return_to]
26
+ ),
27
+ has_storage_access_url: login_url_with_optional_shop(top_level: true),
28
+ app_target_url: granted_storage_access_path(
29
+ shop: sanitized_shop_name,
30
+ return_to: params[:return_to]
24
31
  ),
25
- has_storage_access_url: login_url(top_level: true),
26
- app_home_url: granted_storage_access_path(shop: sanitized_shop_name),
27
- current_shopify_domain: current_shopify_domain,
32
+ current_shopify_domain: current_shopify_domain
28
33
  })
29
34
  end
30
35
 
31
36
  def top_level_interaction
32
- @url = login_url(top_level: true)
33
- validate_shop
37
+ @url = login_url_with_optional_shop(top_level: true)
38
+ validate_shop_presence
34
39
  end
35
40
 
36
41
  def granted_storage_access
37
- return unless validate_shop
42
+ return unless validate_shop_presence
38
43
 
39
44
  session['shopify.granted_storage_access'] = true
40
45
 
41
- params = { shop: @shop }
42
- redirect_to "#{ShopifyApp.configuration.root_url}?#{params.to_query}"
46
+ copy_return_to_param_to_session
47
+
48
+ redirect_to(return_address_with_params({ shop: @shop }))
43
49
  end
44
50
 
45
51
  def destroy
46
52
  reset_session
47
53
  flash[:notice] = I18n.t('.logged_out')
48
- redirect_to login_url
54
+ redirect_to(login_url_with_optional_shop)
49
55
  end
50
56
 
51
57
  private
@@ -54,6 +60,10 @@ module ShopifyApp
54
60
  return render_invalid_shop_error unless sanitized_shop_name.present?
55
61
  session['shopify.omniauth_params'] = { shop: sanitized_shop_name }
56
62
 
63
+ copy_return_to_param_to_session
64
+
65
+ set_user_tokens_option
66
+
57
67
  if user_agent_can_partition_cookies
58
68
  authenticate_with_partitioning
59
69
  else
@@ -77,11 +87,31 @@ module ShopifyApp
77
87
  authenticate_in_context
78
88
  else
79
89
  set_top_level_oauth_cookie
80
- fullpage_redirect_to enable_cookies_path(shop: sanitized_shop_name)
90
+ enable_cookie_access
81
91
  end
82
92
  end
83
93
 
84
- def validate_shop
94
+ def set_user_tokens_option
95
+ if shop_session.blank?
96
+ session[:user_tokens] = false
97
+ return
98
+ end
99
+
100
+ session[:user_tokens] = ShopifyApp::SessionRepository.user_storage.present?
101
+
102
+ ShopifyAPI::Session.temp(
103
+ domain: shop_session.domain,
104
+ token: shop_session.token,
105
+ api_version: shop_session.api_version
106
+ ) do
107
+ ShopifyAPI::Metafield.find(:token_validity_bogus_check)
108
+ end
109
+ rescue ActiveResource::UnauthorizedAccess
110
+ session[:user_tokens] = false
111
+ rescue StandardError
112
+ end
113
+
114
+ def validate_shop_presence
85
115
  @shop = sanitized_shop_name
86
116
  unless @shop
87
117
  render_invalid_shop_error
@@ -91,17 +121,28 @@ module ShopifyApp
91
121
  true
92
122
  end
93
123
 
124
+ def copy_return_to_param_to_session
125
+ session[:return_to] = params[:return_to] if params[:return_to]
126
+ end
127
+
94
128
  def render_invalid_shop_error
95
129
  flash[:error] = I18n.t('invalid_shop_url')
96
130
  redirect_to return_address
97
131
  end
98
132
 
133
+ def enable_cookie_access
134
+ fullpage_redirect_to(enable_cookies_path(
135
+ shop: sanitized_shop_name,
136
+ return_to: session[:return_to]
137
+ ))
138
+ end
139
+
99
140
  def authenticate_in_context
100
141
  redirect_to "#{main_app.root_path}auth/shopify"
101
142
  end
102
143
 
103
144
  def authenticate_at_top_level
104
- fullpage_redirect_to login_url(top_level: true)
145
+ fullpage_redirect_to(login_url_with_optional_shop(top_level: true))
105
146
  end
106
147
 
107
148
  def authenticate_in_context?
@@ -119,14 +160,22 @@ module ShopifyApp
119
160
  end
120
161
 
121
162
  def redirect_to_request_storage_access
122
- render :request_storage_access, layout: false, locals: {
123
- does_not_have_storage_access_url: top_level_interaction_path(
124
- shop: sanitized_shop_name
125
- ),
126
- has_storage_access_url: login_url(top_level: true),
127
- app_home_url: granted_storage_access_path(shop: sanitized_shop_name),
128
- current_shopify_domain: current_shopify_domain
129
- }
163
+ render(
164
+ :request_storage_access,
165
+ layout: false,
166
+ locals: {
167
+ does_not_have_storage_access_url: top_level_interaction_path(
168
+ shop: sanitized_shop_name,
169
+ return_to: session[:return_to]
170
+ ),
171
+ has_storage_access_url: login_url_with_optional_shop(top_level: true),
172
+ app_target_url: granted_storage_access_path(
173
+ shop: sanitized_shop_name,
174
+ return_to: session[:return_to]
175
+ ),
176
+ current_shopify_domain: current_shopify_domain
177
+ }
178
+ )
130
179
  end
131
180
  end
132
181
  end
@@ -2,6 +2,7 @@
2
2
  <html lang="<%= I18n.locale %>">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
6
  <base target="_top">
6
7
  <title>Redirecting…</title>
7
8
  <%= render 'shopify_app/partials/layout_styles' %>
@@ -16,6 +17,7 @@
16
17
  <script>
17
18
  window.apiKey = "<%= ShopifyApp.configuration.api_key %>";
18
19
  window.shopOrigin = "https://<%= @shop %>";
20
+ window.returnTo = "<%= params[:return_to] %>"
19
21
  </script>
20
22
 
21
23
  <%= javascript_include_tag('shopify_app/enable_cookies', crossorigin: 'anonymous', integrity: true) %>
@@ -30,7 +32,7 @@
30
32
  myshopifyUrl: "https://#{current_shopify_domain}",
31
33
  hasStorageAccessUrl: "#{has_storage_access_url}",
32
34
  doesNotHaveStorageAccessUrl: "#{does_not_have_storage_access_url}",
33
- appHomeUrl: "#{app_home_url}"
35
+ appTargetUrl: "#{app_target_url}"
34
36
  },
35
37
  },
36
38
  )
@@ -2,6 +2,7 @@
2
2
  <html lang="<%= I18n.locale %>">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
6
  <base target="_top">
6
7
  <title>Redirecting…</title>
7
8
  <%= render 'shopify_app/partials/layout_styles' %>
@@ -23,7 +24,7 @@
23
24
  myshopifyUrl: "https://#{current_shopify_domain}",
24
25
  hasStorageAccessUrl: "#{has_storage_access_url}",
25
26
  doesNotHaveStorageAccessUrl: "#{does_not_have_storage_access_url}",
26
- appHomeUrl: "#{app_home_url}"
27
+ appTargetUrl: "#{app_target_url}"
27
28
  },
28
29
  },
29
30
  )
@@ -2,6 +2,7 @@
2
2
  <html lang="<%= I18n.locale %>">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
6
  <base target="_top">
6
7
  <title>Redirecting…</title>
7
8
  <%= render 'shopify_app/partials/layout_styles' %>
@@ -2,6 +2,7 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
6
  <base target="_top">
6
7
  <title>Redirecting…</title>
7
8
  <%= javascript_include_tag('shopify_app/redirect', crossorigin: 'anonymous', integrity: true) %>
@@ -0,0 +1,23 @@
1
+ ---
2
+ cs:
3
+ logged_out: Odhlášení proběhlo úspěšně
4
+ could_not_log_in: Nelze se přihlásit do obchodu Shopify
5
+ invalid_shop_url: Neplatná doména obchodu
6
+ enable_cookies_heading: Zapnout soubory cookie z aplikace %{app}
7
+ enable_cookies_body: Pokud chcete v Shopify používat aplikaci %{app}, musíte soubory
8
+ cookie v tomto prohlížeči povolit ručně.
9
+ enable_cookies_footer: Soubory cookie umožňují, aby vás aplikace ověřila pomocí
10
+ dočasného uchování preferencí a osobních údajů. Jejich platnost vyprší po 30 dnech.
11
+ enable_cookies_action: Povolit soubory cookie
12
+ top_level_interaction_heading: Váš prohlížeč potřebuje ověřit aplikaci %{app}
13
+ top_level_interaction_body: Váš prohlížeč vyžaduje, aby si od vás aplikace, jako
14
+ je %{app}, nejdřív vyžádaly přístup k souborům cookie, než je pro vás Shopify
15
+ otevře.
16
+ top_level_interaction_action: Pokračovat
17
+ request_storage_access_heading: Aplikace %{app} potřebuje získat přístup k souborům
18
+ cookie
19
+ request_storage_access_body: Tato aplikace vám umožní ověření prostřednictvím dočasného
20
+ uchování vašich osobních údajů. Pokud chcete používat tuto aplikaci, klikněte
21
+ na tlačítko Pokračovat a povolte soubory cookie.
22
+ request_storage_access_footer: Platnost souborů cookie vyprší po 30 dnech.
23
+ request_storage_access_action: Pokračovat
@@ -0,0 +1,20 @@
1
+ ---
2
+ da:
3
+ logged_out: Logget ud
4
+ could_not_log_in: Kunne ikke logge ind på Shopify-butik
5
+ invalid_shop_url: Ugyldig butiksdomæne
6
+ enable_cookies_heading: Aktivér cookies fra %{app}
7
+ enable_cookies_body: Du skal manuelt aktivere cookies i denne browser for at kunne
8
+ bruge %{app} i Shopify.
9
+ enable_cookies_footer: Cookies lader appen godkende dig ved at gemme dine præferencer
10
+ og personlige oplysninger midlertidigt. De udløber efter 30 dage.
11
+ enable_cookies_action: Aktivér cookies
12
+ top_level_interaction_heading: Din browser skal godkende %{app}
13
+ top_level_interaction_body: Din browser kræver, at apps som f.eks. %{app} spørger
14
+ dig om adgang til cookies, inden Shopify kan åbne den for dig.
15
+ top_level_interaction_action: Fortsæt
16
+ request_storage_access_heading: "%{app} skal have adgang til cookies"
17
+ request_storage_access_body: Det lader appen godkende dig ved at gemme dine personlige
18
+ oplysninger midlertidigt. Klik på forsæt, og tillad cookies for at bruge appen.
19
+ request_storage_access_footer: Cookies udløber efter 30 dage.
20
+ request_storage_access_action: Fortsæt
@@ -7,16 +7,16 @@ de:
7
7
  enable_cookies_body: Sie müssen Cookies in diesem Browser manuell aktivieren, um
8
8
  %{app} in Shopify verwenden zu können.
9
9
  enable_cookies_footer: Mithilfe von Cookies kann die App Sie authentifizieren, indem
10
- Ihre Einstellungen und persönlichen Informationen vorübergehend gespeichert werden.
10
+ Ihre Einstellungen und personenbezogenen Daten vorübergehend gespeichert werden.
11
11
  Sie laufen nach 30 Tagen ab.
12
12
  enable_cookies_action: Cookies aktivieren
13
13
  top_level_interaction_heading: Ihr Browser muss %{app} authentifizieren
14
- top_level_interaction_body: Ihr Browser verlangt, dass Apps von Drittanbietern wie
15
- %{app} Sie um Zugriff auf Cookies bitten, bevor Shopify sie für Sie öffnen kann.
14
+ top_level_interaction_body: Ihr Browser verlangt, dass Apps wie %{app} Sie um Zugriff
15
+ auf Cookies bitten, bevor Shopify sie für Sie öffnen kann.
16
16
  top_level_interaction_action: Weiter
17
17
  request_storage_access_heading: "%{app} braucht Zugriff auf Cookies"
18
18
  request_storage_access_body: Damit kann die App Sie authentifizieren, indem Ihre
19
- Einstellungen und persönlichen Informationen vorübergehend gespeichert werden.
20
- Klicken Sie auf "Weiter" und erlauben Sie den Cookies, die App zu verwenden.
19
+ Einstellungen und personenbezogenen Daten vorübergehend gespeichert werden. Klicken
20
+ Sie auf "Weiter" und erlauben Sie den Cookies, die App zu verwenden.
21
21
  request_storage_access_footer: Cookies laufen nach 30 Tagen ab.
22
22
  request_storage_access_action: Weiter
@@ -7,7 +7,7 @@ en:
7
7
  enable_cookies_footer: 'Cookies let the app authenticate you by temporarily storing your preferences and personal information. They expire after 30 days.'
8
8
  enable_cookies_action: 'Enable cookies'
9
9
  top_level_interaction_heading: "Your browser needs to authenticate %{app}"
10
- top_level_interaction_body: "Your browser requires third-party apps like %{app} to ask you for access to cookies before Shopify can open it for you."
10
+ top_level_interaction_body: "Your browser requires apps like %{app} to ask you for access to cookies before Shopify can open it for you."
11
11
  top_level_interaction_action: 'Continue'
12
12
  request_storage_access_heading: "%{app} needs access to cookies"
13
13
  request_storage_access_body: "This lets the app authenticate you by temporarily storing your personal information. Click continue and allow cookies to use the app."
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  es:
3
3
  logged_out: Cerrar sesión
4
- could_not_log_in: No se pudo iniciar sesión en tu tienda de Shopify
4
+ could_not_log_in: No se pudo iniciar sesión en tu tienda Shopify
5
5
  invalid_shop_url: Dominio de tienda inválido
6
6
  enable_cookies_heading: Habilitar cookies de %{app}
7
7
  enable_cookies_body: Debes habilitar manualmente las cookies en este navegador para
@@ -11,8 +11,8 @@ es:
11
11
  de 30 días.
12
12
  enable_cookies_action: Habilitar cookies
13
13
  top_level_interaction_heading: Tu navegador necesita autenticar %{app}
14
- top_level_interaction_body: Tu navegador requiere aplicaciones externas como %{app}
15
- para solicitarte acceso a cookies antes de que Shopify pueda abrirlo por ti.
14
+ top_level_interaction_body: Tu navegador requiere aplicaciones como %{app} para
15
+ solicitarte acceso a cookies antes de que Shopify pueda abrirlo por ti.
16
16
  top_level_interaction_action: Continuar
17
17
  request_storage_access_heading: "%{app} necesita acceso a las cookies"
18
18
  request_storage_access_body: Esto permite que la aplicación te autentique almacenando
@@ -0,0 +1,20 @@
1
+ ---
2
+ fi:
3
+ logged_out: Olet kirjautunut ulos
4
+ could_not_log_in: Kirjautuminen Shopify-kauppaan ei onnistunut
5
+ invalid_shop_url: Virheellinen kaupan verkkotunnus
6
+ enable_cookies_heading: Ota käyttöön sovelluksen %{app} evästeet
7
+ enable_cookies_body: Sinun on otettava evästeet käyttöön manuaalisesti tässä selaimessa,
8
+ jotta voit käyttää sovellusta %{app} Shopifyssa.
9
+ enable_cookies_footer: Evästeiden avulla sovellus voi todentaa sinut tallentamalla
10
+ asetuksesi ja henkilötietosi tilapäisesti. Ne vanhenevat 30 päivän kuluttua.
11
+ enable_cookies_action: Ota evästeet käyttöön
12
+ top_level_interaction_heading: Selaimesi täytyy todentaa %{app}
13
+ top_level_interaction_body: Selaimesi vaatii sovelluksia, kuten %{app}, pyytämään
14
+ sinulta luvan evästeiden käyttöön, ennen kuin Shopify voi avata sovelluksen.
15
+ top_level_interaction_action: Jatka
16
+ request_storage_access_heading: "%{app} edellyttää evästeiden käyttöä"
17
+ request_storage_access_body: Näin sovellus voi todentaa sinut tallentamalla henkilötietosi
18
+ tilapäisesti. Napsauta Jatka ja salli evästeet sovelluksen käyttämiseksi.
19
+ request_storage_access_footer: Evästeet vanhenevat 30 päivän kuluttua.
20
+ request_storage_access_action: Jatka
@@ -11,9 +11,9 @@ fr:
11
11
  expirent après 30 jours.
12
12
  enable_cookies_action: Activer les cookies
13
13
  top_level_interaction_heading: Votre navigateur doit s'authentifier %{app}
14
- top_level_interaction_body: Votre navigateur nécessite des applications tierces
15
- telles que %{app} pour vous demander l'accès aux cookies avant que Shopify ne
16
- puisse l'ouvrir pour vous.
14
+ top_level_interaction_body: Votre navigateur nécessite des applications telles que
15
+ %{app} pour vous demander l'accès aux cookies avant que Shopify ne puisse l'ouvrir
16
+ pour vous.
17
17
  top_level_interaction_action: Continuer
18
18
  request_storage_access_heading: "%{app} a besoin d'accéder aux cookies"
19
19
  request_storage_access_body: Cela permet à l'application de vous authentifier en
@@ -0,0 +1,23 @@
1
+ ---
2
+ hi:
3
+ logged_out: सफलतापूर्वक लॉग आउट कर दिया
4
+ could_not_log_in: Shopify स्टोर में लॉग इन नहीं किया जा सका
5
+ invalid_shop_url: अमान्य शॉप डोमेन
6
+ enable_cookies_heading: "%{app} के कुकीज़ सक्षम करें"
7
+ enable_cookies_body: आपको %{app} का उपयोग Shopify में करने के लिए इस ब्राउज़र में
8
+ कुकीज़ मैन्युअल रूप से सक्षम करने चाहिए.
9
+ enable_cookies_footer: कुकीज़ अस्थायी रूप से आपकी वरीयताएं और व्यक्तिगत जानकारी स्टोर
10
+ कर ऐप को आपको प्रमाणित करने देते हैं. इनकी समय-सीमा 30 दिनों बाद समाप्त हो जाती
11
+ है.
12
+ enable_cookies_action: कुकीज़ को सक्षम करें
13
+ top_level_interaction_heading: आपके ब्राउज़र को %{app} प्रमाणित करने की आवश्यकता
14
+ है
15
+ top_level_interaction_body: आपके ब्राउज़र को %{app} जैसे ऐप की ज़रूरत होती है, जो
16
+ Shopify द्वारा आपके लिए उसे खोलने से पहले कुकीज़ पर पहुंचने करने की अनुमति मांगे.
17
+ top_level_interaction_action: जारी रखें
18
+ request_storage_access_heading: "%{app} को कुकीज़ पर पहुंच करने की आवश्यकता है"
19
+ request_storage_access_body: यह आपकी व्यक्तिगत जानकारी अस्थायी रूप से स्टोर कर ऐप
20
+ को आपको प्रमाणित करने देता है. जारी रखें पर क्लिक करें और कुकीज़ को ऐप उपयोग करने
21
+ की अनुमति दें.
22
+ request_storage_access_footer: कुकीज़ की समय-सीमा 30 दिनों बाद समाप्त हो जाती है.
23
+ request_storage_access_action: जारी रखें
@@ -10,9 +10,8 @@ it:
10
10
  temporaneamente le tue preferenze e informazioni personali. Scadono dopo 30 giorni.
11
11
  enable_cookies_action: Abilita i cookie
12
12
  top_level_interaction_heading: Il tuo browser deve autenticare %{app}
13
- top_level_interaction_body: Il tuo browser richiede che app di terze parti come
14
- %{app} ti chiedano l'accesso ai cookie prima dell'apertura automatica da parte
15
- di Shopify.
13
+ top_level_interaction_body: Il tuo browser richiede che app come %{app} ti chiedano
14
+ l'accesso ai cookie prima dell'apertura automatica da parte di Shopify.
16
15
  top_level_interaction_action: Continua
17
16
  request_storage_access_heading: "%{app} deve accedere ai cookie"
18
17
  request_storage_access_body: L'app potrà così autenticarti memorizzando temporaneamente
@@ -8,7 +8,7 @@ ja:
8
8
  enable_cookies_footer: Cookieを使用すると、各種設定や個人情報を一時的に保存することで、アプリ認証を受けることができます。30日後に有効期限が切れます。
9
9
  enable_cookies_action: Cookieを有効にする
10
10
  top_level_interaction_heading: お使いのブラウザを更新する必要があります%{app}
11
- top_level_interaction_body: Shopifyがアプリを開けるように、ブラウザーはCookie にアクセスするための%{app}のような外部アプリが必要です。
11
+ top_level_interaction_body: Shopifyがアプリを開けるように、ブラウザーはCookieにアクセスするための%{app}のようなアプリが必要です。
12
12
  top_level_interaction_action: 続ける
13
13
  request_storage_access_heading: "%{app}クッキーにアクセスする必要がある"
14
14
  request_storage_access_body: Cookieを使用すると、個人情報を一時的に保存することで、アプリ認証を受けることができます。[続行]
@@ -0,0 +1,19 @@
1
+ ---
2
+ ko:
3
+ logged_out: 성공적으로 로그아웃 되었습니다.
4
+ could_not_log_in: Shopify 스토어에 로그인할 수 없습니다.
5
+ invalid_shop_url: 유효하지 않은 상점 도메인
6
+ enable_cookies_heading: "%{app}에서 쿠키를 사용 가능"
7
+ enable_cookies_body: Shopify 내에서 %{app} 을 사용하기 위해 이 브라우저에서 쿠키를 수동으로 사용할 수 있습니다.
8
+ enable_cookies_footer: 쿠키를 사용하면 개인의 선호나 정보를 임시로 저장하여 앱에서 사용자를 인증할 수 있습니다. 쿠키는 30일
9
+ 후에 만료됩니다.
10
+ enable_cookies_action: 쿠리 사용 가능
11
+ top_level_interaction_heading: 브라우저에서 %{app} 을 인증해야 합니다.
12
+ top_level_interaction_body: Shopify를 열기 전 쿠키에 엑세스하려면 %{app} 과 같은 앱 들이 브라우저에 설치되어야
13
+ 합니다.
14
+ top_level_interaction_action: 계속
15
+ request_storage_access_heading: "%{app}에서 쿠키에 접근해야 합니다."
16
+ request_storage_access_body: 이를 통해 개인 정보를 임시로 저장하여 앱에서 사용자를 인증할 수 있습니다. 계속 클릭하여
17
+ 쿠키로 앱을 사용하세요.
18
+ request_storage_access_footer: 쿠키는 30일 후에 만료됩니다.
19
+ request_storage_access_action: 계속
@@ -0,0 +1,22 @@
1
+ ---
2
+ ms:
3
+ logged_out: Berjaya log keluar
4
+ could_not_log_in: Tidak dapat log masuk ke kedai Shopify
5
+ invalid_shop_url: Domain kedai tidak sah
6
+ enable_cookies_heading: Dayakan kuki dari %{app}
7
+ enable_cookies_body: Anda mesti mengaktifkan kuki secara manual dalam pelayar ini
8
+ untuk %{app} digunakan dalam Shopify.
9
+ enable_cookies_footer: Kuki membenarkan aplikasi mengesahkan anda dengan menyimpan
10
+ keutamaan dan maklumat peribadi anda buat sementara waktu. Ia tamat tempoh selepas
11
+ 30 hari.
12
+ enable_cookies_action: Dayakan kuki
13
+ top_level_interaction_heading: Pelayar anda perlu mengesahkan %{app}
14
+ top_level_interaction_body: Pelayar anda memerlukan aplikasi seperti %{app} untuk
15
+ meminta anda akses kepada kuki sebelum Shopify boleh membukanya untuk anda.
16
+ top_level_interaction_action: Teruskan
17
+ request_storage_access_heading: "%{app} memerlukan akses kepada kuki"
18
+ request_storage_access_body: Ini membolehkan aplikasi mengesahkan anda dengan menyimpan
19
+ maklumat peribadi anda buat sementara waktu. Klik teruskan dan benarkan kuki untuk
20
+ menggunakan aplikasi.
21
+ request_storage_access_footer: Kuki akan tamat tempoh selepas 30 hari.
22
+ request_storage_access_action: Teruskan
@@ -0,0 +1,21 @@
1
+ ---
2
+ nb:
3
+ logged_out: Logget ut
4
+ could_not_log_in: Kunne ikke logge på Shopify-butikken
5
+ invalid_shop_url: Ugyldig butikkdomene
6
+ enable_cookies_heading: Aktiver informasjonskapsler fra %{app}
7
+ enable_cookies_body: Du kan manuelt aktivere informasjonskapsler i denne nettleseren
8
+ for å kunne bruke %{app} i Shopify.
9
+ enable_cookies_footer: Informasjonskapsler lar appen autentisere deg ved å midlertidig
10
+ lagre innstillingene og personopplysningene dine. De går ut etter 30 dager.
11
+ enable_cookies_action: Aktiver informasjonskapsler
12
+ top_level_interaction_heading: Nettleseren din må autentisere %{app}
13
+ top_level_interaction_body: Nettleseren din krever apper som %{app} for å spørre
14
+ deg om tilgang til informasjonskapsler før Shopify kan åpne den for deg.
15
+ top_level_interaction_action: Fortsett
16
+ request_storage_access_heading: "%{app} må ha tilgang til informasjonskapsler"
17
+ request_storage_access_body: Informasjonskapsler lar appen autentisere deg ved å
18
+ midlertidig lagre personopplysningene dine. Klikk på Fortsett og gi informasjonskapsler
19
+ tillatelse til å bruke appen.
20
+ request_storage_access_footer: Informasjonskapslene går ut etter 30 dager.
21
+ request_storage_access_action: Fortsett
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  nl:
3
- logged_out: U bent afgemeld
3
+ logged_out: u bent afgemeld
4
4
  could_not_log_in: Kon niet aanmelden bij Shopify-winkel
5
5
  invalid_shop_url: Ongeldig winkeldomein
6
6
  enable_cookies_heading: Schakel cookies in van %{app}
@@ -10,8 +10,8 @@ nl:
10
10
  persoonlijke informatie tijdelijk op te slaan. Ze vervallen na 30 dagen.
11
11
  enable_cookies_action: Schakel cookies in
12
12
  top_level_interaction_heading: Uw browser moet %{app} verifiëren
13
- top_level_interaction_body: Uw browser heeft apps van derden nodig zoals %{app}
14
- om u toegang te vragen tot cookies voordat Shopify het voor u kan openen.
13
+ top_level_interaction_body: Uw browser heeft apps nodig zoals %{app} om u toegang
14
+ te vragen tot cookies voordat Shopify het voor u kan openen.
15
15
  top_level_interaction_action: Doorgaan
16
16
  request_storage_access_heading: "%{app} heeft toegang tot cookies nodig"
17
17
  request_storage_access_body: Hiermee kan de app u verifiëren door uw persoonlijke
@@ -0,0 +1,21 @@
1
+ ---
2
+ pl:
3
+ logged_out: Pomyślne wylogowanie
4
+ could_not_log_in: Nie można zalogować się do sklepu Shopify
5
+ invalid_shop_url: Nieprawidłowa domena sklepu
6
+ enable_cookies_heading: Włącz korzystanie z plików cookie z %{app}
7
+ enable_cookies_body: Aby móc korzystać z %{app} w Shopify, musisz ręcznie włączyć
8
+ korzystanie z plików cookie w tej przeglądarce.
9
+ enable_cookies_footer: Pliki cookie umożliwiają uwierzytelnianie aplikacji przez
10
+ tymczasowe przechowywanie preferencji i danych osobowych. Wygasają one po 30 dniach.
11
+ enable_cookies_action: Włącz korzystanie z plików cookie
12
+ top_level_interaction_heading: Twoja przeglądarka wymaga uwierzytelnienia %{app}
13
+ top_level_interaction_body: Twoja przeglądarka wymaga takich aplikacji jak %{app},
14
+ aby poprosić o dostęp do plików cookie, zanim Shopify będzie mógł ją otworzyć.
15
+ top_level_interaction_action: Kontynuuj
16
+ request_storage_access_heading: "%{app} potrzebuje dostępu do plików cookie"
17
+ request_storage_access_body: Dzięki temu aplikacja może Cię uwierzytelniać, tymczasowo,
18
+ przechowując Twoje dane osobowe. Kliknij przycisk Kontynuuj i zezwalaj na pliki
19
+ cookie, aby korzystać z aplikacji.
20
+ request_storage_access_footer: Pliki cookie wygasają po 30 dniach.
21
+ request_storage_access_action: Kontynuuj
@@ -1,18 +1,17 @@
1
1
  ---
2
2
  pt-BR:
3
- logged_out: Você saiu com sucesso
3
+ logged_out: Você saiu.
4
4
  could_not_log_in: Não foi possível fazer login na Shopify store
5
5
  invalid_shop_url: Domínio de loja inválido
6
- enable_cookies_heading: Ativar cookies de %{app}
7
- enable_cookies_body: Você deve ativar manualmente os cookies neste navegador para
8
- usar %{app} dentro da Shopify.
9
- enable_cookies_footer: Os cookies permitem que o aplicativo o autentique armazenando
10
- temporariamente suas preferências e informações pessoais. Eles expiram depois
11
- de 30 dias.
12
- enable_cookies_action: Ativar cookies
6
+ enable_cookies_heading: Habilitar cookies de %{app}
7
+ enable_cookies_body: Você precisa habilitar manualmente os cookies neste navegador
8
+ para usar %{app} dentro da Shopify.
9
+ enable_cookies_footer: Os cookies permitem que o app o autentique armazenando temporariamente
10
+ suas preferências e dados pessoais. Eles expiram depois de 30 dias.
11
+ enable_cookies_action: Habilitar cookies
13
12
  top_level_interaction_heading: Seu navegador precisa autenticar %{app}
14
- top_level_interaction_body: Seu navegador exige que apps de terceiros como o %{app}
15
- consultem você sobre o acesso a cookies antes da Shopify abri-los.
13
+ top_level_interaction_body: Seu navegador exige que apps como o %{app} consultem
14
+ você sobre o acesso a cookies antes que a Shopify os abra.
16
15
  top_level_interaction_action: Continuar
17
16
  request_storage_access_heading: "%{app} precisa acessar cookies"
18
17
  request_storage_access_body: Isso permite que o app autentique você armazenando