spree_core 6.0.0.beta3 → 6.0.0.rc1

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 (495) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/helpers/spree/images_helper.rb +0 -57
  4. data/app/jobs/spree/base_job.rb +21 -0
  5. data/app/jobs/spree/carts/reap_expired_job.rb +2 -2
  6. data/app/jobs/spree/collections/regenerate_time_based_job.rb +6 -3
  7. data/app/jobs/spree/orders/finalize_stale_drafts_job.rb +8 -5
  8. data/app/jobs/spree/payments/cancel_unused_sessions_job.rb +61 -0
  9. data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +2 -0
  10. data/app/mailers/spree/admin_user_mailer.rb +4 -19
  11. data/app/mailers/spree/base_mailer.rb +96 -13
  12. data/app/mailers/spree/email_template_mailer.rb +27 -0
  13. data/app/mailers/spree/export_mailer.rb +3 -4
  14. data/app/mailers/spree/import_mailer.rb +3 -4
  15. data/app/mailers/spree/invitation_mailer.rb +24 -7
  16. data/app/mailers/spree/seller_user_mailer.rb +4 -16
  17. data/app/mailers/spree/webhook_mailer.rb +2 -2
  18. data/app/models/concerns/spree/acted_by.rb +1 -1
  19. data/app/models/concerns/spree/admin_user_methods.rb +13 -1
  20. data/app/models/concerns/spree/api_typed.rb +91 -0
  21. data/app/models/concerns/spree/calculator/tiers.rb +76 -0
  22. data/app/models/concerns/spree/customer_methods.rb +15 -14
  23. data/app/models/concerns/spree/email_template_identity.rb +52 -0
  24. data/app/models/concerns/spree/parameterizable_name.rb +2 -0
  25. data/app/models/concerns/spree/payment_session_transitions.rb +8 -2
  26. data/app/models/concerns/spree/post_sale/taxation.rb +54 -0
  27. data/app/models/concerns/spree/post_sale/taxed_line.rb +51 -0
  28. data/app/models/concerns/spree/preference_schema.rb +4 -12
  29. data/app/models/concerns/spree/product_scopes.rb +11 -1
  30. data/app/models/concerns/spree/provider_listing.rb +41 -0
  31. data/app/models/concerns/spree/publishable.rb +82 -14
  32. data/app/models/concerns/spree/purchase/addresses.rb +23 -10
  33. data/app/models/concerns/spree/purchase/currency.rb +1 -1
  34. data/app/models/concerns/spree/purchase/deprecated_aliases.rb +87 -0
  35. data/app/models/concerns/spree/purchase/gift_cards.rb +10 -4
  36. data/app/models/concerns/spree/purchase/locale.rb +1 -1
  37. data/app/models/concerns/spree/purchase/payment_processing.rb +7 -3
  38. data/app/models/concerns/spree/purchase/purchase_order.rb +2 -2
  39. data/app/models/concerns/spree/purchase/totals.rb +49 -1
  40. data/app/models/concerns/spree/receivable.rb +1 -1
  41. data/app/models/concerns/spree/searchable.rb +0 -4
  42. data/app/models/concerns/spree/secret_preferences.rb +59 -0
  43. data/app/models/concerns/spree/single_store_resource.rb +1 -1
  44. data/app/models/concerns/spree/stores/email_branding.rb +31 -0
  45. data/app/models/concerns/spree/type_labels.rb +38 -0
  46. data/app/models/concerns/spree/typed_adjustment_line.rb +1 -1
  47. data/app/models/concerns/spree/typed_associations.rb +6 -0
  48. data/app/models/spree/address.rb +11 -1
  49. data/app/models/spree/adjusters/promotion.rb +1 -15
  50. data/app/models/spree/allowed_origin.rb +0 -1
  51. data/app/models/spree/api_key.rb +5 -6
  52. data/app/models/spree/authentication/strategies/oidc_strategy.rb +5 -5
  53. data/app/models/spree/base.rb +70 -22
  54. data/app/models/spree/calculator/flat_percent_item_total.rb +1 -3
  55. data/app/models/spree/calculator/flat_rate.rb +1 -3
  56. data/app/models/spree/calculator/flexi_rate.rb +1 -3
  57. data/app/models/spree/calculator/percent_on_line_item.rb +1 -1
  58. data/app/models/spree/calculator/price_sack.rb +1 -3
  59. data/app/models/spree/calculator/shipping/digital_delivery.rb +1 -3
  60. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -3
  61. data/app/models/spree/calculator/shipping/flat_rate.rb +1 -3
  62. data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -3
  63. data/app/models/spree/calculator/shipping/per_item.rb +1 -3
  64. data/app/models/spree/calculator/shipping/price_sack.rb +1 -3
  65. data/app/models/spree/calculator/tiered_flat_rate.rb +6 -23
  66. data/app/models/spree/calculator/tiered_percent.rb +7 -25
  67. data/app/models/spree/cart.rb +78 -18
  68. data/app/models/spree/channel/gating.rb +1 -1
  69. data/app/models/spree/channel.rb +4 -4
  70. data/app/models/spree/claim.rb +21 -1
  71. data/app/models/spree/claim_line_item.rb +41 -6
  72. data/app/models/spree/collection.rb +0 -1
  73. data/app/models/spree/collection_rule.rb +5 -21
  74. data/app/models/spree/commission_line.rb +1 -1
  75. data/app/models/spree/commission_rate.rb +2 -3
  76. data/app/models/spree/commission_rate_value.rb +1 -1
  77. data/app/models/spree/commission_rule.rb +4 -11
  78. data/app/models/spree/commission_rules/product_rule.rb +1 -1
  79. data/app/models/spree/company_invitation.rb +1 -0
  80. data/app/models/spree/consent_record.rb +0 -1
  81. data/app/models/spree/credit_card.rb +1 -1
  82. data/app/models/spree/current.rb +23 -0
  83. data/app/models/spree/custom_field.rb +2 -2
  84. data/app/models/spree/custom_field_definition.rb +9 -23
  85. data/app/models/spree/custom_fields/boolean.rb +1 -1
  86. data/app/models/spree/custom_fields/json.rb +1 -1
  87. data/app/models/spree/data_feed/google.rb +0 -2
  88. data/app/models/spree/data_request.rb +1 -1
  89. data/app/models/spree/delivery_method.rb +30 -13
  90. data/app/models/spree/delivery_method_rule.rb +4 -11
  91. data/app/models/spree/delivery_rate.rb +4 -5
  92. data/app/models/spree/delivery_rate_provider/base.rb +1 -0
  93. data/app/models/spree/delivery_zone.rb +0 -1
  94. data/app/models/spree/delivery_zone_member.rb +4 -4
  95. data/app/models/spree/digital_asset.rb +7 -0
  96. data/app/models/spree/digital_asset_provider/base.rb +2 -0
  97. data/app/models/spree/digital_link.rb +2 -5
  98. data/app/models/spree/discount.rb +1 -1
  99. data/app/models/spree/email_template.rb +25 -0
  100. data/app/models/spree/email_template_draft.rb +13 -0
  101. data/app/models/spree/email_template_revision.rb +17 -0
  102. data/app/models/spree/email_templates/entry.rb +118 -0
  103. data/app/models/spree/email_templates/sample_record.rb +16 -0
  104. data/app/models/spree/emails/branding.rb +80 -0
  105. data/app/models/spree/exchange.rb +15 -1
  106. data/app/models/spree/exchange_line_item.rb +121 -5
  107. data/app/models/spree/export.rb +0 -1
  108. data/app/models/spree/exports/products.rb +10 -1
  109. data/app/models/spree/exports/report.rb +1 -1
  110. data/app/models/spree/fee.rb +4 -2
  111. data/app/models/spree/fulfillment.rb +53 -27
  112. data/app/models/spree/fulfillment_changer.rb +2 -2
  113. data/app/models/spree/fulfillment_item.rb +0 -4
  114. data/app/models/spree/fulfillment_provider/base.rb +1 -0
  115. data/app/models/spree/gateway/bogus.rb +4 -0
  116. data/app/models/spree/gateway/custom_payment_source_method.rb +5 -0
  117. data/app/models/spree/gateway.rb +5 -1
  118. data/app/models/spree/gift_card.rb +12 -1
  119. data/app/models/spree/gift_card_batch.rb +0 -1
  120. data/app/models/spree/import.rb +2 -7
  121. data/app/models/spree/import_mapping.rb +1 -2
  122. data/app/models/spree/import_row.rb +2 -2
  123. data/app/models/spree/import_schemas/products.rb +1 -0
  124. data/app/models/spree/integration.rb +8 -18
  125. data/app/models/spree/invitation.rb +5 -5
  126. data/app/models/spree/line_item.rb +13 -2
  127. data/app/models/spree/locale.rb +11 -8
  128. data/app/models/spree/market.rb +1 -0
  129. data/app/models/spree/newsletter_subscriber.rb +3 -0
  130. data/app/models/spree/order.rb +56 -138
  131. data/app/models/spree/order_group.rb +11 -2
  132. data/app/models/spree/order_inventory.rb +10 -5
  133. data/app/models/spree/order_promotion.rb +1 -1
  134. data/app/models/spree/order_routing/has_strategy_preference.rb +1 -1
  135. data/app/models/spree/order_routing/strategy/base.rb +4 -2
  136. data/app/models/spree/order_routing/strategy/rules.rb +1 -1
  137. data/app/models/spree/order_routing_rule.rb +6 -22
  138. data/app/models/spree/package_type.rb +1 -2
  139. data/app/models/spree/payment/gateway_options.rb +14 -52
  140. data/app/models/spree/payment/processing.rb +2 -4
  141. data/app/models/spree/payment.rb +20 -5
  142. data/app/models/spree/payment_method/session_instrumentation.rb +1 -0
  143. data/app/models/spree/payment_method/store_credit.rb +4 -4
  144. data/app/models/spree/payment_method.rb +36 -4
  145. data/app/models/spree/payment_session.rb +5 -1
  146. data/app/models/spree/payment_setup_session.rb +1 -0
  147. data/app/models/spree/payout_provider/base.rb +3 -1
  148. data/app/models/spree/pickup_point_provider/base.rb +2 -0
  149. data/app/models/spree/price_list.rb +1 -2
  150. data/app/models/spree/price_rules/channel_rule.rb +1 -1
  151. data/app/models/spree/price_rules/customer_group_rule.rb +1 -1
  152. data/app/models/spree/product.rb +31 -7
  153. data/app/models/spree/product_submission.rb +0 -12
  154. data/app/models/spree/product_type.rb +0 -1
  155. data/app/models/spree/promotion/actions/create_line_items.rb +27 -17
  156. data/app/models/spree/promotion/rules/category.rb +0 -4
  157. data/app/models/spree/promotion/rules/channel.rb +0 -4
  158. data/app/models/spree/promotion/rules/country.rb +0 -4
  159. data/app/models/spree/promotion/rules/currency.rb +0 -4
  160. data/app/models/spree/promotion/rules/customer_group.rb +0 -4
  161. data/app/models/spree/promotion/rules/first_order.rb +0 -4
  162. data/app/models/spree/promotion/rules/item_total.rb +4 -8
  163. data/app/models/spree/promotion/rules/market.rb +0 -4
  164. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -4
  165. data/app/models/spree/promotion/rules/option_value.rb +0 -3
  166. data/app/models/spree/promotion/rules/product.rb +0 -4
  167. data/app/models/spree/promotion/rules/user.rb +0 -4
  168. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -4
  169. data/app/models/spree/promotion.rb +35 -6
  170. data/app/models/spree/promotion_action.rb +7 -14
  171. data/app/models/spree/promotion_action_line_item.rb +1 -1
  172. data/app/models/spree/promotion_handler/coupon.rb +59 -27
  173. data/app/models/spree/promotion_rule.rb +7 -14
  174. data/app/models/spree/purchase_order.rb +1 -0
  175. data/app/models/spree/quantity_rule.rb +1 -1
  176. data/app/models/spree/refund.rb +28 -3
  177. data/app/models/spree/return.rb +30 -2
  178. data/app/models/spree/return_line_item.rb +65 -14
  179. data/app/models/spree/role.rb +7 -7
  180. data/app/models/spree/saved_report.rb +1 -1
  181. data/app/models/spree/seller.rb +2 -1
  182. data/app/models/spree/seller_payout.rb +7 -0
  183. data/app/models/spree/seller_requirement.rb +4 -12
  184. data/app/models/spree/seller_requirement_custom_field.rb +1 -2
  185. data/app/models/spree/seller_requirement_submission.rb +2 -2
  186. data/app/models/spree/seller_requirements/accept_terms.rb +2 -3
  187. data/app/models/spree/seller_transfer.rb +5 -0
  188. data/app/models/spree/shipping_label.rb +1 -0
  189. data/app/models/spree/stock/availability_validator.rb +2 -2
  190. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  191. data/app/models/spree/stock/packer.rb +2 -2
  192. data/app/models/spree/stock/splitter/weight.rb +1 -1
  193. data/app/models/spree/stock_level/custom_events.rb +6 -0
  194. data/app/models/spree/stock_level.rb +1 -1
  195. data/app/models/spree/stock_movement.rb +1 -1
  196. data/app/models/spree/stock_receipt_item.rb +1 -1
  197. data/app/models/spree/stock_reservation.rb +2 -2
  198. data/app/models/spree/stock_transfer.rb +4 -2
  199. data/app/models/spree/store.rb +33 -7
  200. data/app/models/spree/store_credit.rb +8 -9
  201. data/app/models/spree/store_credit_event.rb +5 -5
  202. data/app/models/spree/tax_exemption_certificate.rb +2 -0
  203. data/app/models/spree/tax_identifier.rb +3 -1
  204. data/app/models/spree/tax_line.rb +53 -3
  205. data/app/models/spree/tax_provider/base.rb +71 -14
  206. data/app/models/spree/tax_provider/internal.rb +59 -33
  207. data/app/models/spree/tax_provider/recorded_share.rb +114 -0
  208. data/app/models/spree/tax_rate.rb +1 -2
  209. data/app/models/spree/taxonomy.rb +0 -1
  210. data/app/models/spree/variant.rb +4 -3
  211. data/app/models/spree/variant_media.rb +1 -1
  212. data/app/models/spree/webhook_endpoint.rb +10 -13
  213. data/app/models/spree/wishlist.rb +1 -6
  214. data/app/models/spree/wishlist_item/custom_events.rb +6 -0
  215. data/app/presenters/spree/csv/customer_presenter.rb +1 -1
  216. data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +1 -1
  217. data/app/presenters/spree/csv/order_line_item_presenter.rb +1 -1
  218. data/app/presenters/spree/csv/product_variant_presenter.rb +42 -12
  219. data/app/serializers/spree/emails/base_serializer.rb +14 -0
  220. data/app/serializers/spree/emails/export_serializer.rb +13 -0
  221. data/app/serializers/spree/emails/import_serializer.rb +19 -0
  222. data/app/serializers/spree/emails/invitation_serializer.rb +28 -0
  223. data/app/serializers/spree/emails/store_serializer.rb +31 -0
  224. data/app/serializers/spree/emails/user_serializer.rb +12 -0
  225. data/app/serializers/spree/emails/webhook_endpoint_serializer.rb +16 -0
  226. data/app/services/spree/carts/create.rb +8 -2
  227. data/app/services/spree/carts/destroy.rb +2 -2
  228. data/app/services/spree/carts/remove_out_of_stock_items.rb +2 -2
  229. data/app/services/spree/carts/split_by_seller.rb +1 -1
  230. data/app/services/spree/carts/update.rb +19 -5
  231. data/app/services/spree/catalogs/set_product_terms.rb +1 -1
  232. data/app/services/spree/categories/add_products.rb +13 -31
  233. data/app/services/spree/categories/remove_products.rb +12 -51
  234. data/app/services/spree/checkout/advance.rb +1 -4
  235. data/app/services/spree/collections/add_products.rb +10 -23
  236. data/app/services/spree/collections/remove_products.rb +7 -43
  237. data/app/services/spree/coupon_codes/bulk_generate.rb +8 -14
  238. data/app/services/spree/data_requests/create.rb +1 -1
  239. data/app/services/spree/deliveries/destroy.rb +2 -2
  240. data/app/services/spree/email_templates/check.rb +58 -0
  241. data/app/services/spree/email_templates/no_sample_record.rb +7 -0
  242. data/app/services/spree/email_templates/preview.rb +99 -0
  243. data/app/services/spree/emails/file_system.rb +23 -0
  244. data/app/services/spree/emails/filters.rb +84 -0
  245. data/app/services/spree/emails/liquid_context.rb +48 -0
  246. data/app/services/spree/emails/rendered_email.rb +14 -0
  247. data/app/services/spree/emails/renderer.rb +125 -0
  248. data/app/services/spree/emails/template.rb +51 -0
  249. data/app/services/spree/emails/template_data.rb +23 -0
  250. data/app/services/spree/emails/template_resolver.rb +109 -0
  251. data/app/services/spree/emails/text_converter.rb +72 -0
  252. data/app/services/spree/emails/translation_inliner.rb +134 -0
  253. data/app/services/spree/imports/row_processors/price_list_price.rb +10 -10
  254. data/app/services/spree/imports/row_processors/product_variant.rb +65 -34
  255. data/app/services/spree/imports/row_processors/purchase_order.rb +13 -13
  256. data/app/services/spree/locales.rb +4 -5
  257. data/app/services/spree/newsletter/subscribe.rb +8 -12
  258. data/app/services/spree/orders/build_fulfillments.rb +3 -2
  259. data/app/services/spree/orders/create.rb +2 -1
  260. data/app/services/spree/orders/discounts/create.rb +7 -4
  261. data/app/services/spree/orders/discounts/destroy.rb +1 -0
  262. data/app/services/spree/orders/discounts/update.rb +1 -0
  263. data/app/services/spree/orders/fees/create.rb +1 -0
  264. data/app/services/spree/orders/fees/destroy.rb +1 -0
  265. data/app/services/spree/orders/fees/update.rb +1 -0
  266. data/app/services/spree/orders/remove_line_item.rb +13 -3
  267. data/app/services/spree/orders/update.rb +10 -6
  268. data/app/services/spree/orders/update_item.rb +6 -3
  269. data/app/services/spree/orders/update_statuses.rb +3 -1
  270. data/app/services/spree/product_memberships.rb +61 -0
  271. data/app/services/spree/returns/eligibility_validator.rb +1 -1
  272. data/app/services/spree/search_provider/custom_field_schema.rb +2 -2
  273. data/app/services/spree/seeds/commission_rates.rb +1 -1
  274. data/app/services/spree/seeds/digital_delivery.rb +1 -1
  275. data/app/services/spree/seeds/payment_methods.rb +2 -2
  276. data/app/services/spree/seeds/saved_reports.rb +3 -3
  277. data/app/services/spree/sellers/requirements.rb +1 -2
  278. data/app/services/spree/shipping_labels/confirm_refund.rb +1 -1
  279. data/app/services/spree/shipping_labels/store_file.rb +3 -3
  280. data/app/services/spree/stock_levels/correct.rb +3 -3
  281. data/app/services/spree/stock_reservations/reserve.rb +2 -3
  282. data/app/services/spree/store_credits/apply.rb +15 -13
  283. data/app/services/spree/stores/provision_defaults.rb +15 -14
  284. data/app/subscribers/spree/seller_onboarding_subscriber.rb +1 -1
  285. data/app/views/layouts/spree/base_mailer.html.erb +2 -43
  286. data/app/views/layouts/spree/base_mailer.liquid +79 -0
  287. data/app/views/spree/admin_user_mailer/password_reset_email.liquid +14 -0
  288. data/app/views/spree/export_mailer/export_done.liquid +12 -0
  289. data/app/views/spree/import_mailer/import_done.liquid +15 -0
  290. data/app/views/spree/invitation_mailer/invitation_accepted.liquid +9 -0
  291. data/app/views/spree/invitation_mailer/invitation_email.liquid +13 -0
  292. data/app/views/spree/seller_user_mailer/password_reset_email.liquid +14 -0
  293. data/app/views/spree/shared/_mailer_button.html.erb +4 -5
  294. data/app/views/spree/shared/_mailer_hero.html.erb +6 -5
  295. data/app/views/spree/shared/_summary_row.liquid +8 -0
  296. data/app/views/spree/webhook_mailer/endpoint_disabled.liquid +21 -0
  297. data/app/workflows/spree/carts/add_item.rb +4 -4
  298. data/app/workflows/spree/carts/complete.rb +13 -3
  299. data/app/workflows/spree/carts/merge.rb +1 -1
  300. data/app/workflows/spree/carts/recalculate_totals.rb +5 -0
  301. data/app/workflows/spree/carts/upsert_items.rb +18 -9
  302. data/app/workflows/spree/claims/approve.rb +5 -22
  303. data/app/workflows/spree/claims/cancel.rb +5 -21
  304. data/app/workflows/spree/claims/create.rb +15 -0
  305. data/app/workflows/spree/claims/deny.rb +7 -0
  306. data/app/workflows/spree/claims/resolve.rb +34 -31
  307. data/app/workflows/spree/customers/anonymize.rb +3 -4
  308. data/app/workflows/spree/customers/create.rb +1 -1
  309. data/app/workflows/spree/data_requests/fulfill.rb +2 -2
  310. data/app/workflows/spree/deliveries/update_tracking.rb +1 -1
  311. data/app/workflows/spree/email_templates/discard_draft.rb +20 -0
  312. data/app/workflows/spree/email_templates/publish.rb +70 -0
  313. data/app/workflows/spree/email_templates/restore_revision.rb +33 -0
  314. data/app/workflows/spree/email_templates/revert.rb +29 -0
  315. data/app/workflows/spree/email_templates/save_draft.rb +85 -0
  316. data/app/workflows/spree/exchanges/approve.rb +5 -22
  317. data/app/workflows/spree/exchanges/cancel.rb +5 -21
  318. data/app/workflows/spree/exchanges/create.rb +6 -0
  319. data/app/workflows/spree/exchanges/fulfill.rb +75 -51
  320. data/app/workflows/spree/exchanges/receive.rb +6 -65
  321. data/app/workflows/spree/fulfillments/cancel.rb +1 -1
  322. data/app/workflows/spree/fulfillments/create.rb +51 -47
  323. data/app/workflows/spree/fulfillments/fulfill.rb +23 -27
  324. data/app/workflows/spree/fulfillments/mark_delivered.rb +1 -1
  325. data/app/workflows/spree/fulfillments/replacements.rb +59 -0
  326. data/app/workflows/spree/gift_cards/apply.rb +2 -2
  327. data/app/workflows/spree/orders/add_item.rb +5 -1
  328. data/app/workflows/spree/orders/cancel.rb +3 -3
  329. data/app/workflows/spree/orders/complete.rb +16 -8
  330. data/app/workflows/spree/payments/process.rb +2 -2
  331. data/app/workflows/spree/post_sale/approval.rb +35 -0
  332. data/app/workflows/spree/post_sale/cancellation.rb +44 -0
  333. data/app/workflows/spree/post_sale/receipt.rb +92 -0
  334. data/app/workflows/spree/products/nested_attributes.rb +1 -1
  335. data/app/workflows/spree/purchase_orders/cancel.rb +1 -1
  336. data/app/workflows/spree/purchase_orders/close.rb +3 -31
  337. data/app/workflows/spree/purchase_orders/mark_draft.rb +2 -2
  338. data/app/workflows/spree/purchase_orders/mark_ordered.rb +2 -2
  339. data/app/workflows/spree/purchase_orders/receive.rb +1 -1
  340. data/app/workflows/spree/purchase_orders/update.rb +5 -34
  341. data/app/workflows/spree/receivables/closing_short.rb +46 -0
  342. data/app/workflows/spree/receivables/draft_editing.rb +48 -0
  343. data/app/workflows/spree/refunds/create.rb +5 -2
  344. data/app/workflows/spree/refunds/order_payments.rb +14 -2
  345. data/app/workflows/spree/refunds/tax_credit.rb +67 -0
  346. data/app/workflows/spree/returns/approve.rb +5 -22
  347. data/app/workflows/spree/returns/cancel.rb +5 -22
  348. data/app/workflows/spree/returns/create.rb +8 -0
  349. data/app/workflows/spree/returns/receive.rb +5 -76
  350. data/app/workflows/spree/returns/refund.rb +31 -8
  351. data/app/workflows/spree/seller_requirement_submissions/create.rb +1 -2
  352. data/app/workflows/spree/seller_transfers/reverse.rb +28 -1
  353. data/app/workflows/spree/shipping_labels/purchase.rb +8 -8
  354. data/app/workflows/spree/shipping_labels/record.rb +5 -5
  355. data/app/workflows/spree/shipping_labels/refund.rb +2 -2
  356. data/app/workflows/spree/stock_receipts/recording.rb +4 -4
  357. data/app/workflows/spree/stock_transfers/cancel.rb +2 -2
  358. data/app/workflows/spree/stock_transfers/close.rb +3 -30
  359. data/app/workflows/spree/stock_transfers/mark_draft.rb +1 -1
  360. data/app/workflows/spree/stock_transfers/mark_in_transit.rb +3 -3
  361. data/app/workflows/spree/stock_transfers/mark_ready.rb +2 -2
  362. data/app/workflows/spree/stock_transfers/receive.rb +1 -1
  363. data/app/workflows/spree/stock_transfers/update.rb +5 -33
  364. data/config/i18n-tasks.yml +32 -18
  365. data/config/initializers/alba.rb +7 -0
  366. data/config/language_names.csv +264 -0
  367. data/config/locales/ar.yml +811 -0
  368. data/config/locales/be.yml +855 -0
  369. data/config/locales/bg.yml +723 -0
  370. data/config/locales/ca.yml +689 -0
  371. data/config/locales/cs.yml +855 -0
  372. data/config/locales/da.yml +771 -0
  373. data/config/locales/de-CH.yml +248 -0
  374. data/config/locales/de.yml +835 -0
  375. data/config/locales/el.yml +769 -0
  376. data/config/locales/en.yml +37 -503
  377. data/config/locales/es-CL.yml +301 -0
  378. data/config/locales/es-EC.yml +186 -0
  379. data/config/locales/es-MX.yml +334 -0
  380. data/config/locales/es.yml +831 -0
  381. data/config/locales/et.yml +644 -0
  382. data/config/locales/fa.yml +709 -0
  383. data/config/locales/fi.yml +771 -0
  384. data/config/locales/fr.yml +830 -0
  385. data/config/locales/hu.yml +751 -0
  386. data/config/locales/id.yml +756 -0
  387. data/config/locales/it.yml +833 -0
  388. data/config/locales/ja.yml +726 -0
  389. data/config/locales/km.yml +759 -0
  390. data/config/locales/ko.yml +575 -0
  391. data/config/locales/ku.yml +753 -0
  392. data/config/locales/lt.yml +821 -0
  393. data/config/locales/lv.yml +685 -0
  394. data/config/locales/nb.yml +824 -0
  395. data/config/locales/ne.yml +823 -0
  396. data/config/locales/nl.yml +826 -0
  397. data/config/locales/pl.yml +835 -0
  398. data/config/locales/pt-BR.yml +547 -0
  399. data/config/locales/pt.yml +636 -0
  400. data/config/locales/ro.yml +750 -0
  401. data/config/locales/ru.yml +834 -0
  402. data/config/locales/sk.yml +680 -0
  403. data/config/locales/sl-SI.yml +600 -0
  404. data/config/locales/sv.yml +827 -0
  405. data/config/locales/th.yml +745 -0
  406. data/config/locales/tr.yml +777 -0
  407. data/config/locales/uk.yml +836 -0
  408. data/config/locales/vi.yml +768 -0
  409. data/config/locales/zh-CN.yml +786 -0
  410. data/config/locales/zh-TW.yml +834 -0
  411. data/db/migrate/20260925000001_add_replacement_to_spree_fulfillment_items.rb +5 -0
  412. data/db/migrate/20261001000001_add_post_sale_tax.rb +30 -0
  413. data/db/migrate/20261001000001_convert_preferences_to_json.rb +166 -0
  414. data/db/migrate/20261001000001_create_spree_email_templates.rb +52 -0
  415. data/lib/generators/spree/dummy/dummy_generator.rb +0 -9
  416. data/lib/generators/spree/dummy/templates/rails/test.rb +7 -0
  417. data/lib/spree/checkout/default_requirements.rb +37 -13
  418. data/lib/spree/core/configuration.rb +1 -1
  419. data/lib/spree/core/controller_helpers/store.rb +1 -1
  420. data/lib/spree/core/dependencies.rb +5 -4
  421. data/lib/spree/core/emails/escaped_output.rb +60 -0
  422. data/lib/spree/core/engine.rb +48 -167
  423. data/lib/spree/core/permissions/default_catalog.rb +5 -0
  424. data/lib/spree/core/preferences/json_conversion.rb +182 -0
  425. data/lib/spree/core/preferences/masking.rb +4 -1
  426. data/lib/spree/core/preferences/preferable.rb +137 -83
  427. data/lib/spree/core/preferences/preferable_class_methods.rb +81 -146
  428. data/lib/spree/core/previews/import_preview.rb +10 -0
  429. data/lib/spree/core/tax/provider_error.rb +37 -0
  430. data/lib/spree/core/version.rb +1 -1
  431. data/lib/spree/core.rb +85 -370
  432. data/lib/spree/emails/editable_templates.rb +82 -0
  433. data/lib/spree/events/catalog.rb +189 -0
  434. data/lib/spree/events.rb +21 -1
  435. data/lib/spree/hooks.rb +0 -17
  436. data/lib/spree/i18n.rb +32 -15
  437. data/lib/spree/reporting/adapters/live.rb +6 -6
  438. data/lib/spree/reporting/default_vocabulary.rb +22 -10
  439. data/lib/spree/reporting/hydration.rb +1 -1
  440. data/lib/spree/reporting/query.rb +8 -0
  441. data/lib/spree/reporting/schema.rb +10 -10
  442. data/lib/spree/testing_support/editable_email_templates.rb +61 -0
  443. data/lib/spree/testing_support/emails.rb +22 -0
  444. data/lib/spree/testing_support/factories/cart_factory.rb +1 -1
  445. data/lib/spree/testing_support/factories/email_template_factory.rb +28 -0
  446. data/lib/spree/testing_support/factories/order_factory.rb +2 -2
  447. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  448. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  449. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  450. data/lib/spree/testing_support/i18n.rb +3 -94
  451. data/lib/spree/testing_support/lifecycle_events.rb +1 -1
  452. data/lib/spree/testing_support/order_walkthrough.rb +1 -1
  453. data/lib/spree/testing_support/preferences.rb +0 -5
  454. data/lib/spree/testing_support/store.rb +9 -1
  455. data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +45 -0
  456. data/lib/tasks/categories_and_collections.rake +3 -3
  457. data/lib/tasks/core.rake +6 -4
  458. data/lib/tasks/media.rake +3 -3
  459. data/lib/tasks/package_types.rake +1 -1
  460. data/lib/tasks/preferences_json.rake +101 -0
  461. data/spec/fixtures/mailer_views/custom_views_probe_mailer/welcome_email.html.erb +4 -0
  462. metadata +188 -44
  463. data/app/models/acts_as_taggable_on/tag_decorator.rb +0 -10
  464. data/app/models/concerns/spree/has_image_alt_text.rb +0 -18
  465. data/app/models/spree/base_analytics_event_handler.rb +0 -54
  466. data/app/models/spree/invitations/store.rb +0 -6
  467. data/app/models/spree/preference.rb +0 -14
  468. data/app/models/spree/promotion_handler/page.rb +0 -25
  469. data/app/models/spree/promotion_handler/promotion_duplicator.rb +0 -60
  470. data/app/models/spree/stock/differentiator.rb +0 -45
  471. data/app/presenters/spree/filters/options_presenter.rb +0 -47
  472. data/app/services/spree/carts/empty.rb +0 -42
  473. data/app/services/spree/country_to_timezone.rb +0 -273
  474. data/app/services/spree/payments/create.rb +0 -92
  475. data/app/validators/spree/url_validator.rb +0 -23
  476. data/app/views/active_storage/blobs/_blob.html.erb +0 -14
  477. data/app/views/spree/admin_user_mailer/password_reset_email.html.erb +0 -8
  478. data/app/views/spree/export_mailer/export_done.html.erb +0 -7
  479. data/app/views/spree/import_mailer/import_done.html.erb +0 -12
  480. data/app/views/spree/invitation_mailer/invitation_accepted.html.erb +0 -4
  481. data/app/views/spree/invitation_mailer/invitation_email.html.erb +0 -12
  482. data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +0 -8
  483. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -19
  484. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -8
  485. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -399
  486. data/app/views/spree/shared/_mailer_logo.html.erb +0 -41
  487. data/app/views/spree/shared/_purchased_items_styles.html.erb +0 -119
  488. data/app/views/spree/webhook_mailer/endpoint_disabled.html.erb +0 -51
  489. data/app/views/spree/webhook_mailer/endpoint_disabled.text.erb +0 -10
  490. data/app/workflows/spree/fulfillments/purchase_label.rb +0 -40
  491. data/app/workflows/spree/returns/purchase_label.rb +0 -32
  492. data/lib/spree/analytics.rb +0 -11
  493. data/lib/spree/core/preferences/scoped_store.rb +0 -34
  494. data/lib/spree/core/preferences/store.rb +0 -105
  495. data/lib/spree/translation_migrations.rb +0 -52
@@ -8,7 +8,7 @@ module Spree
8
8
  # destination counted in, records why the rest never arrived, and leaves
9
9
  # the outstanding count on each line as the record of the loss.
10
10
  class Close < Spree::Workflow
11
- include Spree::Receivables::IncomingCounter
11
+ include Spree::Receivables::ClosingShort
12
12
 
13
13
  hooks :validate, :after_close
14
14
 
@@ -18,39 +18,12 @@ module Spree
18
18
  # @param reason [String, nil] what happened to the balance
19
19
  def perform(stock_transfer:, reason: nil)
20
20
  super
21
-
22
- stock_transfer.with_lock do
23
- step :ensure_closable
24
- run_hooks :validate
25
- step :uncount_awaited_units
26
- step :close_short
27
- end
28
-
29
- run_hooks :after_close
30
- stock_transfer.publish_event('stock_transfer.received')
31
- success(stock_transfer.reload)
21
+ close
32
22
  end
33
23
 
34
24
  private
35
25
 
36
- def ensure_closable
37
- return if stock_transfer.partially_received?
38
-
39
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_partially_received'))
40
- end
41
-
42
- # The missing units are not going to turn up, so the destination stops
43
- # expecting them; each line's outstanding count keeps the record.
44
- def uncount_awaited_units
45
- uncount_incoming(stock_transfer)
46
- end
47
-
48
- def close_short
49
- now = Time.current
50
- attributes = { status: 'received', received_at: now, closed_short_at: now, close_reason: reason.presence }
51
-
52
- failure(stock_transfer) unless stock_transfer.update(attributes)
53
- end
26
+ def receivable = stock_transfer
54
27
  end
55
28
  end
56
29
  end
@@ -30,7 +30,7 @@ module Spree
30
30
  def ensure_returnable
31
31
  return if stock_transfer.ready_to_ship?
32
32
 
33
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_ready_to_ship'))
33
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_ready_to_ship'))
34
34
  end
35
35
 
36
36
  def return_to_draft
@@ -46,9 +46,9 @@ module Spree
46
46
 
47
47
  def ensure_shippable
48
48
  unless stock_transfer.draft? || stock_transfer.ready_to_ship?
49
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_shippable'))
49
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_shippable'))
50
50
  end
51
- failure(stock_transfer, Spree.t('stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
51
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
52
52
  end
53
53
 
54
54
  # Every line needs enough available stock for the quantity being moved,
@@ -65,7 +65,7 @@ module Spree
65
65
  return if unavailable_items.empty?
66
66
 
67
67
  failure(stock_transfer,
68
- Spree.t('stock_transfer.errors.variants_unavailable', stock: source.name))
68
+ I18n.t('spree.stock_transfer.errors.variants_unavailable', stock: source.name))
69
69
  end
70
70
 
71
71
  def write_shipped_movements
@@ -24,8 +24,8 @@ module Spree
24
24
  private
25
25
 
26
26
  def ensure_draft
27
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_draft')) unless stock_transfer.draft?
28
- failure(stock_transfer, Spree.t('stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
27
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_draft')) unless stock_transfer.draft?
28
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
29
29
  end
30
30
 
31
31
  def mark_ready
@@ -46,7 +46,7 @@ module Spree
46
46
  def ensure_receivable
47
47
  return if stock_transfer.in_flight?
48
48
 
49
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_in_transit'))
49
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_in_transit'))
50
50
  end
51
51
 
52
52
  def line_belongs?(line)
@@ -4,6 +4,8 @@ module Spree
4
4
  # matter of record, so this refuses anything past `draft` rather than
5
5
  # quietly rewriting a document the warehouse is already acting on.
6
6
  class Update < Spree::Workflow
7
+ include Spree::Receivables::DraftEditing
8
+
7
9
  hooks :validate, :after_update
8
10
 
9
11
  # @param stock_transfer [Spree::StockTransfer]
@@ -13,43 +15,13 @@ module Spree
13
15
  # replacing the current lines; nil leaves them alone
14
16
  def perform(stock_transfer:, attributes: {}, items: nil)
15
17
  super
16
-
17
- step :ensure_editable
18
- run_hooks :validate
19
-
20
- ApplicationRecord.transaction do
21
- step :apply_changes
22
- step :save_transfer
23
- end
24
-
25
- run_hooks :after_update
26
- success(stock_transfer.reload)
18
+ edit
27
19
  end
28
20
 
29
21
  private
30
22
 
31
- def ensure_editable
32
- return if stock_transfer.editable?
33
-
34
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_editable'))
35
- end
36
-
37
- # A whole-list replacement rather than a per-line diff: a draft's lines
38
- # are what the merchant is still deciding, and sending the list they
39
- # want is simpler for a client than working out which rows to delete.
40
- def apply_changes
41
- stock_transfer.assign_attributes(attributes) if attributes.present?
42
- return if items.nil?
43
-
44
- stock_transfer.items.destroy_all
45
- Array(items).each do |item|
46
- stock_transfer.items.build(variant: item[:variant], quantity_shipped: item[:quantity_shipped])
47
- end
48
- end
49
-
50
- def save_transfer
51
- failure(stock_transfer) unless stock_transfer.save
52
- end
23
+ def receivable = stock_transfer
24
+ def item_attributes = %i[quantity_shipped]
53
25
  end
54
26
  end
55
27
  end
@@ -14,11 +14,13 @@ data:
14
14
  # adapter: I18n::Tasks::Data::FileSystem
15
15
 
16
16
  # Locale files or `Dir.glob` patterns where translations are read from:
17
+ ## This one config checks every Spree gem: core's keys are used from all of
18
+ ## them, and their own keys from core.
17
19
  read:
18
- ## Default:
19
- # - config/locales/%{locale}.yml
20
- ## More files:
21
- # - config/locales/**/*.%{locale}.yml
20
+ - config/locales/%{locale}.yml
21
+ <% %w[api emails].map { |gem| "../#{gem}" }.concat(Dir['../providers/*']).each do |gem| %>
22
+ - "<%= File.expand_path("#{gem}/config/locales", Dir.pwd) %>/%{locale}.yml"
23
+ <% end %>
22
24
 
23
25
  # Locale files to write new keys to, based on a list of key pattern => file rules. Matched from top to bottom:
24
26
  # `i18n-tasks normalize -p` will force move the keys according to these rules
@@ -52,9 +54,14 @@ data:
52
54
 
53
55
  # Find translate calls
54
56
  search:
55
- ## Paths or `Find.find` patterns to search in:
56
- # paths:
57
- # - app/
57
+ ## Paths or `Find.find` patterns to search in. Core keys are read by every
58
+ ## Spree gem, so all of them are searched.
59
+ paths:
60
+ - app/
61
+ - lib/
62
+ <% (%w[api emails dashboard opentelemetry].map { |gem| "../#{gem}" } + Dir['../providers/*']).product(%w[app lib]).each do |gem, folder| %>
63
+ - "<%= File.expand_path("#{gem}/#{folder}", Dir.pwd) %>"
64
+ <% end %>
58
65
 
59
66
  ## Root directories for relative keys resolution.
60
67
  # relative_roots:
@@ -143,12 +150,18 @@ ignore_missing:
143
150
  - 'unauthorized.default'
144
151
 
145
152
  ## Consider these keys used:
146
- # ignore_unused:
147
- # - 'activerecord.attributes.*'
148
- # - '{devise,kaminari,will_paginate}.*'
149
- # - 'simple_form.{yes,no}'
150
- # - 'simple_form.{placeholders,hints,labels}.*'
151
- # - 'simple_form.{error_notification,required}.:'
153
+ ignore_unused:
154
+ # Read by Rails itself (model names, attribute names, validation messages, formats).
155
+ - 'activerecord.*'
156
+ - 'activemodel.*'
157
+ - 'errors.*'
158
+ - 'number.*'
159
+ # Keys built with interpolation, which the scanner cannot follow.
160
+ - 'spree.reporting.*'
161
+ - 'spree.permissions_catalog.*'
162
+ # Spree::TypeLabels reads <family>_types.<api_type>.{name,description}.
163
+ - 'spree.{collection_rule,commission_rule,delivery_method_rule,order_routing_rule,promotion_action,promotion_rule,seller_requirement}_types.*'
164
+ - 'spree.i18n.this_file_language'
152
165
 
153
166
  ## Exclude these keys from the `i18n-tasks eq-base' report:
154
167
  # ignore_eq_base:
@@ -172,8 +185,9 @@ ignore_missing:
172
185
  # <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
173
186
  # only: %w(*.html.haml *.html.slim),
174
187
  # patterns: [['= title\b', '.page_title']] %>
175
- #
176
- # The PatternMapper can also match key literals via a special %{key} interpolation, e.g.:
177
- #
178
- # <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
179
- # patterns: [['\bSpree\.t[( ]\s*%{key}', 'spree.%{key}']] %>
188
+
189
+ # Email templates translate Spree keys with Liquid's `t` filter, and shared
190
+ # partials take a key to translate (`label: 'some.key', translate: true`).
191
+ <% I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
192
+ only: %w(*.liquid),
193
+ patterns: [['%{key}\s*\|\s*t\b', 'spree.%{key}'], ['\blabel:\s*%{key}', 'spree.%{key}']] %>
@@ -0,0 +1,7 @@
1
+ Alba.backend = :oj_rails
2
+ Alba.inflector = :active_support
3
+
4
+ # Custom types
5
+ Alba.register_type :iso8601, converter: ->(time) { time&.iso8601(3) }, auto_convert: true
6
+ # Decimals and money rendered as their exact string form instead of JSON numbers
7
+ Alba.register_type :string, check: ->(value) { value.is_a?(String) }, converter: ->(value) { value.to_s }, auto_convert: true
@@ -0,0 +1,264 @@
1
+ aa,Afar,Afar
2
+ ab,Abkhazian,Аҧсуа
3
+ af,Afrikaans,Afrikaans
4
+ ak,Akan,Akana
5
+ als,Alemannic,Alemannisch
6
+ am,Amharic,አማርኛ
7
+ an,Aragonese,Aragonés
8
+ ang,Angal,Angal Heneng
9
+ ang,Anglo-Saxon / Old English,Englisc
10
+ ar,Arabic,العربية
11
+ arc,Aramaic,ܣܘܪܬ
12
+ as,Assamese,অসমীয়া
13
+ ast,Asturian,Asturianu
14
+ av,Avar,Авар
15
+ awa,Awadhi,Awadhi
16
+ ay,Aymara,Aymar
17
+ az,Azerbaijani,Azərbaycanca / آذربايجان
18
+ ba,Bashkir,Башҡорт
19
+ bar,Bavarian,Boarisch
20
+ bat-smg,Samogitian,Žemaitėška
21
+ bcl,Bikol,Bikol Central
22
+ be,Belarusian,Беларуская
23
+ be-x-old,Belarusian (Taraškievica),Беларуская (тарашкевіца)
24
+ bg,Bulgarian,Български
25
+ bh,Bihari,भोजपुरी
26
+ bi,Bislama,Bislama
27
+ bm,Bambara,Bamanankan
28
+ bn,Bengali,বাংলা
29
+ bo,Tibetan,བོད་ཡིག / Bod skad
30
+ bpy,Bishnupriya Manipuri,ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী
31
+ br,Breton,Brezhoneg
32
+ brx,Boro,बड़
33
+ bs,Bosnian,Bosanski
34
+ bug,Buginese,ᨅᨔ ᨕᨘᨁᨗ / Basa Ugi
35
+ bxr,Buriat (Russia),Буряад хэлэн
36
+ ca,Catalan,Català
37
+ cdo,Min Dong Chinese,Mìng-dĕ̤ng-ngṳ̄ / 閩東語
38
+ ce,Chechen,Нохчийн
39
+ ceb,Cebuano,Sinugboanong Binisaya
40
+ ch,Chamorro,Chamoru
41
+ cho,Choctaw,Choctaw
42
+ chr,Cherokee,ᏣᎳᎩ
43
+ chy,Cheyenne,Tsetsêhestâhese
44
+ ckb,Kurdish (Sorani),کوردی
45
+ co,Corsican,Corsu
46
+ cr,Cree,Nehiyaw
47
+ cs,Czech,Česky
48
+ csb,Kashubian,Kaszëbsczi
49
+ cu,Old Church Slavonic / Old Bulgarian,словѣньскъ / slověnĭskŭ
50
+ cv,Chuvash,Чăваш
51
+ cy,Welsh,Cymraeg
52
+ da,Danish,Dansk
53
+ de,German,Deutsch
54
+ diq,Dimli,Zazaki
55
+ dsb,Lower Sorbian,Dolnoserbski
56
+ dv,Divehi,ދިވެހިބަސް
57
+ dz,Dzongkha,ཇོང་ཁ
58
+ ee,Ewe,Ɛʋɛ
59
+ el,Greek,Ελληνικά
60
+ en,English,English
61
+ eo,Esperanto,Esperanto
62
+ es,Spanish,Español
63
+ et,Estonian,Eesti
64
+ eu,Basque,Euskara
65
+ ext,Extremaduran,Estremeñu
66
+ fa,Persian,فارسی
67
+ ff,Peul,Fulfulde
68
+ fi,Finnish,Suomi
69
+ fiu-vro,Võro,Võro
70
+ fj,Fijian,Na Vosa Vakaviti
71
+ fo,Faroese,Føroyskt
72
+ fr,French,Français
73
+ frp,Arpitan / Franco-Provençal,Arpitan / francoprovençal
74
+ fur,Friulian,Furlan
75
+ fy,West Frisian,Frysk
76
+ ga,Irish,Gaeilge
77
+ gan,Gan Chinese,贛語
78
+ gbm,Garhwali,गढ़वळी
79
+ gd,Scottish Gaelic,Gàidhlig
80
+ gil,Gilbertese,Taetae ni kiribati
81
+ gl,Galician,Galego
82
+ gn,Guarani,Avañe'ẽ
83
+ got,Gothic,gutisk
84
+ gu,Gujarati,ગુજરાતી
85
+ gv,Manx,Gaelg
86
+ ha,Hausa,هَوُسَ
87
+ hak,Hakka Chinese,客家語/Hak-kâ-ngî
88
+ haw,Hawaiian,Hawai`i
89
+ he,Hebrew,עברית
90
+ hi,Hindi,हिन्दी
91
+ ho,Hiri Motu,Hiri Motu
92
+ hr,Croatian,Hrvatski
93
+ ht,Haitian,Krèyol ayisyen
94
+ hu,Hungarian,Magyar
95
+ hy,Armenian,Հայերեն
96
+ hz,Herero,Otsiherero
97
+ ia,Interlingua,Interlingua
98
+ id,Indonesian,Bahasa Indonesia
99
+ ie,Interlingue,Interlingue
100
+ ig,Igbo,Igbo
101
+ ii,Sichuan Yi,ꆇꉙ / 四川彝语
102
+ ik,Inupiak,Iñupiak
103
+ ilo,Ilokano,Ilokano
104
+ inh,Ingush,ГӀалгӀай
105
+ io,Ido,Ido
106
+ is,Icelandic,Íslenska
107
+ it,Italian,Italiano
108
+ iu,Inuktitut,ᐃᓄᒃᑎᑐᑦ
109
+ ja,Japanese,日本語
110
+ jbo,Lojban,Lojban
111
+ jv,Javanese,Basa Jawa
112
+ ka,Georgian,ქართული
113
+ kg,Kongo,KiKongo
114
+ ki,Kikuyu,Gĩkũyũ
115
+ kj,Kuanyama,Kuanyama
116
+ kk,Kazakh,Қазақша
117
+ kl,Greenlandic,Kalaallisut
118
+ km,Cambodian,ភាសាខ្មែរ
119
+ kn,Kannada,ಕನ್ನಡ
120
+ khw,Khowar,کھوار
121
+ ko,Korean,한국어
122
+ kr,Kanuri,Kanuri
123
+ ks,Kashmiri,कॉशुर / کٲشُر
124
+ ksh,Ripuarian,Ripoarisch
125
+ ku,Kurdish (Kurmanji),Kurdî
126
+ kv,Komi,Коми
127
+ kw,Cornish,Kernewek
128
+ ky,Kirghiz,Kırgızca / Кыргызча
129
+ la,Latin,Latina
130
+ lad,Ladino / Judeo-Spanish,Dzhudezmo / Djudeo-Espanyol
131
+ lan,Lango,Leb Lango / Luo
132
+ lb,Luxembourgish,Lëtzebuergesch
133
+ lg,Ganda,Luganda
134
+ li,Limburgian,Limburgs
135
+ lij,Ligurian,Líguru
136
+ lmo,Lombard,Lumbaart
137
+ ln,Lingala,Lingála
138
+ lo,Laotian,ລາວ / Pha xa lao
139
+ lzz,Laz,Lazuri / ლაზური
140
+ lt,Lithuanian,Lietuvių
141
+ lv,Latvian,Latviešu
142
+ map-bms,Banyumasan,Basa Banyumasan
143
+ mg,Malagasy,Malagasy
144
+ man,Mandarin,官話/官话
145
+ mh,Marshallese,Kajin Majel / Ebon
146
+ mi,Māori,Māori
147
+ min,Minangkabau,Minangkabau
148
+ mk,Macedonian,Македонски
149
+ ml,Malayalam,മലയാളം
150
+ mn,Mongolian,Монгол
151
+ mo,Moldovan,Moldovenească
152
+ mr,Marathi,मराठी
153
+ mrh,Mara,Mara
154
+ ms,Malay,Bahasa Melayu
155
+ mt,Maltese,bil-Malti
156
+ mus,Creek / Muskogee,Mvskoke
157
+ mwl,Mirandese,Mirandés
158
+ my,Burmese,Myanmasa
159
+ na,Nauruan,Dorerin Naoero
160
+ nah,Nahuatl,Nahuatl
161
+ nap,Neapolitan,Nnapulitano
162
+ nd,North Ndebele,Sindebele
163
+ nds,Low German / Low Saxon,Plattdüütsch
164
+ nds-nl,Dutch Low Saxon,Nedersaksisch
165
+ ne,Nepali,नेपाली
166
+ new,Newar,नेपालभाषा / Newah Bhaye
167
+ ng,Ndonga,Oshiwambo
168
+ nl,Dutch,Nederlands
169
+ nn,Norwegian Nynorsk,Norsk (nynorsk)
170
+ no,Norwegian,Norsk (bokmål / riksmål)
171
+ nr,South Ndebele,isiNdebele
172
+ nso,Northern Sotho,Sesotho sa Leboa / Sepedi
173
+ nrm,Norman,Nouormand / Normaund
174
+ nv,Navajo,Diné bizaad
175
+ ny,Chichewa,Chi-Chewa
176
+ oc,Occitan,Occitan
177
+ oj,Ojibwa,ᐊᓂᔑᓈᐯᒧᐎᓐ / Anishinaabemowin
178
+ om,Oromo,Oromoo
179
+ or,Oriya,ଓଡ଼ିଆ
180
+ os,Ossetian / Ossetic,Иронау
181
+ pa,Panjabi / Punjabi,ਪੰਜਾਬੀ / پنجابی
182
+ pag,Pangasinan,Pangasinan
183
+ pam,Kapampangan,Kapampangan
184
+ pap,Papiamentu,Papiamentu
185
+ pdc,Pennsylvania German,Deitsch
186
+ pi,Pali,Pāli / पाऴि
187
+ pih,Norfolk,Norfuk
188
+ pl,Polish,Polski
189
+ pms,Piedmontese,Piemontèis
190
+ ps,Pashto,پښتو
191
+ pt,Portuguese,Português
192
+ qu,Quechua,Runa Simi
193
+ rm,Raeto Romance,Rumantsch
194
+ rmy,Romani,Romani / रोमानी
195
+ rn,Kirundi,Kirundi
196
+ ro,Romanian,Română
197
+ roa-rup,Aromanian,Armâneashti
198
+ ru,Russian,Русский
199
+ rw,Rwandi,Kinyarwandi
200
+ sa,Sanskrit,संस्कृतम्
201
+ sc,Sardinian,Sardu
202
+ scn,Sicilian,Sicilianu
203
+ sco,Scots,Scots
204
+ sd,Sindhi,सिंधी / سنڌي‎
205
+ se,Northern Sami,Davvisámegiella
206
+ sg,Sango,Sängö
207
+ sh,Serbo-Croatian,Srpskohrvatski / Српскохрватски
208
+ si,Sinhalese,සිංහල
209
+ simple,Simple English,Simple English
210
+ sk,Slovak,Slovenčina
211
+ sl,Slovenian,Slovenščina
212
+ sm,Samoan,Gagana Samoa
213
+ sn,Shona,chiShona
214
+ so,Somalia,Soomaaliga
215
+ sq,Albanian,Shqip
216
+ sr,Serbian,Српски
217
+ ss,Swati,SiSwati
218
+ st,Southern Sotho,Sesotho
219
+ su,Sundanese,Basa Sunda
220
+ sv,Swedish,Svenska
221
+ sw,Swahili,Kiswahili
222
+ ta,Tamil,தமிழ்
223
+ te,Telugu,తెలుగు
224
+ tet,Tetum,Tetun
225
+ tg,Tajik,Тоҷикӣ
226
+ th,Thai,ไทย / Phasa Thai
227
+ ti,Tigrinya,ትግርኛ
228
+ tk,Turkmen,Туркмен / تركمن
229
+ tl,Tagalog,Tagalog / ᜆᜄᜎᜓᜄ᜔
230
+ tlh,Klingon,tlhIngan-Hol
231
+ tn,Tswana,Setswana
232
+ to,Tonga,Lea Faka-Tonga
233
+ tpi,Tok Pisin,Tok Pisin
234
+ tr,Turkish,Türkçe
235
+ ts,Tsonga,Xitsonga
236
+ tt,Tatar,Tatarça
237
+ tum,Tumbuka,chiTumbuka
238
+ tw,Twi,Twi
239
+ ty,Tahitian,Reo Mā`ohi
240
+ udm,Udmurt,Удмурт кыл
241
+ ug,Uyghur,Uyƣurqə / ئۇيغۇرچە
242
+ uk,Ukrainian,Українська
243
+ ur,Urdu,اردو
244
+ uz,Uzbek,Ўзбек
245
+ uz_AF,Uzbeki Afghanistan,اوزبیکی
246
+ ve,Venda,Tshivenḓa
247
+ vi,Vietnamese,Việtnam
248
+ vec,Venetian,Vèneto
249
+ vls,West Flemish,West-Vlaoms
250
+ vo,Volapük,Volapük
251
+ wa,Walloon,Walon
252
+ war,Waray / Samar-Leyte Visayan,Winaray / Binisaya Lineyte-Samarnon
253
+ wo,Wolof,Wollof
254
+ xal,Kalmyk,Хальмг
255
+ xh,Xhosa,isiXhosa
256
+ xmf,Megrelian,მარგალური
257
+ yi,Yiddish,ייִדיש
258
+ yo,Yoruba,Yorùbá
259
+ za,Zhuang,Cuengh / Tôô / 壮语
260
+ zh,Chinese,中文
261
+ zh-classical,Classical Chinese,文言
262
+ zh-min-nan,Minnan,Bân-lâm-gú
263
+ zh-yue,Cantonese,粵語 / 粤语
264
+ zu,Zulu,isiZulu