create-brainerce-store 1.3.2 → 1.4.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 (38) hide show
  1. package/dist/index.js +62 -5
  2. package/messages/en.json +258 -0
  3. package/messages/he.json +258 -0
  4. package/package.json +3 -2
  5. package/templates/nextjs/base/src/app/account/page.tsx +108 -105
  6. package/templates/nextjs/base/src/app/auth/callback/page.tsx +90 -88
  7. package/templates/nextjs/base/src/app/cart/page.tsx +110 -109
  8. package/templates/nextjs/base/src/app/checkout/page.tsx +46 -43
  9. package/templates/nextjs/base/src/app/layout.tsx.ejs +8 -5
  10. package/templates/nextjs/base/src/app/login/page.tsx +58 -56
  11. package/templates/nextjs/base/src/app/order-confirmation/page.tsx +18 -23
  12. package/templates/nextjs/base/src/app/page.tsx +98 -95
  13. package/templates/nextjs/base/src/app/products/[slug]/page.tsx +16 -12
  14. package/templates/nextjs/base/src/app/products/page.tsx +246 -243
  15. package/templates/nextjs/base/src/app/register/page.tsx +68 -66
  16. package/templates/nextjs/base/src/app/verify-email/page.tsx +293 -291
  17. package/templates/nextjs/base/src/components/account/order-history.tsx +198 -184
  18. package/templates/nextjs/base/src/components/account/profile-section.tsx +75 -73
  19. package/templates/nextjs/base/src/components/auth/login-form.tsx +94 -92
  20. package/templates/nextjs/base/src/components/auth/oauth-buttons.tsx +137 -134
  21. package/templates/nextjs/base/src/components/auth/register-form.tsx +184 -177
  22. package/templates/nextjs/base/src/components/cart/cart-item.tsx +153 -150
  23. package/templates/nextjs/base/src/components/cart/cart-summary.tsx +70 -67
  24. package/templates/nextjs/base/src/components/cart/coupon-input.tsx +134 -131
  25. package/templates/nextjs/base/src/components/cart/reservation-countdown.tsx +103 -100
  26. package/templates/nextjs/base/src/components/checkout/checkout-form.tsx +28 -25
  27. package/templates/nextjs/base/src/components/checkout/delivery-method-step.tsx +6 -4
  28. package/templates/nextjs/base/src/components/checkout/payment-step.tsx +133 -103
  29. package/templates/nextjs/base/src/components/checkout/pickup-step.tsx +15 -11
  30. package/templates/nextjs/base/src/components/checkout/shipping-step.tsx +110 -111
  31. package/templates/nextjs/base/src/components/checkout/tax-display.tsx +7 -4
  32. package/templates/nextjs/base/src/components/layout/footer.tsx +38 -35
  33. package/templates/nextjs/base/src/components/layout/header.tsx +332 -329
  34. package/templates/nextjs/base/src/components/products/product-card.tsx +3 -1
  35. package/templates/nextjs/base/src/components/products/product-grid.tsx +35 -33
  36. package/templates/nextjs/base/src/components/shared/loading-spinner.tsx +32 -30
  37. package/templates/nextjs/base/src/i18n.ts.ejs +5 -0
  38. package/templates/nextjs/base/src/lib/translations.ts +11 -0
package/dist/index.js CHANGED
@@ -31,14 +31,15 @@ var require_package = __commonJS({
31
31
  "package.json"(exports2, module2) {
32
32
  module2.exports = {
33
33
  name: "create-brainerce-store",
34
- version: "1.2.1",
34
+ version: "1.4.0",
35
35
  description: "Scaffold a production-ready e-commerce storefront connected to Brainerce",
36
36
  bin: {
37
37
  "create-brainerce-store": "dist/index.js"
38
38
  },
39
39
  files: [
40
40
  "dist",
41
- "templates"
41
+ "templates",
42
+ "messages"
42
43
  ],
43
44
  scripts: {
44
45
  build: "tsup src/index.ts --format cjs --dts --clean",
@@ -184,6 +185,18 @@ async function runInteractive(defaults) {
184
185
  }
185
186
  });
186
187
  }
188
+ if (!defaults.language) {
189
+ questions.push({
190
+ type: "select",
191
+ name: "language",
192
+ message: "Store language:",
193
+ choices: [
194
+ { title: "English", value: "en" },
195
+ { title: "\u05E2\u05D1\u05E8\u05D9\u05EA (Hebrew)", value: "he" }
196
+ ],
197
+ initial: 0
198
+ });
199
+ }
187
200
  questions.push(
188
201
  {
189
202
  type: "select",
@@ -232,6 +245,7 @@ async function runInteractive(defaults) {
232
245
  return {
233
246
  projectName: defaults.projectName || response.projectName,
234
247
  connectionId: defaults.connectionId || response.connectionId,
248
+ language: response.language || defaults.language || "en",
235
249
  framework: response.framework || defaults.framework || "nextjs",
236
250
  theme: response.theme || defaults.theme || "minimal",
237
251
  pkgManager: response.pkgManager || defaults.pkgManager || detectPackageManager()
@@ -242,6 +256,21 @@ async function runInteractive(defaults) {
242
256
  var import_path = __toESM(require("path"));
243
257
  var import_fs_extra = __toESM(require("fs-extra"));
244
258
  var import_ejs = __toESM(require("ejs"));
259
+ function getDirection(language) {
260
+ return language === "he" ? "rtl" : "ltr";
261
+ }
262
+ function getFontConfig(language) {
263
+ if (language === "he") {
264
+ return {
265
+ fontImport: "import { Rubik } from 'next/font/google';",
266
+ fontVariable: "const font = Rubik({ subsets: ['hebrew', 'latin'] });"
267
+ };
268
+ }
269
+ return {
270
+ fontImport: "import { Inter } from 'next/font/google';",
271
+ fontVariable: "const font = Inter({ subsets: ['latin'] });"
272
+ };
273
+ }
245
274
  async function scaffold(options) {
246
275
  const { projectName, framework, theme } = options;
247
276
  const targetDir = import_path.default.resolve(process.cwd(), projectName);
@@ -257,15 +286,29 @@ async function scaffold(options) {
257
286
  if (!await import_fs_extra.default.pathExists(baseDir)) {
258
287
  throw new Error(`Template "${framework}" not found at ${baseDir}`);
259
288
  }
289
+ const direction = getDirection(options.language);
290
+ const fontConfig = getFontConfig(options.language);
291
+ const ogLocale = options.language === "he" ? "he_IL" : "en_US";
260
292
  const templateVars = {
261
293
  projectName: options.projectName,
262
294
  connectionId: options.connectionId,
263
295
  storeName: options.storeName,
264
296
  currency: options.currency,
265
297
  language: options.language,
298
+ direction,
299
+ fontImport: fontConfig.fontImport,
300
+ fontVariable: fontConfig.fontVariable,
301
+ ogLocale,
266
302
  apiBaseUrl: "https://api.brainerce.com"
267
303
  };
268
304
  await copyWithEjs(baseDir, targetDir, templateVars);
305
+ const messagesRoot = findMessagesDir(__dirname);
306
+ const targetMessages = import_path.default.join(targetDir, "messages");
307
+ await import_fs_extra.default.ensureDir(targetMessages);
308
+ await import_fs_extra.default.copy(
309
+ import_path.default.join(messagesRoot, `${options.language}.json`),
310
+ import_path.default.join(targetMessages, `${options.language}.json`)
311
+ );
269
312
  if (await import_fs_extra.default.pathExists(themeDir)) {
270
313
  const themeCss = import_path.default.join(themeDir, "globals.css");
271
314
  if (await import_fs_extra.default.pathExists(themeCss)) {
@@ -288,6 +331,17 @@ function findTemplatesDir(fromDir) {
288
331
  }
289
332
  return import_path.default.join(fromDir, "..", "templates");
290
333
  }
334
+ function findMessagesDir(fromDir) {
335
+ let dir = fromDir;
336
+ for (let i = 0; i < 5; i++) {
337
+ const candidate = import_path.default.join(dir, "messages");
338
+ if (import_fs_extra.default.pathExistsSync(candidate)) {
339
+ return candidate;
340
+ }
341
+ dir = import_path.default.dirname(dir);
342
+ }
343
+ return import_path.default.join(fromDir, "..", "messages");
344
+ }
291
345
  async function copyWithEjs(srcDir, destDir, vars) {
292
346
  const entries = await import_fs_extra.default.readdir(srcDir, { withFileTypes: true });
293
347
  await import_fs_extra.default.ensureDir(destDir);
@@ -393,26 +447,29 @@ function createSpinner(text) {
393
447
  // src/index.ts
394
448
  var pkg = require_package();
395
449
  var program = new import_commander.Command();
396
- program.name("create-brainerce-store").description("Scaffold a production-ready e-commerce storefront connected to Brainerce").version(pkg.version).argument("[project-name]", "Name for the project directory").option("--connection-id <id>", "Brainerce vibe-coded connection ID (vc_*)").option("--framework <framework>", "Framework to use", "nextjs").option("--theme <theme>", "Theme to apply", "minimal").option("--pkg-manager <manager>", "Package manager (npm, pnpm, yarn, bun)").option("--no-git", "Skip git initialization").option("--no-install", "Skip dependency installation").action(async (projectNameArg, options) => {
450
+ program.name("create-brainerce-store").description("Scaffold a production-ready e-commerce storefront connected to Brainerce").version(pkg.version).argument("[project-name]", "Name for the project directory").option("--connection-id <id>", "Brainerce vibe-coded connection ID (vc_*)").option("--language <lang>", "Store language (en, he)").option("--framework <framework>", "Framework to use", "nextjs").option("--theme <theme>", "Theme to apply", "minimal").option("--pkg-manager <manager>", "Package manager (npm, pnpm, yarn, bun)").option("--no-git", "Skip git initialization").option("--no-install", "Skip dependency installation").action(async (projectNameArg, options) => {
397
451
  try {
398
452
  logger.banner();
399
453
  let projectName = projectNameArg;
400
454
  let connectionId = options.connectionId;
455
+ let language = options.language;
401
456
  let framework = options.framework;
402
457
  let theme = options.theme;
403
458
  let pkgManager = options.pkgManager;
404
459
  const skipGit = options.git === false;
405
460
  const skipInstall = options.install === false;
406
- if (!projectName || !connectionId) {
461
+ if (!projectName || !connectionId || !language) {
407
462
  const answers = await runInteractive({
408
463
  projectName,
409
464
  connectionId,
465
+ language,
410
466
  framework,
411
467
  theme,
412
468
  pkgManager
413
469
  });
414
470
  projectName = answers.projectName;
415
471
  connectionId = answers.connectionId;
472
+ language = answers.language;
416
473
  framework = answers.framework;
417
474
  theme = answers.theme;
418
475
  pkgManager = answers.pkgManager;
@@ -454,7 +511,7 @@ program.name("create-brainerce-store").description("Scaffold a production-ready
454
511
  theme,
455
512
  storeName: storeInfo.name,
456
513
  currency: storeInfo.currency,
457
- language: storeInfo.language
514
+ language: language || storeInfo.language
458
515
  });
459
516
  scaffoldSpinner.succeed(`Scaffolded into ./${projectName}`);
460
517
  if (!skipGit) {
@@ -0,0 +1,258 @@
1
+ {
2
+ "common": {
3
+ "loading": "Loading...",
4
+ "error": "Something went wrong",
5
+ "tryAgain": "Try Again",
6
+ "continueShopping": "Continue Shopping",
7
+ "viewAll": "View all",
8
+ "shopNow": "Shop Now",
9
+ "free": "Free",
10
+ "yes": "Yes",
11
+ "no": "No",
12
+ "total": "Total",
13
+ "subtotal": "Subtotal",
14
+ "discount": "Discount",
15
+ "shipping": "Shipping",
16
+ "pickup": "Pickup",
17
+ "tax": "Tax",
18
+ "sale": "Sale",
19
+ "remove": "Remove",
20
+ "removing": "Removing...",
21
+ "apply": "Apply",
22
+ "saving": "Saving...",
23
+ "qty": "Qty:",
24
+ "noResults": "No results found",
25
+ "all": "All",
26
+ "sortBy": "Sort by:",
27
+ "product": "product",
28
+ "products": "products",
29
+ "item": "item",
30
+ "items": "items",
31
+ "found": "found",
32
+ "day": "day",
33
+ "days": "days",
34
+ "allRightsReserved": "All rights reserved.",
35
+ "store": "Store"
36
+ },
37
+ "nav": {
38
+ "products": "Products",
39
+ "account": "Account",
40
+ "login": "Login",
41
+ "logout": "Logout",
42
+ "searchPlaceholder": "Search products...",
43
+ "categories": "Categories",
44
+ "search": "Search",
45
+ "menu": "Menu"
46
+ },
47
+ "home": {
48
+ "pageTitle": "Home",
49
+ "welcomeTo": "Welcome to",
50
+ "heroSubtitle": "Discover our curated collection of products crafted with care.",
51
+ "featuredProducts": "Featured Products"
52
+ },
53
+ "products": {
54
+ "pageTitle": "Products",
55
+ "allProducts": "All Products",
56
+ "searchPrefix": "Search:",
57
+ "loadMore": "Load More",
58
+ "noProducts": "No products found.",
59
+ "sortNewest": "Newest",
60
+ "sortNameAZ": "Name A-Z",
61
+ "sortNameZA": "Name Z-A",
62
+ "sortPriceLow": "Price: Low to High",
63
+ "sortPriceHigh": "Price: High to Low"
64
+ },
65
+ "productDetail": {
66
+ "notFound": "Product not found.",
67
+ "backToProducts": "Back to products",
68
+ "description": "Description",
69
+ "specifications": "Specifications",
70
+ "addToCart": "Add to Cart",
71
+ "addingToCart": "Adding...",
72
+ "addedToCart": "Added to Cart!",
73
+ "outOfStock": "Out of Stock",
74
+ "decreaseQuantity": "Decrease quantity",
75
+ "increaseQuantity": "Increase quantity"
76
+ },
77
+ "cart": {
78
+ "pageTitle": "Shopping Cart",
79
+ "title": "Shopping Cart",
80
+ "emptyTitle": "Your cart is empty",
81
+ "emptySubtitle": "Looks like you haven't added anything to your cart yet.",
82
+ "proceedToCheckout": "Proceed to Checkout",
83
+ "orderSummary": "Order Summary",
84
+ "taxAtCheckout": "Calculated at checkout"
85
+ },
86
+ "checkout": {
87
+ "pageTitle": "Checkout",
88
+ "title": "Checkout",
89
+ "emptyCart": "Your cart is empty",
90
+ "emptyCartSubtitle": "Add some items to your cart before checking out.",
91
+ "errorTitle": "Checkout Error",
92
+ "returnToCart": "Return to Cart",
93
+ "paymentCanceledBanner": "Payment was canceled. You can try again or change your payment method.",
94
+ "orderSummary": "Order Summary",
95
+ "stepMethod": "Method",
96
+ "stepAddress": "Address",
97
+ "stepShipping": "Shipping",
98
+ "stepPickup": "Pickup",
99
+ "stepPayment": "Payment",
100
+ "deliveryMethod": "Delivery Method",
101
+ "shipToAddress": "Ship to address",
102
+ "shipToAddressDesc": "Delivered to your shipping address",
103
+ "pickUpInStore": "Pick up in store",
104
+ "pickUpInStoreDesc": "Collect from a pickup location",
105
+ "shippingAddress": "Shipping Address",
106
+ "changeMethod": "Change method",
107
+ "editAddress": "Edit address",
108
+ "shippingMethod": "Shipping Method",
109
+ "noShippingOptions": "No shipping options available for this address.",
110
+ "noShippingOptionsHint": "Please try a different address or contact support.",
111
+ "estimatedDelivery": "Estimated delivery:",
112
+ "pickupLocation": "Pickup Location",
113
+ "selectPickupLocation": "Select pickup location",
114
+ "pickupLocationRequired": "Please select a pickup location",
115
+ "yourDetails": "Your details",
116
+ "continueToPayment": "Continue to Payment",
117
+ "changePickup": "Change pickup",
118
+ "changeShipping": "Change shipping",
119
+ "payment": "Payment",
120
+ "preparingPayment": "Preparing payment...",
121
+ "loadingPaymentOptions": "Loading payment options...",
122
+ "paymentNotConfigured": "Payment Not Configured",
123
+ "paymentNotConfiguredDesc": "Payment has not been set up for this store yet. Please contact the store owner.",
124
+ "paymentError": "Payment Error",
125
+ "redirectingToPayment": "Redirecting to payment provider...",
126
+ "redirectingHint": "If you are not redirected automatically, ",
127
+ "clickHere": "click here",
128
+ "calculatedAtCheckout": "Calculated at checkout",
129
+ "calculatedAfterAddress": "Calculated after address entry",
130
+ "noTax": "No tax",
131
+ "failedToStartCheckout": "Unable to start checkout. Please try again.",
132
+ "cartIsEmpty": "Your cart is empty.",
133
+ "failedToInitCheckout": "Failed to initialize checkout",
134
+ "failedToSaveAddress": "Failed to save address",
135
+ "failedToSelectShipping": "Failed to select shipping",
136
+ "failedToSetDeliveryMethod": "Failed to set delivery method",
137
+ "failedToSelectPickup": "Failed to select pickup location",
138
+ "failedToLoadPaymentSdk": "Failed to load payment SDK"
139
+ },
140
+ "checkoutForm": {
141
+ "email": "Email",
142
+ "firstName": "First Name",
143
+ "lastName": "Last Name",
144
+ "country": "Country",
145
+ "selectCountry": "Select country",
146
+ "stateRegion": "State / Region",
147
+ "selectRegion": "Select region",
148
+ "address": "Address",
149
+ "streetAddress": "Street address",
150
+ "apartmentSuite": "Apartment, suite, etc.",
151
+ "aptPlaceholder": "Apt, suite, unit, etc. (optional)",
152
+ "city": "City",
153
+ "postalCode": "Postal Code",
154
+ "phone": "Phone",
155
+ "phonePlaceholder": "+1234567890 (optional)",
156
+ "continueToShipping": "Continue to Shipping",
157
+ "countryPlaceholder": "e.g. US, IL, GB",
158
+ "emailRequired": "Email is required",
159
+ "emailInvalid": "Please enter a valid email",
160
+ "firstNameRequired": "First name is required",
161
+ "lastNameRequired": "Last name is required",
162
+ "addressRequired": "Address is required",
163
+ "cityRequired": "City is required",
164
+ "postalCodeRequired": "Postal code is required",
165
+ "countryRequired": "Country is required"
166
+ },
167
+ "auth": {
168
+ "loginPageTitle": "Sign In",
169
+ "registerPageTitle": "Create Account",
170
+ "welcomeBack": "Welcome back",
171
+ "signInSubtitle": "Sign in to your account to continue",
172
+ "signIn": "Sign In",
173
+ "signingIn": "Signing in...",
174
+ "noAccount": "Don't have an account?",
175
+ "createOne": "Create one",
176
+ "createAccountTitle": "Create an account",
177
+ "joinSubtitle": "Join us to start shopping",
178
+ "creatingAccount": "Creating account...",
179
+ "createAccount": "Create Account",
180
+ "alreadyHaveAccount": "Already have an account?",
181
+ "email": "Email",
182
+ "emailPlaceholder": "you@example.com",
183
+ "password": "Password",
184
+ "passwordPlaceholder": "Enter your password",
185
+ "firstNamePlaceholder": "Jane",
186
+ "lastNamePlaceholder": "Doe",
187
+ "atLeastChars": "At least 6 characters",
188
+ "orContinueWith": "or continue with",
189
+ "tooShort": "Too short",
190
+ "weak": "Weak",
191
+ "fair": "Fair",
192
+ "good": "Good",
193
+ "strong": "Strong",
194
+ "google": "Google",
195
+ "facebook": "Facebook",
196
+ "github": "GitHub",
197
+ "verifyTitle": "Verify your email",
198
+ "verifySubtitle": "Enter the 6-digit code we sent to your email address.",
199
+ "digitAriaLabel": "Digit",
200
+ "verifying": "Verifying...",
201
+ "verifyButton": "Verify Email",
202
+ "didntReceive": "Didn't receive the code?",
203
+ "sending": "Sending...",
204
+ "resendIn": "Resend in",
205
+ "secondsSuffix": "s",
206
+ "resendCode": "Resend code",
207
+ "verificationInvalid": "Verification link invalid",
208
+ "verificationInvalidDesc": "This verification link is missing required information. Please try registering again.",
209
+ "goToRegister": "Go to Register",
210
+ "authFailed": "Authentication failed",
211
+ "authFailedDesc": "Missing authentication parameters. Please try again.",
212
+ "backToLogin": "Back to Login",
213
+ "completingSignIn": "Completing sign in..."
214
+ },
215
+ "account": {
216
+ "pageTitle": "My Account",
217
+ "myAccount": "My Account",
218
+ "signOut": "Sign out",
219
+ "orderHistory": "Order History",
220
+ "noOrders": "No orders yet",
221
+ "noOrdersDesc": "Your order history will appear here after your first purchase.",
222
+ "verified": "Verified",
223
+ "unverified": "Unverified",
224
+ "memberSince": "Member since",
225
+ "orderPrefix": "Order",
226
+ "productFallback": "Product",
227
+ "statusPending": "Pending",
228
+ "statusProcessing": "Processing",
229
+ "statusShipped": "Shipped",
230
+ "statusDelivered": "Delivered",
231
+ "statusCancelled": "Cancelled",
232
+ "statusRefunded": "Refunded"
233
+ },
234
+ "orderConfirmation": {
235
+ "pageTitle": "Order Confirmation",
236
+ "confirming": "Confirming your order...",
237
+ "confirmingHint": "This may take a few seconds.",
238
+ "errorTitle": "Something went wrong",
239
+ "errorChargedHint": "If you were charged, your order may still be processing. Please check your email for a confirmation.",
240
+ "returnHome": "Return Home",
241
+ "thankYou": "Thank you for your order!",
242
+ "orderNumber": "Order Number:",
243
+ "confirmationEmail": "We've sent a confirmation email with your order details.",
244
+ "viewOrders": "View Orders",
245
+ "paymentReceived": "Payment received!",
246
+ "orderProcessing": "Your order is being processed. You'll receive a confirmation email shortly with your order details.",
247
+ "missingCheckoutInfo": "Missing checkout information."
248
+ },
249
+ "reservation": {
250
+ "expired": "Reservation expired. Items may no longer be available.",
251
+ "hurry": "Hurry!",
252
+ "reservedFor": "Items reserved for"
253
+ },
254
+ "coupon": {
255
+ "placeholder": "Coupon code",
256
+ "invalidCode": "Invalid coupon code"
257
+ }
258
+ }
@@ -0,0 +1,258 @@
1
+ {
2
+ "common": {
3
+ "loading": "...טוען",
4
+ "error": "משהו השתבש",
5
+ "tryAgain": "נסו שוב",
6
+ "continueShopping": "המשיכו לקנות",
7
+ "viewAll": "הצג הכל",
8
+ "shopNow": "לקנייה",
9
+ "free": "חינם",
10
+ "yes": "כן",
11
+ "no": "לא",
12
+ "total": "סה\"כ",
13
+ "subtotal": "סיכום ביניים",
14
+ "discount": "הנחה",
15
+ "shipping": "משלוח",
16
+ "pickup": "איסוף",
17
+ "tax": "מע\"מ",
18
+ "sale": "מבצע",
19
+ "remove": "הסרה",
20
+ "removing": "...מסיר",
21
+ "apply": "החל",
22
+ "saving": "...שומר",
23
+ "qty": "כמות:",
24
+ "noResults": "לא נמצאו תוצאות",
25
+ "all": "הכל",
26
+ "sortBy": "מיין לפי:",
27
+ "product": "מוצר",
28
+ "products": "מוצרים",
29
+ "item": "פריט",
30
+ "items": "פריטים",
31
+ "found": "נמצאו",
32
+ "day": "יום",
33
+ "days": "ימים",
34
+ "allRightsReserved": "כל הזכויות שמורות.",
35
+ "store": "חנות"
36
+ },
37
+ "nav": {
38
+ "products": "מוצרים",
39
+ "account": "חשבון",
40
+ "login": "התחברות",
41
+ "logout": "התנתקות",
42
+ "searchPlaceholder": "...חיפוש מוצרים",
43
+ "categories": "קטגוריות",
44
+ "search": "חיפוש",
45
+ "menu": "תפריט"
46
+ },
47
+ "home": {
48
+ "pageTitle": "דף הבית",
49
+ "welcomeTo": "ברוכים הבאים ל",
50
+ "heroSubtitle": "גלו את מגוון המוצרים שלנו, שנבחרו בקפידה עבורכם.",
51
+ "featuredProducts": "מוצרים מובילים"
52
+ },
53
+ "products": {
54
+ "pageTitle": "מוצרים",
55
+ "allProducts": "כל המוצרים",
56
+ "searchPrefix": "חיפוש:",
57
+ "loadMore": "הצג עוד",
58
+ "noProducts": "לא נמצאו מוצרים.",
59
+ "sortNewest": "חדש ביותר",
60
+ "sortNameAZ": "שם א-ת",
61
+ "sortNameZA": "שם ת-א",
62
+ "sortPriceLow": "מחיר: מהנמוך לגבוה",
63
+ "sortPriceHigh": "מחיר: מהגבוה לנמוך"
64
+ },
65
+ "productDetail": {
66
+ "notFound": "המוצר לא נמצא.",
67
+ "backToProducts": "חזרה למוצרים",
68
+ "description": "תיאור",
69
+ "specifications": "מפרט",
70
+ "addToCart": "הוסף לעגלה",
71
+ "addingToCart": "...מוסיף",
72
+ "addedToCart": "נוסף לעגלה!",
73
+ "outOfStock": "אזל מהמלאי",
74
+ "decreaseQuantity": "הפחת כמות",
75
+ "increaseQuantity": "הגדל כמות"
76
+ },
77
+ "cart": {
78
+ "pageTitle": "עגלת קניות",
79
+ "title": "עגלת קניות",
80
+ "emptyTitle": "העגלה שלך ריקה",
81
+ "emptySubtitle": "נראה שעדיין לא הוספת מוצרים לעגלה.",
82
+ "proceedToCheckout": "המשך לתשלום",
83
+ "orderSummary": "סיכום הזמנה",
84
+ "taxAtCheckout": "יחושב בקופה"
85
+ },
86
+ "checkout": {
87
+ "pageTitle": "תשלום",
88
+ "title": "תשלום",
89
+ "emptyCart": "העגלה שלך ריקה",
90
+ "emptyCartSubtitle": "הוסיפו מוצרים לעגלה לפני המשך לתשלום.",
91
+ "errorTitle": "שגיאה בתשלום",
92
+ "returnToCart": "חזרה לעגלה",
93
+ "paymentCanceledBanner": "התשלום בוטל. ניתן לנסות שוב או לשנות אמצעי תשלום.",
94
+ "orderSummary": "סיכום הזמנה",
95
+ "stepMethod": "שיטה",
96
+ "stepAddress": "כתובת",
97
+ "stepShipping": "משלוח",
98
+ "stepPickup": "איסוף",
99
+ "stepPayment": "תשלום",
100
+ "deliveryMethod": "שיטת משלוח",
101
+ "shipToAddress": "משלוח לכתובת",
102
+ "shipToAddressDesc": "יישלח לכתובת המשלוח שלך",
103
+ "pickUpInStore": "איסוף מהחנות",
104
+ "pickUpInStoreDesc": "איסוף מנקודת איסוף",
105
+ "shippingAddress": "כתובת למשלוח",
106
+ "changeMethod": "שנה שיטה",
107
+ "editAddress": "ערוך כתובת",
108
+ "shippingMethod": "שיטת משלוח",
109
+ "noShippingOptions": "אין אפשרויות משלוח זמינות לכתובת זו.",
110
+ "noShippingOptionsHint": "נסו כתובת אחרת או פנו לתמיכה.",
111
+ "estimatedDelivery": "זמן משלוח משוער:",
112
+ "pickupLocation": "נקודת איסוף",
113
+ "selectPickupLocation": "בחרו נקודת איסוף",
114
+ "pickupLocationRequired": "יש לבחור נקודת איסוף",
115
+ "yourDetails": "הפרטים שלך",
116
+ "continueToPayment": "המשך לתשלום",
117
+ "changePickup": "שנה איסוף",
118
+ "changeShipping": "שנה משלוח",
119
+ "payment": "תשלום",
120
+ "preparingPayment": "...מכין תשלום",
121
+ "loadingPaymentOptions": "...טוען אפשרויות תשלום",
122
+ "paymentNotConfigured": "תשלום לא מוגדר",
123
+ "paymentNotConfiguredDesc": "התשלום עדיין לא הוגדר לחנות זו. אנא פנו לבעל החנות.",
124
+ "paymentError": "שגיאת תשלום",
125
+ "redirectingToPayment": "...מפנה לספק התשלום",
126
+ "redirectingHint": "אם אינכם מופנים אוטומטית, ",
127
+ "clickHere": "לחצו כאן",
128
+ "calculatedAtCheckout": "יחושב בקופה",
129
+ "calculatedAfterAddress": "יחושב לאחר הזנת כתובת",
130
+ "noTax": "ללא מע\"מ",
131
+ "failedToStartCheckout": "לא ניתן להתחיל תשלום. נסו שוב.",
132
+ "cartIsEmpty": "העגלה שלך ריקה.",
133
+ "failedToInitCheckout": "שגיאה באתחול התשלום",
134
+ "failedToSaveAddress": "שגיאה בשמירת הכתובת",
135
+ "failedToSelectShipping": "שגיאה בבחירת המשלוח",
136
+ "failedToSetDeliveryMethod": "שגיאה בהגדרת שיטת המשלוח",
137
+ "failedToSelectPickup": "שגיאה בבחירת נקודת האיסוף",
138
+ "failedToLoadPaymentSdk": "שגיאה בטעינת מערכת התשלום"
139
+ },
140
+ "checkoutForm": {
141
+ "email": "אימייל",
142
+ "firstName": "שם פרטי",
143
+ "lastName": "שם משפחה",
144
+ "country": "מדינה",
145
+ "selectCountry": "בחרו מדינה",
146
+ "stateRegion": "מחוז / אזור",
147
+ "selectRegion": "בחרו מחוז",
148
+ "address": "כתובת",
149
+ "streetAddress": "רחוב ומספר",
150
+ "apartmentSuite": "דירה, קומה וכו׳",
151
+ "aptPlaceholder": "דירה, קומה, כניסה (אופציונלי)",
152
+ "city": "עיר",
153
+ "postalCode": "מיקוד",
154
+ "phone": "טלפון",
155
+ "phonePlaceholder": "+972501234567 (אופציונלי)",
156
+ "continueToShipping": "המשך למשלוח",
157
+ "countryPlaceholder": "לדוגמה: IL, US, GB",
158
+ "emailRequired": "אימייל הוא שדה חובה",
159
+ "emailInvalid": "כתובת אימייל לא תקינה",
160
+ "firstNameRequired": "שם פרטי הוא שדה חובה",
161
+ "lastNameRequired": "שם משפחה הוא שדה חובה",
162
+ "addressRequired": "כתובת היא שדה חובה",
163
+ "cityRequired": "עיר היא שדה חובה",
164
+ "postalCodeRequired": "מיקוד הוא שדה חובה",
165
+ "countryRequired": "מדינה היא שדה חובה"
166
+ },
167
+ "auth": {
168
+ "loginPageTitle": "התחברות",
169
+ "registerPageTitle": "יצירת חשבון",
170
+ "welcomeBack": "ברוכים השבים",
171
+ "signInSubtitle": "התחברו לחשבון שלכם כדי להמשיך",
172
+ "signIn": "התחברות",
173
+ "signingIn": "...מתחבר",
174
+ "noAccount": "אין לכם חשבון?",
175
+ "createOne": "צרו חשבון",
176
+ "createAccountTitle": "יצירת חשבון",
177
+ "joinSubtitle": "הצטרפו אלינו והתחילו לקנות",
178
+ "creatingAccount": "...יוצר חשבון",
179
+ "createAccount": "צור חשבון",
180
+ "alreadyHaveAccount": "כבר יש לכם חשבון?",
181
+ "email": "אימייל",
182
+ "emailPlaceholder": "you@example.com",
183
+ "password": "סיסמה",
184
+ "passwordPlaceholder": "הזינו סיסמה",
185
+ "firstNamePlaceholder": "ישראל",
186
+ "lastNamePlaceholder": "ישראלי",
187
+ "atLeastChars": "לפחות 6 תווים",
188
+ "orContinueWith": "או המשיכו עם",
189
+ "tooShort": "קצרה מדי",
190
+ "weak": "חלשה",
191
+ "fair": "סבירה",
192
+ "good": "טובה",
193
+ "strong": "חזקה",
194
+ "google": "Google",
195
+ "facebook": "Facebook",
196
+ "github": "GitHub",
197
+ "verifyTitle": "אימות כתובת אימייל",
198
+ "verifySubtitle": "הזינו את הקוד בן 6 הספרות שנשלח לכתובת האימייל שלכם.",
199
+ "digitAriaLabel": "ספרה",
200
+ "verifying": "...מאמת",
201
+ "verifyButton": "אימות אימייל",
202
+ "didntReceive": "לא קיבלתם את הקוד?",
203
+ "sending": "...שולח",
204
+ "resendIn": "שליחה חוזרת בעוד",
205
+ "secondsSuffix": "שנ׳",
206
+ "resendCode": "שלחו שוב",
207
+ "verificationInvalid": "קישור אימות לא תקין",
208
+ "verificationInvalidDesc": "קישור האימות חסר מידע נדרש. אנא נסו להירשם מחדש.",
209
+ "goToRegister": "מעבר להרשמה",
210
+ "authFailed": "ההתחברות נכשלה",
211
+ "authFailedDesc": "חסרים פרמטרי התחברות. אנא נסו שוב.",
212
+ "backToLogin": "חזרה להתחברות",
213
+ "completingSignIn": "...משלים התחברות"
214
+ },
215
+ "account": {
216
+ "pageTitle": "החשבון שלי",
217
+ "myAccount": "החשבון שלי",
218
+ "signOut": "התנתקות",
219
+ "orderHistory": "היסטוריית הזמנות",
220
+ "noOrders": "אין הזמנות עדיין",
221
+ "noOrdersDesc": "היסטוריית ההזמנות שלך תופיע כאן לאחר הרכישה הראשונה.",
222
+ "verified": "מאומת",
223
+ "unverified": "לא מאומת",
224
+ "memberSince": "חבר מאז",
225
+ "orderPrefix": "הזמנה",
226
+ "productFallback": "מוצר",
227
+ "statusPending": "ממתין",
228
+ "statusProcessing": "בטיפול",
229
+ "statusShipped": "נשלח",
230
+ "statusDelivered": "נמסר",
231
+ "statusCancelled": "בוטל",
232
+ "statusRefunded": "הוחזר"
233
+ },
234
+ "orderConfirmation": {
235
+ "pageTitle": "אישור הזמנה",
236
+ "confirming": "...מאשר את ההזמנה",
237
+ "confirmingHint": "זה עשוי לקחת מספר שניות.",
238
+ "errorTitle": "משהו השתבש",
239
+ "errorChargedHint": "אם חויבתם, ייתכן שההזמנה עדיין מעובדת. בדקו את האימייל שלכם לקבלת אישור.",
240
+ "returnHome": "חזרה לדף הבית",
241
+ "thankYou": "תודה על ההזמנה!",
242
+ "orderNumber": "מספר הזמנה:",
243
+ "confirmationEmail": "שלחנו אימייל אישור עם פרטי ההזמנה.",
244
+ "viewOrders": "צפייה בהזמנות",
245
+ "paymentReceived": "התשלום התקבל!",
246
+ "orderProcessing": "ההזמנה שלך בעיבוד. תקבלו בקרוב אימייל אישור עם פרטי ההזמנה.",
247
+ "missingCheckoutInfo": "חסר מידע תשלום."
248
+ },
249
+ "reservation": {
250
+ "expired": "השריון פג. ייתכן שהמוצרים כבר לא זמינים.",
251
+ "hurry": "מהרו!",
252
+ "reservedFor": "המוצרים שמורים למשך"
253
+ },
254
+ "coupon": {
255
+ "placeholder": "קוד קופון",
256
+ "invalidCode": "קוד קופון לא תקין"
257
+ }
258
+ }