openemail 0.0.1

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 (66) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +183 -0
  3. data/lib/openemail/api_paths.rb +249 -0
  4. data/lib/openemail/client.rb +69 -0
  5. data/lib/openemail/constants.rb +851 -0
  6. data/lib/openemail/credentials.rb +53 -0
  7. data/lib/openemail/decode.rb +34 -0
  8. data/lib/openemail/defaults.rb +111 -0
  9. data/lib/openemail/endpoint.rb +144 -0
  10. data/lib/openemail/errors.rb +121 -0
  11. data/lib/openemail/http.rb +172 -0
  12. data/lib/openemail/languages.rb +42 -0
  13. data/lib/openemail/pagination.rb +63 -0
  14. data/lib/openemail/protocol.rb +169 -0
  15. data/lib/openemail/raw_body.rb +83 -0
  16. data/lib/openemail/request_path.rb +50 -0
  17. data/lib/openemail/resource.rb +70 -0
  18. data/lib/openemail/resources/account.rb +64 -0
  19. data/lib/openemail/resources/addresses.rb +38 -0
  20. data/lib/openemail/resources/analytics.rb +17 -0
  21. data/lib/openemail/resources/app_host.rb +23 -0
  22. data/lib/openemail/resources/audiences.rb +90 -0
  23. data/lib/openemail/resources/billing.rb +64 -0
  24. data/lib/openemail/resources/branding.rb +24 -0
  25. data/lib/openemail/resources/broadcasts.rb +65 -0
  26. data/lib/openemail/resources/calendar.rb +59 -0
  27. data/lib/openemail/resources/chats.rb +31 -0
  28. data/lib/openemail/resources/contacts.rb +111 -0
  29. data/lib/openemail/resources/dns_connections.rb +19 -0
  30. data/lib/openemail/resources/domains.rb +153 -0
  31. data/lib/openemail/resources/drafts.rb +35 -0
  32. data/lib/openemail/resources/emails.rb +100 -0
  33. data/lib/openemail/resources/encryption.rb +19 -0
  34. data/lib/openemail/resources/exports.rb +27 -0
  35. data/lib/openemail/resources/files.rb +95 -0
  36. data/lib/openemail/resources/forms.rb +111 -0
  37. data/lib/openemail/resources/imports.rb +86 -0
  38. data/lib/openemail/resources/keys.rb +127 -0
  39. data/lib/openemail/resources/labels.rb +39 -0
  40. data/lib/openemail/resources/languages.rb +11 -0
  41. data/lib/openemail/resources/me.rb +19 -0
  42. data/lib/openemail/resources/members.rb +74 -0
  43. data/lib/openemail/resources/provider_imports.rb +40 -0
  44. data/lib/openemail/resources/roles.rb +39 -0
  45. data/lib/openemail/resources/rules.rb +57 -0
  46. data/lib/openemail/resources/security.rb +19 -0
  47. data/lib/openemail/resources/senders.rb +15 -0
  48. data/lib/openemail/resources/settings.rb +16 -0
  49. data/lib/openemail/resources/subscriptions.rb +30 -0
  50. data/lib/openemail/resources/support.rb +11 -0
  51. data/lib/openemail/resources/suppressions.rb +31 -0
  52. data/lib/openemail/resources/temp_mail.rb +67 -0
  53. data/lib/openemail/resources/templates.rb +151 -0
  54. data/lib/openemail/resources/threads.rb +104 -0
  55. data/lib/openemail/resources/tools.rb +19 -0
  56. data/lib/openemail/resources/tracking.rb +63 -0
  57. data/lib/openemail/resources/webhooks.rb +142 -0
  58. data/lib/openemail/resources/workspaces.rb +28 -0
  59. data/lib/openemail/results.rb +33 -0
  60. data/lib/openemail/transport.rb +272 -0
  61. data/lib/openemail/update_notice.rb +69 -0
  62. data/lib/openemail/version.rb +5 -0
  63. data/lib/openemail/webhook.rb +82 -0
  64. data/lib/openemail/wire.rb +95 -0
  65. data/lib/openemail.rb +125 -0
  66. metadata +109 -0
@@ -0,0 +1,851 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenEmail
4
+ ADDRESS_FORWARD_CONSENT_STATUSES = {
5
+ SENT: "sent",
6
+ ALREADY_CONFIRMED: "already-confirmed",
7
+ REVOKED: "revoked",
8
+ TOO_SOON: "too-soon",
9
+ SEND_FAILED: "send-failed"
10
+ }.freeze
11
+
12
+ ADDRESS_FORWARD_STATUSES = {LIVE: "live", PENDING: "pending", REFUSED: "refused", PAUSED: "paused"}.freeze
13
+
14
+ ADDRESS_MEMBER_VIAS = {
15
+ OWNER: "owner",
16
+ EVERY_ADDRESS: "every-address",
17
+ WHOLE_DOMAIN: "whole-domain",
18
+ DIRECT: "direct"
19
+ }.freeze
20
+
21
+ API_SCOPES = {
22
+ EMAILS_SEND: "emails:send",
23
+ EMAILS_READ: "emails:read",
24
+ DRAFTS_READ: "drafts:read",
25
+ DRAFTS_WRITE: "drafts:write",
26
+ THREADS_READ: "threads:read",
27
+ THREADS_WRITE: "threads:write",
28
+ FILES_READ: "files:read",
29
+ FILES_WRITE: "files:write",
30
+ LABELS_READ: "labels:read",
31
+ LABELS_WRITE: "labels:write",
32
+ CONTACTS_READ: "contacts:read",
33
+ CONTACTS_WRITE: "contacts:write",
34
+ AUDIENCES_READ: "audiences:read",
35
+ AUDIENCES_WRITE: "audiences:write",
36
+ CALENDAR_READ: "calendar:read",
37
+ CALENDAR_WRITE: "calendar:write",
38
+ TEMPLATES_READ: "templates:read",
39
+ TEMPLATES_WRITE: "templates:write",
40
+ DOMAINS_READ: "domains:read",
41
+ DOMAINS_WRITE: "domains:write",
42
+ WEBHOOKS_READ: "webhooks:read",
43
+ WEBHOOKS_WRITE: "webhooks:write",
44
+ RULES_READ: "rules:read",
45
+ RULES_WRITE: "rules:write",
46
+ CONNECTIONS_READ: "connections:read",
47
+ MEMBERS_READ: "members:read",
48
+ MEMBERS_WRITE: "members:write",
49
+ ROLES_READ: "roles:read",
50
+ ROLES_WRITE: "roles:write",
51
+ SETTINGS_READ: "settings:read",
52
+ SETTINGS_WRITE: "settings:write",
53
+ KEYS_WRITE: "keys:write",
54
+ KEYS_READ: "keys:read",
55
+ KEYS_MANAGE: "keys:manage",
56
+ FORMS_READ: "forms:read",
57
+ FORMS_WRITE: "forms:write",
58
+ BILLING_READ: "billing:read",
59
+ BILLING_WRITE: "billing:write",
60
+ ACCOUNT_READ: "account:read",
61
+ ACCOUNT_WRITE: "account:write"
62
+ }.freeze
63
+
64
+ APP_HOST_STATUSES = {NONE: "none", PENDING: "pending", ACTIVE: "active", FAILED: "failed"}.freeze
65
+
66
+ AUDIENCE_MEMBER_STATUSES = {SUBSCRIBED: "subscribed", UNSUBSCRIBED: "unsubscribed"}.freeze
67
+
68
+ BILLING_ALERT_KINDS = {
69
+ PAYMENT_FAILED: "payment_failed",
70
+ PAY_AS_YOU_GO_PAUSED: "pay_as_you_go_paused",
71
+ SENDING_PAUSED: "sending_paused",
72
+ SPEND_LIMIT_REACHED: "spend_limit_reached",
73
+ AI_USED_UP: "ai_used_up",
74
+ PLAN_ENDING: "plan_ending",
75
+ SENDS_NEARLY_USED: "sends_nearly_used",
76
+ SPEND_NEARLY_REACHED: "spend_nearly_reached",
77
+ UPCOMING_CHARGE: "upcoming_charge"
78
+ }.freeze
79
+
80
+ BILLING_ALERT_SEVERITIES = {BLOCKED: "blocked", WARNING: "warning", INFO: "info"}.freeze
81
+
82
+ BILLING_ALERT_TARGETS = {BILLING: "billing", USAGE: "usage"}.freeze
83
+
84
+ BILLING_INTERVALS = {MONTH: "month", YEAR: "year"}.freeze
85
+
86
+ BILLING_INVOICE_SORTS = {NEWEST: "newest", OLDEST: "oldest"}.freeze
87
+
88
+ BILLING_INVOICE_STARTS = {READY: "ready", STARTED: "started", REFUSED: "refused"}.freeze
89
+
90
+ BILLING_INVOICE_STATUSES = {
91
+ DRAFT: "draft",
92
+ PENDING: "pending",
93
+ PAID: "paid",
94
+ REFUNDED: "refunded",
95
+ PARTIALLY_REFUNDED: "partially_refunded",
96
+ VOID: "void"
97
+ }.freeze
98
+
99
+ BILLING_THEMES = {LIGHT: "light", DARK: "dark"}.freeze
100
+
101
+ BILLING_USAGE_WINDOWS = {ALL: "all"}.freeze
102
+
103
+ BIMI_STATUSES = {PRESENT: "present", PARTIAL: "partial", ABSENT: "absent", INVALID: "invalid"}.freeze
104
+
105
+ BRAND_FONT_IDS = {
106
+ SYSTEM: "system",
107
+ ARIAL: "arial",
108
+ HELVETICA: "helvetica",
109
+ VERDANA: "verdana",
110
+ TAHOMA: "tahoma",
111
+ TREBUCHET_MS: "trebuchet-ms",
112
+ GEORGIA: "georgia",
113
+ TIMES_NEW_ROMAN: "times-new-roman",
114
+ COURIER_NEW: "courier-new",
115
+ DM_SANS: "dm-sans",
116
+ INTER: "inter",
117
+ ROBOTO: "roboto",
118
+ OPEN_SANS: "open-sans",
119
+ LATO: "lato",
120
+ MONTSERRAT: "montserrat",
121
+ POPPINS: "poppins",
122
+ NUNITO: "nunito",
123
+ WORK_SANS: "work-sans",
124
+ SOURCE_SANS_3: "source-sans-3",
125
+ IBM_PLEX_SANS: "ibm-plex-sans",
126
+ MERRIWEATHER: "merriweather",
127
+ PLAYFAIR_DISPLAY: "playfair-display",
128
+ INSTRUMENT_SERIF: "instrument-serif",
129
+ JETBRAINS_MONO: "jetbrains-mono",
130
+ DM_MONO: "dm-mono",
131
+ GEIST_MONO: "geist-mono"
132
+ }.freeze
133
+
134
+ BRAND_IMAGE_TYPES = {
135
+ SVG: "image/svg+xml",
136
+ PNG: "image/png",
137
+ JPEG: "image/jpeg",
138
+ WEBP: "image/webp",
139
+ GIF: "image/gif"
140
+ }.freeze
141
+
142
+ BRAND_IMAGE_VARIANTS = {
143
+ MARK: "mark",
144
+ WORDMARK: "wordmark",
145
+ WORDMARK_DARK: "wordmark-dark",
146
+ LOGIN_BACKGROUND: "login-background"
147
+ }.freeze
148
+
149
+ BROADCAST_RECIPIENT_FILTERS = {
150
+ PENDING: "pending",
151
+ SENT: "sent",
152
+ DELIVERED: "delivered",
153
+ OPENED: "opened",
154
+ NOT_OPENED: "not_opened",
155
+ CLICKED: "clicked",
156
+ BOUNCED: "bounced",
157
+ COMPLAINED: "complained",
158
+ FAILED: "failed",
159
+ UNSUBSCRIBED: "unsubscribed"
160
+ }.freeze
161
+
162
+ BROADCAST_STATUSES = {
163
+ SCHEDULED: "scheduled",
164
+ QUEUED: "queued",
165
+ SENDING: "sending",
166
+ SENT: "sent",
167
+ CANCELLED: "cancelled",
168
+ FAILED: "failed"
169
+ }.freeze
170
+
171
+ CALENDAR_REMINDER_ACTIONS = {DISPLAY: "DISPLAY", EMAIL: "EMAIL", AUDIO: "AUDIO"}.freeze
172
+
173
+ CALENDAR_RESPONSES = {ACCEPTED: "ACCEPTED", DECLINED: "DECLINED", TENTATIVE: "TENTATIVE"}.freeze
174
+
175
+ CALENDAR_TRANSPARENCIES = {OPAQUE: "OPAQUE", TRANSPARENT: "TRANSPARENT"}.freeze
176
+
177
+ CALENDAR_VISIBILITIES = {PUBLIC: "PUBLIC", PRIVATE: "PRIVATE", CONFIDENTIAL: "CONFIDENTIAL"}.freeze
178
+
179
+ CHAT_SORTS = {NEWEST: "newest", OLDEST: "oldest", TITLE: "title"}.freeze
180
+
181
+ CONNECTED_APP_KINDS = {APP: "app", CLI: "cli"}.freeze
182
+
183
+ CONNECTED_APP_STATUSES = {
184
+ ACTIVE: "active",
185
+ EXPIRED: "expired",
186
+ NEEDS_APPROVAL: "needs-approval",
187
+ ACCESS_LOST: "access-lost"
188
+ }.freeze
189
+
190
+ CONSOLE_PERMISSIONS = {
191
+ ADDRESSES_ALL: "addresses:all",
192
+ API_KEYS_READ: "api-keys:read",
193
+ API_KEYS_WRITE: "api-keys:write",
194
+ BILLING_READ: "billing:read",
195
+ BILLING_WRITE: "billing:write",
196
+ WORKSPACE_MANAGE: "workspace:manage"
197
+ }.freeze
198
+
199
+ CONTACT_BLOCK_LISTS = {BLOCKED_SENDERS: "blockedSenders", BLOCKED_DOMAINS: "blockedDomains"}.freeze
200
+
201
+ CONTACT_PHOTO_TYPES = {PNG: "image/png", JPEG: "image/jpeg", WEBP: "image/webp", GIF: "image/gif"}.freeze
202
+
203
+ CONTACT_THREAD_SORTS = {NEWEST: "newest", OLDEST: "oldest", SENDER: "sender", SUBJECT: "subject"}.freeze
204
+
205
+ CREDENTIAL_KINDS = {API_KEY: "apiKey", OAUTH: "oauth"}.freeze
206
+
207
+ DELIVERABILITY_CHECK_IDS = {MX: "mx", SPF: "spf", DKIM: "dkim", DMARC: "dmarc", BIMI: "bimi"}.freeze
208
+
209
+ DELIVERABILITY_CHECK_STATUSES = {PASS: "pass", WARN: "warn", FAIL: "fail", ABSENT: "absent"}.freeze
210
+
211
+ DELIVERABILITY_GRADES = {A: "A", B: "B", C: "C", D: "D", F: "F"}.freeze
212
+
213
+ DNS_CONNECTION_STATUSES = {ACTIVE: "active", NEEDS_REAUTH: "needs-reauth", REVOKED: "revoked", ERROR: "error"}.freeze
214
+
215
+ DNS_PROVISION_STATES = {
216
+ UNMANAGED: "unmanaged",
217
+ READY: "ready",
218
+ AWAITING_SYNC: "awaiting-sync",
219
+ AWAITING_SIGNING: "awaiting-signing",
220
+ CONFLICT: "conflict",
221
+ BLOCKED: "blocked"
222
+ }.freeze
223
+
224
+ DNS_SYNC_OUTCOMES = {SYNCED: "synced", REFUSED: "refused"}.freeze
225
+
226
+ DNS_SYNC_PURPOSES = {
227
+ DMARC: "dmarc",
228
+ TRACKING: "tracking",
229
+ STORAGE: "storage",
230
+ BIMI: "bimi",
231
+ APP_HOST: "app-host"
232
+ }.freeze
233
+
234
+ DNS_ZONE_RESOLUTION_KINDS = {RESOLVED: "resolved", AMBIGUOUS: "ambiguous", NONE: "none", UNUSABLE: "unusable"}.freeze
235
+
236
+ DOMAIN_ADDRESS_DESTINATIONS = {MAILBOX: "mailbox", FORWARD: "forward"}.freeze
237
+
238
+ DOMAIN_DMARC_POLICIES = {NONE: "none", QUARANTINE: "quarantine", REJECT: "reject"}.freeze
239
+
240
+ DOMAIN_DMARC_STAGES = {
241
+ MISSING: "missing",
242
+ INVALID: "invalid",
243
+ MONITOR: "monitor",
244
+ QUARANTINE: "quarantine",
245
+ REJECT: "reject"
246
+ }.freeze
247
+
248
+ DOMAIN_LOGO_MARK_KINDS = {VERIFIED: "verified", COMMON: "common", UNKNOWN: "unknown"}.freeze
249
+
250
+ DOMAIN_LOGO_RECORD_OUTCOMES = {
251
+ PUBLISHED: "published",
252
+ MANUAL: "manual",
253
+ BLOCKED: "blocked",
254
+ BUSY: "busy",
255
+ FAILED: "failed"
256
+ }.freeze
257
+
258
+ DOMAIN_RECORD_STATUSES = {FOUND: "found", MISSING: "missing"}.freeze
259
+
260
+ EMAIL_NOTIFICATION_CATEGORIES = {ACCOUNT: "account", BILLING: "billing", ACTIVITY: "activity", PRODUCT: "product"}.freeze
261
+
262
+ ERROR_TYPES = {
263
+ INVALID_REQUEST_ERROR: "invalid_request_error",
264
+ AUTHENTICATION_ERROR: "authentication_error",
265
+ PERMISSION_ERROR: "permission_error",
266
+ NOT_FOUND_ERROR: "not_found_error",
267
+ CONFLICT_ERROR: "conflict_error",
268
+ VALIDATION_ERROR: "validation_error",
269
+ RATE_LIMIT_ERROR: "rate_limit_error",
270
+ API_ERROR: "api_error"
271
+ }.freeze
272
+
273
+ EXPORT_PHASES = {PLANNING: "planning", MAIL: "mail", RECORDS: "records", FINISHING: "finishing"}.freeze
274
+
275
+ EXPORT_REFUSALS = {
276
+ NOT_PERMITTED: "not-permitted",
277
+ MAILBOX_LOGIN: "mailbox-login",
278
+ TWO_FACTOR_REQUIRED: "two-factor-required"
279
+ }.freeze
280
+
281
+ EXPORT_STATUSES = {
282
+ QUEUED: "queued",
283
+ RUNNING: "running",
284
+ READY: "ready",
285
+ FAILED: "failed",
286
+ EXPIRED: "expired"
287
+ }.freeze
288
+
289
+ FILE_DIRECTIONS = {INBOUND: "inbound", OUTBOUND: "outbound", UPLOADED: "uploaded"}.freeze
290
+
291
+ FILE_KINDS = {IMAGE: "image", PDF: "pdf", AUDIO: "audio", VIDEO: "video", TEXT: "text"}.freeze
292
+
293
+ FILE_SORTS = {NEWEST: "newest", OLDEST: "oldest", LARGEST: "largest", NAME: "name"}.freeze
294
+
295
+ FILE_USAGES = {RECEIVED: "received", SENT: "sent", LINKED: "linked", SCHEDULED: "scheduled"}.freeze
296
+
297
+ FILE_VISIBILITIES = {PUBLIC: "public", PRIVATE: "private"}.freeze
298
+
299
+ FORM_ALIGNS = {LEFT: "left", CENTER: "center"}.freeze
300
+
301
+ FORM_CONFIRM_SOURCES = {LINK: "link", APPROVAL: "approval"}.freeze
302
+
303
+ FORM_CONTACT_FIELDS = {EMAIL: "email", FIRST_NAME: "firstName", LAST_NAME: "lastName", NAME: "name"}.freeze
304
+
305
+ FORM_FIELD_ERRORS = {
306
+ REQUIRED: "required",
307
+ EMAIL: "email",
308
+ NUMBER: "number",
309
+ MIN: "min",
310
+ MAX: "max",
311
+ TOO_SHORT: "too_short",
312
+ TOO_LONG: "too_long",
313
+ URL: "url",
314
+ DATE: "date",
315
+ PHONE: "phone",
316
+ OPTION: "option"
317
+ }.freeze
318
+
319
+ FORM_FIELD_TYPES = {
320
+ EMAIL: "email",
321
+ TEXT: "text",
322
+ TEXTAREA: "textarea",
323
+ NUMBER: "number",
324
+ PHONE: "phone",
325
+ URL: "url",
326
+ DATE: "date",
327
+ SELECT: "select",
328
+ RADIO: "radio",
329
+ CHECKBOXES: "checkboxes",
330
+ CHECKBOX: "checkbox",
331
+ CONSENT: "consent",
332
+ AUDIENCES: "audiences",
333
+ HIDDEN: "hidden",
334
+ HEADING: "heading",
335
+ PARAGRAPH: "paragraph",
336
+ DIVIDER: "divider"
337
+ }.freeze
338
+
339
+ FORM_FIELD_WIDTHS = {FULL: "full", HALF: "half"}.freeze
340
+
341
+ FORM_FONTS = {SYSTEM: "system", SANS: "sans", SERIF: "serif", MONO: "mono"}.freeze
342
+
343
+ FORM_LAYOUTS = {CARD: "card", PLAIN: "plain"}.freeze
344
+
345
+ FORM_RADII = {NONE: "none", SM: "sm", MD: "md", LG: "lg", FULL: "full"}.freeze
346
+
347
+ FORM_SENDER_ISSUES = {MISSING: "missing", NOT_SENDABLE: "not_sendable", NOT_ALLOWED: "not_allowed"}.freeze
348
+
349
+ FORM_STARTER_SLUGS = {
350
+ BLANK: "blank",
351
+ NEWSLETTER: "newsletter",
352
+ WAITLIST: "waitlist",
353
+ EVENT: "event",
354
+ EARLY_ACCESS: "early-access",
355
+ CONTACT: "contact"
356
+ }.freeze
357
+
358
+ FORM_STATUSES = {DRAFT: "draft", LIVE: "live", PAUSED: "paused"}.freeze
359
+
360
+ FORM_SUBMISSION_STATUSES = {PENDING: "pending", ADDED: "added"}.freeze
361
+
362
+ FORM_SUBSCRIBE_OUTCOMES = {ADDED: "added", PENDING: "pending"}.freeze
363
+
364
+ FORM_SUCCESS_ACTIONS = {MESSAGE: "message", REDIRECT: "redirect"}.freeze
365
+
366
+ FORM_WIDTHS = {NARROW: "narrow", NORMAL: "normal", WIDE: "wide"}.freeze
367
+
368
+ LANGUAGES = [
369
+ {code: "en", label: "English", native: "English", flag: "🇬🇧", rtl: false}.freeze,
370
+ {code: "es", label: "Spanish", native: "Español", flag: "🇪🇸", rtl: false}.freeze,
371
+ {code: "zh-Hans", label: "Simplified Chinese", native: "简体中文", flag: "🇨🇳", rtl: false}.freeze,
372
+ {code: "zh-Hant", label: "Traditional Chinese", native: "繁體中文", flag: "🇹🇼", rtl: false}.freeze,
373
+ {code: "hi", label: "Hindi", native: "हिन्दी", flag: "🇮🇳", rtl: false}.freeze,
374
+ {code: "ar", label: "Arabic", native: "العربية", flag: "🇸🇦", rtl: true}.freeze,
375
+ {
376
+ code: "pt-BR",
377
+ label: "Brazilian Portuguese",
378
+ native: "Português (Brasil)",
379
+ flag: "🇧🇷",
380
+ rtl: false
381
+ }.freeze,
382
+ {code: "pt", label: "Portuguese", native: "Português", flag: "🇵🇹", rtl: false}.freeze,
383
+ {code: "fr", label: "French", native: "Français", flag: "🇫🇷", rtl: false}.freeze,
384
+ {code: "de", label: "German", native: "Deutsch", flag: "🇩🇪", rtl: false}.freeze,
385
+ {code: "ru", label: "Russian", native: "Русский", flag: "🇷🇺", rtl: false}.freeze,
386
+ {code: "ja", label: "Japanese", native: "日本語", flag: "🇯🇵", rtl: false}.freeze,
387
+ {code: "ko", label: "Korean", native: "한국어", flag: "🇰🇷", rtl: false}.freeze,
388
+ {code: "it", label: "Italian", native: "Italiano", flag: "🇮🇹", rtl: false}.freeze,
389
+ {code: "nl", label: "Dutch", native: "Nederlands", flag: "🇳🇱", rtl: false}.freeze,
390
+ {code: "tr", label: "Turkish", native: "Türkçe", flag: "🇹🇷", rtl: false}.freeze,
391
+ {code: "pl", label: "Polish", native: "Polski", flag: "🇵🇱", rtl: false}.freeze,
392
+ {code: "uk", label: "Ukrainian", native: "Українська", flag: "🇺🇦", rtl: false}.freeze,
393
+ {code: "vi", label: "Vietnamese", native: "Tiếng Việt", flag: "🇻🇳", rtl: false}.freeze,
394
+ {code: "id", label: "Indonesian", native: "Bahasa Indonesia", flag: "🇮🇩", rtl: false}.freeze,
395
+ {code: "th", label: "Thai", native: "ไทย", flag: "🇹🇭", rtl: false}.freeze,
396
+ {code: "sv", label: "Swedish", native: "Svenska", flag: "🇸🇪", rtl: false}.freeze,
397
+ {code: "da", label: "Danish", native: "Dansk", flag: "🇩🇰", rtl: false}.freeze,
398
+ {code: "no", label: "Norwegian", native: "Norsk", flag: "🇳🇴", rtl: false}.freeze,
399
+ {code: "fi", label: "Finnish", native: "Suomi", flag: "🇫🇮", rtl: false}.freeze,
400
+ {code: "cs", label: "Czech", native: "Čeština", flag: "🇨🇿", rtl: false}.freeze,
401
+ {code: "el", label: "Greek", native: "Ελληνικά", flag: "🇬🇷", rtl: false}.freeze,
402
+ {code: "he", label: "Hebrew", native: "עברית", flag: "🇮🇱", rtl: true}.freeze,
403
+ {code: "ro", label: "Romanian", native: "Română", flag: "🇷🇴", rtl: false}.freeze,
404
+ {code: "hu", label: "Hungarian", native: "Magyar", flag: "🇭🇺", rtl: false}.freeze,
405
+ {code: "bn", label: "Bengali", native: "বাংলা", flag: "🇧🇩", rtl: false}.freeze,
406
+ {code: "ur", label: "Urdu", native: "اردو", flag: "🇵🇰", rtl: true}.freeze,
407
+ {code: "fa", label: "Persian", native: "فارسی", flag: "🇮🇷", rtl: true}.freeze,
408
+ {code: "ms", label: "Malay", native: "Bahasa Melayu", flag: "🇲🇾", rtl: false}.freeze,
409
+ {code: "ta", label: "Tamil", native: "தமிழ்", flag: "🇮🇳", rtl: false}.freeze,
410
+ {code: "ca", label: "Catalan", native: "Català", flag: "🇦🇩", rtl: false}.freeze,
411
+ {
412
+ code: "en-GB",
413
+ label: "British English",
414
+ native: "English (United Kingdom)",
415
+ flag: "🇬🇧",
416
+ rtl: false
417
+ }.freeze,
418
+ {
419
+ code: "en-US",
420
+ label: "American English",
421
+ native: "English (United States)",
422
+ flag: "🇺🇸",
423
+ rtl: false
424
+ }.freeze,
425
+ {
426
+ code: "es-419",
427
+ label: "Latin American Spanish",
428
+ native: "Español (Latinoamérica)",
429
+ flag: "🇲🇽",
430
+ rtl: false
431
+ }.freeze,
432
+ {
433
+ code: "fr-CA",
434
+ label: "Canadian French",
435
+ native: "Français (Canada)",
436
+ flag: "🇨🇦",
437
+ rtl: false
438
+ }.freeze,
439
+ {
440
+ code: "de-AT",
441
+ label: "Austrian German",
442
+ native: "Deutsch (Österreich)",
443
+ flag: "🇦🇹",
444
+ rtl: false
445
+ }.freeze,
446
+ {
447
+ code: "de-CH",
448
+ label: "Swiss Standard German",
449
+ native: "Deutsch (Schweiz)",
450
+ flag: "🇨🇭",
451
+ rtl: false
452
+ }.freeze,
453
+ {code: "nl-BE", label: "Flemish", native: "Vlaams", flag: "🇧🇪", rtl: false}.freeze,
454
+ {code: "zh-HK", label: "Hong Kong Chinese", native: "繁體中文(香港)", flag: "🇭🇰", rtl: false}.freeze,
455
+ {code: "yue", label: "Cantonese", native: "粵語", flag: "🇭🇰", rtl: false}.freeze,
456
+ {code: "nb", label: "Norwegian Bokmål", native: "Norsk bokmål", flag: "🇳🇴", rtl: false}.freeze,
457
+ {
458
+ code: "nn",
459
+ label: "Norwegian Nynorsk",
460
+ native: "Norsk nynorsk",
461
+ flag: "🇳🇴",
462
+ rtl: false
463
+ }.freeze,
464
+ {code: "sr", label: "Serbian", native: "Српски", flag: "🇷🇸", rtl: false}.freeze,
465
+ {
466
+ code: "sr-Latn",
467
+ label: "Serbian (Latin)",
468
+ native: "Srpski (latinica)",
469
+ flag: "🇷🇸",
470
+ rtl: false
471
+ }.freeze,
472
+ {
473
+ code: "ar-EG",
474
+ label: "Egyptian Arabic",
475
+ native: "العربية (مصر)",
476
+ flag: "🇪🇬",
477
+ rtl: true
478
+ }.freeze,
479
+ {
480
+ code: "ar-MA",
481
+ label: "Moroccan Arabic",
482
+ native: "الدارجة المغربية",
483
+ flag: "🇲🇦",
484
+ rtl: true
485
+ }.freeze,
486
+ {code: "sk", label: "Slovak", native: "Slovenčina", flag: "🇸🇰", rtl: false}.freeze,
487
+ {code: "sl", label: "Slovenian", native: "Slovenščina", flag: "🇸🇮", rtl: false}.freeze,
488
+ {code: "hr", label: "Croatian", native: "Hrvatski", flag: "🇭🇷", rtl: false}.freeze,
489
+ {code: "bs", label: "Bosnian", native: "Bosanski", flag: "🇧🇦", rtl: false}.freeze,
490
+ {code: "cnr", label: "Montenegrin", native: "Crnogorski", flag: "🇲🇪", rtl: false}.freeze,
491
+ {code: "mk", label: "Macedonian", native: "Македонски", flag: "🇲🇰", rtl: false}.freeze,
492
+ {code: "bg", label: "Bulgarian", native: "Български", flag: "🇧🇬", rtl: false}.freeze,
493
+ {code: "be", label: "Belarusian", native: "Беларуская", flag: "🇧🇾", rtl: false}.freeze,
494
+ {
495
+ code: "hsb",
496
+ label: "Upper Sorbian",
497
+ native: "Hornjoserbšćina",
498
+ flag: "🇩🇪",
499
+ rtl: false
500
+ }.freeze,
501
+ {code: "rue", label: "Rusyn", native: "Русиньскый", flag: "🇸🇰", rtl: false}.freeze,
502
+ {code: "lt", label: "Lithuanian", native: "Lietuvių", flag: "🇱🇹", rtl: false}.freeze,
503
+ {code: "lv", label: "Latvian", native: "Latviešu", flag: "🇱🇻", rtl: false}.freeze,
504
+ {code: "et", label: "Estonian", native: "Eesti", flag: "🇪🇪", rtl: false}.freeze,
505
+ {code: "se", label: "Northern Sami", native: "Davvisámegiella", flag: "🇳🇴", rtl: false}.freeze,
506
+ {code: "is", label: "Icelandic", native: "Íslenska", flag: "🇮🇸", rtl: false}.freeze,
507
+ {code: "fo", label: "Faroese", native: "Føroyskt", flag: "🇫🇴", rtl: false}.freeze,
508
+ {code: "kl", label: "Greenlandic", native: "Kalaallisut", flag: "🇬🇱", rtl: false}.freeze,
509
+ {code: "ga", label: "Irish", native: "Gaeilge", flag: "🇮🇪", rtl: false}.freeze,
510
+ {code: "gd", label: "Scottish Gaelic", native: "Gàidhlig", flag: "🇬🇧", rtl: false}.freeze,
511
+ {code: "cy", label: "Welsh", native: "Cymraeg", flag: "🇬🇧", rtl: false}.freeze,
512
+ {code: "kw", label: "Cornish", native: "Kernewek", flag: "🇬🇧", rtl: false}.freeze,
513
+ {code: "gv", label: "Manx", native: "Gaelg", flag: "🇮🇲", rtl: false}.freeze,
514
+ {code: "br", label: "Breton", native: "Brezhoneg", flag: "🇫🇷", rtl: false}.freeze,
515
+ {code: "eu", label: "Basque", native: "Euskara", flag: "🇪🇸", rtl: false}.freeze,
516
+ {code: "gl", label: "Galician", native: "Galego", flag: "🇪🇸", rtl: false}.freeze,
517
+ {code: "ast", label: "Asturian", native: "Asturianu", flag: "🇪🇸", rtl: false}.freeze,
518
+ {code: "an", label: "Aragonese", native: "Aragonés", flag: "🇪🇸", rtl: false}.freeze,
519
+ {code: "oc", label: "Occitan", native: "Occitan", flag: "🇫🇷", rtl: false}.freeze,
520
+ {code: "co", label: "Corsican", native: "Corsu", flag: "🇫🇷", rtl: false}.freeze,
521
+ {code: "sc", label: "Sardinian", native: "Sardu", flag: "🇮🇹", rtl: false}.freeze,
522
+ {code: "fur", label: "Friulian", native: "Furlan", flag: "🇮🇹", rtl: false}.freeze,
523
+ {code: "rm", label: "Romansh", native: "Rumantsch", flag: "🇨🇭", rtl: false}.freeze,
524
+ {
525
+ code: "gsw",
526
+ label: "Alemannic German",
527
+ native: "Schwiizerdütsch",
528
+ flag: "🇨🇭",
529
+ rtl: false
530
+ }.freeze,
531
+ {code: "lb", label: "Luxembourgish", native: "Lëtzebuergesch", flag: "🇱🇺", rtl: false}.freeze,
532
+ {code: "nds", label: "Low German", native: "Plattdüütsch", flag: "🇩🇪", rtl: false}.freeze,
533
+ {code: "bar", label: "Bavarian", native: "Boarisch", flag: "🇩🇪", rtl: false}.freeze,
534
+ {code: "fy", label: "Western Frisian", native: "Frysk", flag: "🇳🇱", rtl: false}.freeze,
535
+ {code: "li", label: "Limburgish", native: "Limburgs", flag: "🇳🇱", rtl: false}.freeze,
536
+ {code: "wa", label: "Walloon", native: "Walon", flag: "🇧🇪", rtl: false}.freeze,
537
+ {code: "mt", label: "Maltese", native: "Malti", flag: "🇲🇹", rtl: false}.freeze,
538
+ {code: "sq", label: "Albanian", native: "Shqip", flag: "🇦🇱", rtl: false}.freeze,
539
+ {code: "la", label: "Latin", native: "Latina", flag: "🇻🇦", rtl: false}.freeze,
540
+ {code: "eo", label: "Esperanto", native: "Esperanto", flag: "🇪🇺", rtl: false}.freeze,
541
+ {code: "yi", label: "Yiddish", native: "ייִדיש", flag: "🇮🇱", rtl: true}.freeze,
542
+ {code: "hy", label: "Armenian", native: "Հայերեն", flag: "🇦🇲", rtl: false}.freeze,
543
+ {code: "ka", label: "Georgian", native: "ქართული", flag: "🇬🇪", rtl: false}.freeze,
544
+ {code: "os", label: "Ossetian", native: "Ирон æвзаг", flag: "🇬🇪", rtl: false}.freeze,
545
+ {code: "ab", label: "Abkhaz", native: "Аԥсшәа", flag: "🇬🇪", rtl: false}.freeze,
546
+ {code: "ce", label: "Chechen", native: "Нохчийн мотт", flag: "🇷🇺", rtl: false}.freeze,
547
+ {code: "az", label: "Azerbaijani", native: "Azərbaycan dili", flag: "🇦🇿", rtl: false}.freeze,
548
+ {code: "kk", label: "Kazakh", native: "Қазақ тілі", flag: "🇰🇿", rtl: false}.freeze,
549
+ {code: "ky", label: "Kyrgyz", native: "Кыргызча", flag: "🇰🇬", rtl: false}.freeze,
550
+ {code: "uz", label: "Uzbek", native: "Oʻzbekcha", flag: "🇺🇿", rtl: false}.freeze,
551
+ {code: "tk", label: "Turkmen", native: "Türkmençe", flag: "🇹🇲", rtl: false}.freeze,
552
+ {code: "tt", label: "Tatar", native: "Татар теле", flag: "🇷🇺", rtl: false}.freeze,
553
+ {code: "ba", label: "Bashkir", native: "Башҡортса", flag: "🇷🇺", rtl: false}.freeze,
554
+ {code: "cv", label: "Chuvash", native: "Чӑвашла", flag: "🇷🇺", rtl: false}.freeze,
555
+ {code: "sah", label: "Yakut", native: "Саха тыла", flag: "🇷🇺", rtl: false}.freeze,
556
+ {code: "ug", label: "Uyghur", native: "ئۇيغۇرچە", flag: "🇨🇳", rtl: true}.freeze,
557
+ {code: "mn", label: "Mongolian", native: "Монгол хэл", flag: "🇲🇳", rtl: false}.freeze,
558
+ {code: "bo", label: "Tibetan", native: "བོད་སྐད་", flag: "🇨🇳", rtl: false}.freeze,
559
+ {code: "dz", label: "Dzongkha", native: "རྫོང་ཁ", flag: "🇧🇹", rtl: false}.freeze,
560
+ {code: "fa-AF", label: "Dari", native: "دری", flag: "🇦🇫", rtl: true}.freeze,
561
+ {code: "ps", label: "Pashto", native: "پښتو", flag: "🇦🇫", rtl: true}.freeze,
562
+ {code: "ku", label: "Kurmanji Kurdish", native: "Kurmancî", flag: "🇹🇷", rtl: false}.freeze,
563
+ {code: "ckb", label: "Sorani Kurdish", native: "کوردیی ناوەندی", flag: "🇮🇶", rtl: true}.freeze,
564
+ {code: "syr", label: "Syriac", native: "ܣܘܪܝܝܐ", flag: "🇮🇶", rtl: true}.freeze,
565
+ {code: "te", label: "Telugu", native: "తెలుగు", flag: "🇮🇳", rtl: false}.freeze,
566
+ {code: "mr", label: "Marathi", native: "मराठी", flag: "🇮🇳", rtl: false}.freeze,
567
+ {code: "gu", label: "Gujarati", native: "ગુજરાતી", flag: "🇮🇳", rtl: false}.freeze,
568
+ {code: "kn", label: "Kannada", native: "ಕನ್ನಡ", flag: "🇮🇳", rtl: false}.freeze,
569
+ {code: "ml", label: "Malayalam", native: "മലയാളം", flag: "🇮🇳", rtl: false}.freeze,
570
+ {code: "or", label: "Odia", native: "ଓଡ଼ିଆ", flag: "🇮🇳", rtl: false}.freeze,
571
+ {code: "pa", label: "Punjabi", native: "ਪੰਜਾਬੀ", flag: "🇮🇳", rtl: false}.freeze,
572
+ {code: "pa-Arab", label: "Western Punjabi", native: "پنجابی", flag: "🇵🇰", rtl: true}.freeze,
573
+ {code: "as", label: "Assamese", native: "অসমীয়া", flag: "🇮🇳", rtl: false}.freeze,
574
+ {code: "mai", label: "Maithili", native: "मैथिली", flag: "🇮🇳", rtl: false}.freeze,
575
+ {code: "bho", label: "Bhojpuri", native: "भोजपुरी", flag: "🇮🇳", rtl: false}.freeze,
576
+ {code: "sat", label: "Santali", native: "ᱥᱟᱱᱛᱟᱲᱤ", flag: "🇮🇳", rtl: false}.freeze,
577
+ {code: "ks", label: "Kashmiri", native: "کٲشُر", flag: "🇮🇳", rtl: true}.freeze,
578
+ {code: "sa", label: "Sanskrit", native: "संस्कृतम्", flag: "🇮🇳", rtl: false}.freeze,
579
+ {code: "ne", label: "Nepali", native: "नेपाली", flag: "🇳🇵", rtl: false}.freeze,
580
+ {code: "si", label: "Sinhala", native: "සිංහල", flag: "🇱🇰", rtl: false}.freeze,
581
+ {code: "sd", label: "Sindhi", native: "سنڌي", flag: "🇵🇰", rtl: true}.freeze,
582
+ {code: "dv", label: "Divehi", native: "ދިވެހި", flag: "🇲🇻", rtl: true}.freeze,
583
+ {code: "km", label: "Khmer", native: "ភាសាខ្មែរ", flag: "🇰🇭", rtl: false}.freeze,
584
+ {code: "lo", label: "Lao", native: "ລາວ", flag: "🇱🇦", rtl: false}.freeze,
585
+ {code: "my", label: "Burmese", native: "မြန်မာဘာသာ", flag: "🇲🇲", rtl: false}.freeze,
586
+ {code: "jv", label: "Javanese", native: "Basa Jawa", flag: "🇮🇩", rtl: false}.freeze,
587
+ {code: "su", label: "Sundanese", native: "Basa Sunda", flag: "🇮🇩", rtl: false}.freeze,
588
+ {code: "fil", label: "Filipino", native: "Filipino", flag: "🇵🇭", rtl: false}.freeze,
589
+ {code: "tl", label: "Tagalog", native: "Tagalog", flag: "🇵🇭", rtl: false}.freeze,
590
+ {code: "ceb", label: "Cebuano", native: "Binisaya", flag: "🇵🇭", rtl: false}.freeze,
591
+ {code: "ilo", label: "Ilocano", native: "Ilokano", flag: "🇵🇭", rtl: false}.freeze,
592
+ {code: "war", label: "Waray", native: "Winaray", flag: "🇵🇭", rtl: false}.freeze,
593
+ {code: "sw", label: "Swahili", native: "Kiswahili", flag: "🇰🇪", rtl: false}.freeze,
594
+ {code: "am", label: "Amharic", native: "አማርኛ", flag: "🇪🇹", rtl: false}.freeze,
595
+ {code: "ti", label: "Tigrinya", native: "ትግርኛ", flag: "🇪🇷", rtl: false}.freeze,
596
+ {code: "om", label: "Oromo", native: "Afaan Oromoo", flag: "🇪🇹", rtl: false}.freeze,
597
+ {code: "so", label: "Somali", native: "Soomaali", flag: "🇸🇴", rtl: false}.freeze,
598
+ {code: "ha", label: "Hausa", native: "Hausa", flag: "🇳🇬", rtl: false}.freeze,
599
+ {code: "yo", label: "Yoruba", native: "Yorùbá", flag: "🇳🇬", rtl: false}.freeze,
600
+ {code: "ig", label: "Igbo", native: "Igbo", flag: "🇳🇬", rtl: false}.freeze,
601
+ {code: "af", label: "Afrikaans", native: "Afrikaans", flag: "🇿🇦", rtl: false}.freeze,
602
+ {code: "zu", label: "Zulu", native: "isiZulu", flag: "🇿🇦", rtl: false}.freeze,
603
+ {code: "xh", label: "Xhosa", native: "isiXhosa", flag: "🇿🇦", rtl: false}.freeze,
604
+ {code: "st", label: "Sesotho", native: "Sesotho", flag: "🇱🇸", rtl: false}.freeze,
605
+ {code: "nso", label: "Sepedi", native: "Sepedi", flag: "🇿🇦", rtl: false}.freeze,
606
+ {code: "tn", label: "Setswana", native: "Setswana", flag: "🇧🇼", rtl: false}.freeze,
607
+ {code: "ts", label: "Xitsonga", native: "Xitsonga", flag: "🇿🇦", rtl: false}.freeze,
608
+ {code: "ve", label: "Tshivenda", native: "Tshivenḓa", flag: "🇿🇦", rtl: false}.freeze,
609
+ {code: "ss", label: "Swati", native: "siSwati", flag: "🇸🇿", rtl: false}.freeze,
610
+ {code: "nr", label: "Southern Ndebele", native: "isiNdebele", flag: "🇿🇦", rtl: false}.freeze,
611
+ {code: "sn", label: "Shona", native: "chiShona", flag: "🇿🇼", rtl: false}.freeze,
612
+ {code: "ny", label: "Chichewa", native: "Chichewa", flag: "🇲🇼", rtl: false}.freeze,
613
+ {code: "rw", label: "Kinyarwanda", native: "Ikinyarwanda", flag: "🇷🇼", rtl: false}.freeze,
614
+ {code: "rn", label: "Kirundi", native: "Ikirundi", flag: "🇧🇮", rtl: false}.freeze,
615
+ {code: "lg", label: "Luganda", native: "Luganda", flag: "🇺🇬", rtl: false}.freeze,
616
+ {code: "ln", label: "Lingala", native: "Lingála", flag: "🇨🇩", rtl: false}.freeze,
617
+ {code: "kg", label: "Kikongo", native: "Kikongo", flag: "🇨🇩", rtl: false}.freeze,
618
+ {code: "wo", label: "Wolof", native: "Wolof", flag: "🇸🇳", rtl: false}.freeze,
619
+ {code: "ff", label: "Fula", native: "Pulaar", flag: "🇸🇳", rtl: false}.freeze,
620
+ {code: "bm", label: "Bambara", native: "Bamanankan", flag: "🇲🇱", rtl: false}.freeze,
621
+ {code: "ak", label: "Akan", native: "Akan", flag: "🇬🇭", rtl: false}.freeze,
622
+ {code: "tw", label: "Twi", native: "Twi", flag: "🇬🇭", rtl: false}.freeze,
623
+ {code: "ee", label: "Ewe", native: "Eʋegbe", flag: "🇬🇭", rtl: false}.freeze,
624
+ {code: "mg", label: "Malagasy", native: "Malagasy", flag: "🇲🇬", rtl: false}.freeze,
625
+ {code: "kab", label: "Kabyle", native: "Taqbaylit", flag: "🇩🇿", rtl: false}.freeze,
626
+ {code: "tzm", label: "Tamazight", native: "ⵜⴰⵎⴰⵣⵉⵖⵜ", flag: "🇲🇦", rtl: false}.freeze,
627
+ {code: "sg", label: "Sango", native: "Sängö", flag: "🇨🇫", rtl: false}.freeze,
628
+ {code: "ht", label: "Haitian Creole", native: "Kreyòl ayisyen", flag: "🇭🇹", rtl: false}.freeze,
629
+ {code: "pap", label: "Papiamento", native: "Papiamentu", flag: "🇦🇼", rtl: false}.freeze,
630
+ {code: "srn", label: "Sranan Tongo", native: "Sranantongo", flag: "🇸🇷", rtl: false}.freeze,
631
+ {code: "qu", label: "Quechua", native: "Runa Simi", flag: "🇵🇪", rtl: false}.freeze,
632
+ {code: "gn", label: "Guarani", native: "Avañe'ẽ", flag: "🇵🇾", rtl: false}.freeze,
633
+ {code: "ay", label: "Aymara", native: "Aymar aru", flag: "🇧🇴", rtl: false}.freeze,
634
+ {code: "nah", label: "Nahuatl", native: "Nāhuatl", flag: "🇲🇽", rtl: false}.freeze,
635
+ {code: "chr", label: "Cherokee", native: "ᏣᎳᎩ", flag: "🇺🇸", rtl: false}.freeze,
636
+ {code: "nv", label: "Navajo", native: "Diné bizaad", flag: "🇺🇸", rtl: false}.freeze,
637
+ {code: "iu", label: "Inuktitut", native: "ᐃᓄᒃᑎᑐᑦ", flag: "🇨🇦", rtl: false}.freeze,
638
+ {code: "mi", label: "Maori", native: "Te reo Māori", flag: "🇳🇿", rtl: false}.freeze,
639
+ {code: "sm", label: "Samoan", native: "Gagana Sāmoa", flag: "🇼🇸", rtl: false}.freeze,
640
+ {code: "to", label: "Tongan", native: "Lea faka-Tonga", flag: "🇹🇴", rtl: false}.freeze,
641
+ {code: "fj", label: "Fijian", native: "Na Vosa Vakaviti", flag: "🇫🇯", rtl: false}.freeze,
642
+ {code: "haw", label: "Hawaiian", native: "ʻŌlelo Hawaiʻi", flag: "🇺🇸", rtl: false}.freeze,
643
+ {code: "ty", label: "Tahitian", native: "Reo Tahiti", flag: "🇵🇫", rtl: false}.freeze,
644
+ {code: "ch", label: "Chamorro", native: "Chamoru", flag: "🇬🇺", rtl: false}.freeze,
645
+ {code: "mh", label: "Marshallese", native: "Kajin M̧ajeļ", flag: "🇲🇭", rtl: false}.freeze,
646
+ {code: "tpi", label: "Tok Pisin", native: "Tok Pisin", flag: "🇵🇬", rtl: false}.freeze
647
+ ].freeze
648
+
649
+ LOGIN_BACKGROUND_KINDS = {PRESET: "preset", COLOR: "color", IMAGE: "image"}.freeze
650
+
651
+ LOGIN_BACKGROUND_PRESETS = {DUSK: "dusk", MIST: "mist", SAND: "sand", NIGHT: "night"}.freeze
652
+
653
+ LOGIN_LOGOS = {DARK: "dark", LIGHT: "light"}.freeze
654
+
655
+ MESSAGE_ENCRYPTION_FORMATS = {
656
+ PGP_MIME: "pgp-mime",
657
+ PGP_SIGNED: "pgp-signed",
658
+ PGP_INLINE: "pgp-inline",
659
+ SMIME_ENCRYPTED: "smime-encrypted",
660
+ SMIME_SIGNED: "smime-signed"
661
+ }.freeze
662
+
663
+ PAGE_LIMITS = {MAX_LIMIT: 100, DEFAULT_LIMIT: 25}.freeze
664
+
665
+ PAID_PLAN_IDS = {STARTER: "starter", BUSINESS: "business", ENTERPRISE: "enterprise"}.freeze
666
+
667
+ PAY_AS_YOU_GO_LIMITS_CENTS = [1000, 2500, 5000, 10000, 25000, 50000, 100000, 250000, 500000].freeze
668
+
669
+ PEOPLE_SORTS = {RECENT: "recent", NAME: "name", THREADS: "threads"}.freeze
670
+
671
+ PLAN_IDS = {FREE: "free", STARTER: "starter", BUSINESS: "business", ENTERPRISE: "enterprise"}.freeze
672
+
673
+ PROVIDER_IMPORT_DOMAIN_STATES = {ABSENT: "absent", ADDED: "added", VERIFIED: "verified"}.freeze
674
+
675
+ PROVIDER_IMPORT_RESOURCES = {
676
+ SUPPRESSIONS: "suppressions",
677
+ AUDIENCES: "audiences",
678
+ CONTACTS: "contacts",
679
+ TEMPLATES: "templates",
680
+ WEBHOOKS: "webhooks",
681
+ DOMAINS: "domains",
682
+ API_KEYS: "api-keys"
683
+ }.freeze
684
+
685
+ PROVIDER_IMPORT_STATUSES = {
686
+ QUEUED: "queued",
687
+ RUNNING: "running",
688
+ COMPLETED: "completed",
689
+ FAILED: "failed",
690
+ CANCELLED: "cancelled"
691
+ }.freeze
692
+
693
+ REWRITE_ACTIONS = {
694
+ SHORTEN: "shorten",
695
+ LENGTHEN: "lengthen",
696
+ REPHRASE: "rephrase",
697
+ FORMAL: "formal",
698
+ CASUAL: "casual",
699
+ CUSTOM: "custom"
700
+ }.freeze
701
+
702
+ REWRITE_TARGETS = {SUBJECT: "subject", BODY: "body"}.freeze
703
+
704
+ RULE_ACTIONS = {
705
+ LABEL: "label",
706
+ REMOVE_LABEL: "remove_label",
707
+ ARCHIVE: "archive",
708
+ MARK_READ: "mark_read",
709
+ STAR: "star",
710
+ SPAM: "spam",
711
+ TRASH: "trash",
712
+ FORWARD: "forward",
713
+ REPLY: "reply",
714
+ BLOCK_SENDER: "block_sender",
715
+ REJECT: "reject"
716
+ }.freeze
717
+
718
+ RULE_FIELDS = {
719
+ FROM: "from",
720
+ FROM_DOMAIN: "from_domain",
721
+ ENVELOPE_FROM: "envelope_from",
722
+ TO: "to",
723
+ CC: "cc",
724
+ BCC: "bcc",
725
+ RECIPIENT: "recipient",
726
+ REPLY_TO: "reply_to",
727
+ DELIVERED_TO: "delivered_to",
728
+ SUBJECT: "subject",
729
+ BODY: "body",
730
+ HEADER: "header",
731
+ LIST_ID: "list_id",
732
+ ATTACHMENT_NAME: "attachment_name",
733
+ ATTACHMENT_TYPE: "attachment_type",
734
+ HAS_ATTACHMENT: "has_attachment",
735
+ ATTACHMENT_SIZE: "attachment_size",
736
+ MESSAGE_SIZE: "message_size",
737
+ SPAM: "spam",
738
+ HOUR: "hour",
739
+ WEEKDAY: "weekday"
740
+ }.freeze
741
+
742
+ RULE_OPERATORS = {
743
+ MATCHES: "matches",
744
+ CONTAINS: "contains",
745
+ EQUALS: "equals",
746
+ STARTS_WITH: "starts_with",
747
+ ENDS_WITH: "ends_with",
748
+ GT: "gt",
749
+ LT: "lt"
750
+ }.freeze
751
+
752
+ STEP_UP_ERROR_CODES = {
753
+ STEP_UP_REQUIRED: "step_up_required",
754
+ STEP_UP_NOT_APPLICABLE: "step_up_not_applicable",
755
+ STEP_UP_THROTTLED: "step_up_throttled",
756
+ STEP_UP_UNDELIVERABLE: "step_up_undeliverable",
757
+ STEP_UP_CODE_INVALID: "step_up_code_invalid",
758
+ STEP_UP_CODE_EXPIRED: "step_up_code_expired",
759
+ STEP_UP_LOCKED: "step_up_locked"
760
+ }.freeze
761
+
762
+ STEP_UP_METHODS = {EMAIL: "email", TOTP: "totp"}.freeze
763
+
764
+ SUBSCRIPTION_DESTINATIONS = {ARCHIVE: "archive", BIN: "bin", LABEL: "label"}.freeze
765
+
766
+ SUBSCRIPTION_SORTS = {RECENT: "recent", MOST: "most", UNREAD: "unread", NAME: "name"}.freeze
767
+
768
+ SUBSCRIPTION_STATUSES = {ACTIVE: "active", UNSUBSCRIBED: "unsubscribed"}.freeze
769
+
770
+ SUPPRESSION_REASONS = {BOUNCE: "bounce", COMPLAINT: "complaint", MANUAL: "manual"}.freeze
771
+
772
+ TEMPLATE_IMAGE_TYPES = {
773
+ PNG: "image/png",
774
+ JPEG: "image/jpeg",
775
+ WEBP: "image/webp",
776
+ GIF: "image/gif",
777
+ SVG: "image/svg+xml"
778
+ }.freeze
779
+
780
+ THREAD_NOTE_COLORS = {
781
+ DEFAULT: "default",
782
+ RED: "red",
783
+ ORANGE: "orange",
784
+ YELLOW: "yellow",
785
+ GREEN: "green",
786
+ BLUE: "blue",
787
+ PURPLE: "purple",
788
+ PINK: "pink"
789
+ }.freeze
790
+
791
+ THREAD_SORTS = {NEWEST: "newest", OLDEST: "oldest", SENDER: "sender", SUBJECT: "subject"}.freeze
792
+
793
+ THREAD_SUMMARY_STATES = {READY: "ready", PENDING: "pending", NONE: "none"}.freeze
794
+
795
+ UNSUBSCRIBE_METHODS = {ONE_CLICK: "one-click", EMAIL: "email", LINK: "link"}.freeze
796
+
797
+ USERNAME_STATUSES = {
798
+ AVAILABLE: "available",
799
+ CURRENT: "current",
800
+ TAKEN: "taken",
801
+ RESERVED: "reserved",
802
+ INVALID: "invalid",
803
+ TOO_SHORT: "too_short",
804
+ TOO_LONG: "too_long"
805
+ }.freeze
806
+
807
+ WEBHOOK_EVENTS = {
808
+ EMAIL_RECEIVED: "email.received",
809
+ EMAIL_REPLIED: "email.replied",
810
+ EMAIL_SENT: "email.sent",
811
+ EMAIL_FAILED: "email.failed",
812
+ EMAIL_CANCELLED: "email.cancelled",
813
+ EMAIL_SCHEDULED: "email.scheduled",
814
+ EMAIL_QUEUED: "email.queued",
815
+ EMAIL_DELIVERED: "email.delivered",
816
+ EMAIL_DELIVERY_DELAYED: "email.delivery_delayed",
817
+ EMAIL_BOUNCED: "email.bounced",
818
+ EMAIL_COMPLAINED: "email.complained",
819
+ EMAIL_SUPPRESSED: "email.suppressed",
820
+ EMAIL_OPENED: "email.opened",
821
+ EMAIL_CLICKED: "email.clicked",
822
+ EMAIL_DOWNLOADED: "email.downloaded",
823
+ DOMAIN_VERIFIED: "domain.verified",
824
+ DOMAIN_SENDING_CHANGED: "domain.sending_changed",
825
+ DOMAIN_DELETED: "domain.deleted",
826
+ SUPPRESSION_ADDED: "suppression.added",
827
+ SUPPRESSION_REMOVED: "suppression.removed",
828
+ FILE_UPLOADED: "file.uploaded",
829
+ FILE_DELETED: "file.deleted",
830
+ FORM_SUBMITTED: "form.submitted",
831
+ FORM_CONFIRMED: "form.confirmed"
832
+ }.freeze
833
+
834
+ WEBHOOK_REPLAY_ERROR_CODES = {
835
+ RESOURCE_NOT_FOUND: "resource_not_found",
836
+ WEBHOOK_DISABLED: "webhook_disabled",
837
+ EVENT_NOT_SUBSCRIBED: "event_not_subscribed",
838
+ EVENT_OUT_OF_SCOPE: "event_out_of_scope",
839
+ DELIVERY_NOT_REPLAYABLE: "delivery_not_replayable",
840
+ RETRY_IN_PROGRESS: "retry_in_progress",
841
+ REPLAY_IN_PROGRESS: "replay_in_progress"
842
+ }.freeze
843
+
844
+ WEBHOOK_SIGNATURE_HEADERS = {
845
+ SIGNATURE: "X-OpenEmail-Signature",
846
+ EVENT: "X-OpenEmail-Event",
847
+ DELIVERY: "X-OpenEmail-Delivery"
848
+ }.freeze
849
+
850
+ WORKSPACE_KINDS = {BUSINESS: "business", PERSONAL: "personal"}.freeze
851
+ end