shopify_app 9.0.0 → 13.0.0

Sign up to get free protection for your applications and to get access to all the features.
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