= ({
Manage Languages
+ {isMultiLanguageActivated && (
+
+ )}
>
)}
diff --git a/packages/ee/multi-language/lib/iso-languages.ts b/packages/ee/multi-language/lib/iso-languages.ts
deleted file mode 100644
index 660d60584c..0000000000
--- a/packages/ee/multi-language/lib/iso-languages.ts
+++ /dev/null
@@ -1,750 +0,0 @@
-export interface TIso639Language {
- alpha2: string;
- english: string;
-}
-
-export const iso639Languages = [
- {
- alpha2: "aa",
- english: "Afar",
- },
- {
- alpha2: "ab",
- english: "Abkhazian",
- },
- {
- alpha2: "ae",
- english: "Avestan",
- },
- {
- alpha2: "af",
- english: "Afrikaans",
- },
- {
- alpha2: "ak",
- english: "Akan",
- },
- {
- alpha2: "am",
- english: "Amharic",
- },
- {
- alpha2: "an",
- english: "Aragonese",
- },
- {
- alpha2: "ar",
- english: "Arabic",
- },
- {
- alpha2: "as",
- english: "Assamese",
- },
- {
- alpha2: "av",
- english: "Avaric",
- },
- {
- alpha2: "ay",
- english: "Aymara",
- },
- {
- alpha2: "az",
- english: "Azerbaijani",
- },
- {
- alpha2: "ba",
- english: "Bashkir",
- },
- {
- alpha2: "be",
- english: "Belarusian",
- },
- {
- alpha2: "bg",
- english: "Bulgarian",
- },
- {
- alpha2: "bh",
- english: "Bihari languages",
- },
- {
- alpha2: "bi",
- english: "Bislama",
- },
- {
- alpha2: "bm",
- english: "Bambara",
- },
- {
- alpha2: "bn",
- english: "Bengali",
- },
- {
- alpha2: "bo",
- english: "Tibetan",
- },
- {
- alpha2: "br",
- english: "Breton",
- },
- {
- alpha2: "bs",
- english: "Bosnian",
- },
- {
- alpha2: "ca",
- english: "Catalan; Valencian",
- },
- {
- alpha2: "ce",
- english: "Chechen",
- },
- {
- alpha2: "ch",
- english: "Chamorro",
- },
- {
- alpha2: "co",
- english: "Corsican",
- },
- {
- alpha2: "cr",
- english: "Cree",
- },
- {
- alpha2: "cs",
- english: "Czech",
- },
- {
- alpha2: "cu",
- english: "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic",
- },
- {
- alpha2: "cv",
- english: "Chuvash",
- },
- {
- alpha2: "cy",
- english: "Welsh",
- },
- {
- alpha2: "da",
- english: "Danish",
- },
- {
- alpha2: "de",
- english: "German",
- },
- {
- alpha2: "dv",
- english: "Divehi; Dhivehi; Maldivian",
- },
- {
- alpha2: "dz",
- english: "Dzongkha",
- },
- {
- alpha2: "ee",
- english: "Ewe",
- },
- {
- alpha2: "el",
- english: "Greek, Modern (1453-)",
- },
- {
- alpha2: "en",
- english: "English",
- },
- {
- alpha2: "eo",
- english: "Esperanto",
- },
- {
- alpha2: "es",
- english: "Spanish; Castilian",
- },
- {
- alpha2: "et",
- english: "Estonian",
- },
- {
- alpha2: "eu",
- english: "Basque",
- },
- {
- alpha2: "fa",
- english: "Persian",
- },
- {
- alpha2: "ff",
- english: "Fulah",
- },
- {
- alpha2: "fi",
- english: "Finnish",
- },
- {
- alpha2: "fj",
- english: "Fijian",
- },
- {
- alpha2: "fo",
- english: "Faroese",
- },
- {
- alpha2: "fr",
- english: "French",
- },
- {
- alpha2: "fy",
- english: "Western Frisian",
- },
- {
- alpha2: "ga",
- english: "Irish",
- },
- {
- alpha2: "gd",
- english: "Gaelic; Scottish Gaelic",
- },
- {
- alpha2: "gl",
- english: "Galician",
- },
- {
- alpha2: "gn",
- english: "Guarani",
- },
- {
- alpha2: "gu",
- english: "Gujarati",
- },
- {
- alpha2: "gv",
- english: "Manx",
- },
- {
- alpha2: "ha",
- english: "Hausa",
- },
- {
- alpha2: "he",
- english: "Hebrew",
- },
- {
- alpha2: "hi",
- english: "Hindi",
- },
- {
- alpha2: "ho",
- english: "Hiri Motu",
- },
- {
- alpha2: "hr",
- english: "Croatian",
- },
- {
- alpha2: "ht",
- english: "Haitian; Haitian Creole",
- },
- {
- alpha2: "hu",
- english: "Hungarian",
- },
- {
- alpha2: "hy",
- english: "Armenian",
- },
- {
- alpha2: "hz",
- english: "Herero",
- },
- {
- alpha2: "ia",
- english: "Interlingua (International Auxiliary Language Association)",
- },
- {
- alpha2: "id",
- english: "Indonesian",
- },
- {
- alpha2: "ie",
- english: "Interlingue; Occidental",
- },
- {
- alpha2: "ig",
- english: "Igbo",
- },
- {
- alpha2: "ii",
- english: "Sichuan Yi; Nuosu",
- },
- {
- alpha2: "ik",
- english: "Inupiaq",
- },
- {
- alpha2: "io",
- english: "Ido",
- },
- {
- alpha2: "is",
- english: "Icelandic",
- },
- {
- alpha2: "it",
- english: "Italian",
- },
- {
- alpha2: "iu",
- english: "Inuktitut",
- },
- {
- alpha2: "ja",
- english: "Japanese",
- },
- {
- alpha2: "jv",
- english: "Javanese",
- },
- {
- alpha2: "ka",
- english: "Georgian",
- },
- {
- alpha2: "kg",
- english: "Kongo",
- },
- {
- alpha2: "ki",
- english: "Kikuyu; Gikuyu",
- },
- {
- alpha2: "kj",
- english: "Kuanyama; Kwanyama",
- },
- {
- alpha2: "kk",
- english: "Kazakh",
- },
- {
- alpha2: "kl",
- english: "Kalaallisut; Greenlandic",
- },
- {
- alpha2: "km",
- english: "Central Khmer",
- },
- {
- alpha2: "kn",
- english: "Kannada",
- },
- {
- alpha2: "ko",
- english: "Korean",
- },
- {
- alpha2: "kr",
- english: "Kanuri",
- },
- {
- alpha2: "ks",
- english: "Kashmiri",
- },
- {
- alpha2: "ku",
- english: "Kurdish",
- },
- {
- alpha2: "kv",
- english: "Komi",
- },
- {
- alpha2: "kw",
- english: "Cornish",
- },
- {
- alpha2: "ky",
- english: "Kirghiz; Kyrgyz",
- },
- {
- alpha2: "la",
- english: "Latin",
- },
- {
- alpha2: "lb",
- english: "Luxembourgish; Letzeburgesch",
- },
- {
- alpha2: "lg",
- english: "Ganda",
- },
- {
- alpha2: "li",
- english: "Limburgan; Limburger; Limburgish",
- },
- {
- alpha2: "ln",
- english: "Lingala",
- },
- {
- alpha2: "lo",
- english: "Lao",
- },
- {
- alpha2: "lt",
- english: "Lithuanian",
- },
- {
- alpha2: "lu",
- english: "Luba-Katanga",
- },
- {
- alpha2: "lv",
- english: "Latvian",
- },
- {
- alpha2: "mg",
- english: "Malagasy",
- },
- {
- alpha2: "mh",
- english: "Marshallese",
- },
- {
- alpha2: "mi",
- english: "Maori",
- },
- {
- alpha2: "mk",
- english: "Macedonian",
- },
- {
- alpha2: "ml",
- english: "Malayalam",
- },
- {
- alpha2: "mn",
- english: "Mongolian",
- },
- {
- alpha2: "mr",
- english: "Marathi",
- },
- {
- alpha2: "ms",
- english: "Malay",
- },
- {
- alpha2: "mt",
- english: "Maltese",
- },
- {
- alpha2: "my",
- english: "Burmese",
- },
- {
- alpha2: "na",
- english: "Nauru",
- },
- {
- alpha2: "nb",
- english: "Bokmål, Norwegian; Norwegian Bokmål",
- },
- {
- alpha2: "nd",
- english: "Ndebele, North; North Ndebele",
- },
- {
- alpha2: "ne",
- english: "Nepali",
- },
- {
- alpha2: "ng",
- english: "Ndonga",
- },
- {
- alpha2: "nl",
- english: "Dutch; Flemish",
- },
- {
- alpha2: "nn",
- english: "Norwegian Nynorsk; Nynorsk, Norwegian",
- },
- {
- alpha2: "no",
- english: "Norwegian",
- },
- {
- alpha2: "nr",
- english: "Ndebele, South; South Ndebele",
- },
- {
- alpha2: "nv",
- english: "Navajo; Navaho",
- },
- {
- alpha2: "ny",
- english: "Chichewa; Chewa; Nyanja",
- },
- {
- alpha2: "oc",
- english: "Occitan (post 1500)",
- },
- {
- alpha2: "oj",
- english: "Ojibwa",
- },
- {
- alpha2: "om",
- english: "Oromo",
- },
- {
- alpha2: "or",
- english: "Oriya",
- },
- {
- alpha2: "os",
- english: "Ossetian; Ossetic",
- },
- {
- alpha2: "pa",
- english: "Panjabi; Punjabi",
- },
- {
- alpha2: "pi",
- english: "Pali",
- },
- {
- alpha2: "pl",
- english: "Polish",
- },
- {
- alpha2: "ps",
- english: "Pushto; Pashto",
- },
- {
- alpha2: "pt",
- english: "Portuguese",
- },
- {
- alpha2: "qu",
- english: "Quechua",
- },
- {
- alpha2: "rm",
- english: "Romansh",
- },
- {
- alpha2: "rn",
- english: "Rundi",
- },
- {
- alpha2: "ro",
- english: "Romanian; Moldavian; Moldovan",
- },
- {
- alpha2: "ru",
- english: "Russian",
- },
- {
- alpha2: "rw",
- english: "Kinyarwanda",
- },
- {
- alpha2: "sa",
- english: "Sanskrit",
- },
- {
- alpha2: "sc",
- english: "Sardinian",
- },
- {
- alpha2: "sd",
- english: "Sindhi",
- },
- {
- alpha2: "se",
- english: "Northern Sami",
- },
- {
- alpha2: "sg",
- english: "Sango",
- },
- {
- alpha2: "si",
- english: "Sinhala; Sinhalese",
- },
- {
- alpha2: "sk",
- english: "Slovak",
- },
- {
- alpha2: "sl",
- english: "Slovenian",
- },
- {
- alpha2: "sm",
- english: "Samoan",
- },
- {
- alpha2: "sn",
- english: "Shona",
- },
- {
- alpha2: "so",
- english: "Somali",
- },
- {
- alpha2: "sq",
- english: "Albanian",
- },
- {
- alpha2: "sr",
- english: "Serbian",
- },
- {
- alpha2: "ss",
- english: "Swati",
- },
- {
- alpha2: "st",
- english: "Sotho, Southern",
- },
- {
- alpha2: "su",
- english: "Sundanese",
- },
- {
- alpha2: "sv",
- english: "Swedish",
- },
- {
- alpha2: "sw",
- english: "Swahili",
- },
- {
- alpha2: "ta",
- english: "Tamil",
- },
- {
- alpha2: "te",
- english: "Telugu",
- },
- {
- alpha2: "tg",
- english: "Tajik",
- },
- {
- alpha2: "th",
- english: "Thai",
- },
- {
- alpha2: "ti",
- english: "Tigrinya",
- },
- {
- alpha2: "tk",
- english: "Turkmen",
- },
- {
- alpha2: "tl",
- english: "Tagalog",
- },
- {
- alpha2: "tn",
- english: "Tswana",
- },
- {
- alpha2: "to",
- english: "Tonga (Tonga Islands)",
- },
- {
- alpha2: "tr",
- english: "Turkish",
- },
- {
- alpha2: "ts",
- english: "Tsonga",
- },
- {
- alpha2: "tt",
- english: "Tatar",
- },
- {
- alpha2: "tw",
- english: "Twi",
- },
- {
- alpha2: "ty",
- english: "Tahitian",
- },
- {
- alpha2: "ug",
- english: "Uighur; Uyghur",
- },
- {
- alpha2: "uk",
- english: "Ukrainian",
- },
- {
- alpha2: "ur",
- english: "Urdu",
- },
- {
- alpha2: "uz",
- english: "Uzbek",
- },
- {
- alpha2: "ve",
- english: "Venda",
- },
- {
- alpha2: "vi",
- english: "Vietnamese",
- },
- {
- alpha2: "vo",
- english: "Volapük",
- },
- {
- alpha2: "wa",
- english: "Walloon",
- },
- {
- alpha2: "wo",
- english: "Wolof",
- },
- {
- alpha2: "xh",
- english: "Xhosa",
- },
- {
- alpha2: "yi",
- english: "Yiddish",
- },
- {
- alpha2: "yo",
- english: "Yoruba",
- },
- {
- alpha2: "za",
- english: "Zhuang; Chuang",
- },
- {
- alpha2: "zh",
- english: "Chinese",
- },
- {
- alpha2: "zu",
- english: "Zulu",
- },
-];
-
-export const iso639Identifiers = iso639Languages.map((language) => language.alpha2);
-
-export const getLanguageLabel = (languageCode: string) => {
- const language = iso639Languages.find((lang) => lang.alpha2 === languageCode);
- return `${language?.english}`;
-};
diff --git a/packages/js-core/app.vite.config.ts b/packages/js-core/app.vite.config.ts
index c9217dd001..98c3176dc6 100644
--- a/packages/js-core/app.vite.config.ts
+++ b/packages/js-core/app.vite.config.ts
@@ -1,7 +1,6 @@
import { resolve } from "path";
import { defineConfig } from "vite";
import dts from "vite-plugin-dts";
-
import webPackageJson from "../../apps/web/package.json";
const config = () => {
diff --git a/packages/js-core/src/app/lib/actions.ts b/packages/js-core/src/app/lib/actions.ts
index 26cb91f193..e1539c9f7f 100644
--- a/packages/js-core/src/app/lib/actions.ts
+++ b/packages/js-core/src/app/lib/actions.ts
@@ -1,6 +1,5 @@
import { FormbricksAPI } from "@formbricks/api";
import { TJsActionInput, TJsTrackProperties } from "@formbricks/types/js";
-
import { InvalidCodeError, NetworkError, Result, err, okVoid } from "../../shared/errors";
import { Logger } from "../../shared/logger";
import { getIsDebug } from "../../shared/utils";
diff --git a/packages/js-core/src/app/lib/api.ts b/packages/js-core/src/app/lib/api.ts
index 3d47d36172..508f939230 100644
--- a/packages/js-core/src/app/lib/api.ts
+++ b/packages/js-core/src/app/lib/api.ts
@@ -1,5 +1,4 @@
import { FormbricksAPI } from "@formbricks/api";
-
import { AppConfig } from "./config";
export const getApi = (): FormbricksAPI => {
diff --git a/packages/js-core/src/app/lib/attributes.ts b/packages/js-core/src/app/lib/attributes.ts
index a122373b54..bfa89006ce 100644
--- a/packages/js-core/src/app/lib/attributes.ts
+++ b/packages/js-core/src/app/lib/attributes.ts
@@ -1,6 +1,5 @@
import { FormbricksAPI } from "@formbricks/api";
import { TAttributes } from "@formbricks/types/attributes";
-
import { MissingPersonError, NetworkError, Result, err, ok, okVoid } from "../../shared/errors";
import { Logger } from "../../shared/logger";
import { AppConfig } from "./config";
diff --git a/packages/js-core/src/app/lib/config.ts b/packages/js-core/src/app/lib/config.ts
index 6858d25da2..6509491045 100644
--- a/packages/js-core/src/app/lib/config.ts
+++ b/packages/js-core/src/app/lib/config.ts
@@ -1,5 +1,4 @@
import { TJSAppConfig, TJsAppConfigUpdateInput } from "@formbricks/types/js";
-
import { Result, err, ok, wrapThrows } from "../../shared/errors";
export const IN_APP_LOCAL_STORAGE_KEY = "formbricks-js-app";
diff --git a/packages/js-core/src/app/lib/sync.ts b/packages/js-core/src/app/lib/sync.ts
index 5f64ff7730..6a90201349 100644
--- a/packages/js-core/src/app/lib/sync.ts
+++ b/packages/js-core/src/app/lib/sync.ts
@@ -1,7 +1,6 @@
import { TAttributes } from "@formbricks/types/attributes";
import { TJsAppState, TJsAppStateSync, TJsAppSyncParams } from "@formbricks/types/js";
import { TSurvey } from "@formbricks/types/surveys";
-
import { NetworkError, Result, err, ok } from "../../shared/errors";
import { Logger } from "../../shared/logger";
import { getIsDebug } from "../../shared/utils";
diff --git a/packages/js-core/src/app/lib/widget.ts b/packages/js-core/src/app/lib/widget.ts
index d686f4424c..6281b4a597 100644
--- a/packages/js-core/src/app/lib/widget.ts
+++ b/packages/js-core/src/app/lib/widget.ts
@@ -5,7 +5,6 @@ import { getStyling } from "@formbricks/lib/utils/styling";
import { TJsTrackProperties } from "@formbricks/types/js";
import { TResponseHiddenFieldValue, TResponseUpdate } from "@formbricks/types/responses";
import { TSurvey } from "@formbricks/types/surveys";
-
import { ErrorHandler } from "../../shared/errors";
import { Logger } from "../../shared/logger";
import { getDefaultLanguageCode, getLanguageCode, handleHiddenFields } from "../../shared/utils";
@@ -154,7 +153,8 @@ const renderWidget = async (
data: responseUpdate.data,
ttc: responseUpdate.ttc,
finished: responseUpdate.finished,
- language: languageCode === "default" ? getDefaultLanguageCode(survey) : languageCode,
+ language:
+ responseUpdate.language === "default" ? getDefaultLanguageCode(survey) : responseUpdate.language,
meta: {
url: window.location.href,
action,
diff --git a/packages/js-core/src/shared/commandQueue.ts b/packages/js-core/src/shared/commandQueue.ts
index 024c3f5ab1..34e097015b 100644
--- a/packages/js-core/src/shared/commandQueue.ts
+++ b/packages/js-core/src/shared/commandQueue.ts
@@ -1,6 +1,5 @@
import { wrapThrowsAsync } from "@formbricks/types/errorHandlers";
import { TJsPackageType } from "@formbricks/types/js";
-
import { checkInitialized as checkInitializedInApp } from "../app/lib/initialize";
import { checkInitialized as checkInitializedWebsite } from "../website/lib/initialize";
import { ErrorHandler, Result } from "./errors";
diff --git a/packages/js-core/src/shared/utils.ts b/packages/js-core/src/shared/utils.ts
index 39932b136a..a99c5d99bd 100644
--- a/packages/js-core/src/shared/utils.ts
+++ b/packages/js-core/src/shared/utils.ts
@@ -7,7 +7,6 @@ import { TAttributes } from "@formbricks/types/attributes";
import { TJsTrackProperties } from "@formbricks/types/js";
import { TResponseHiddenFieldValue } from "@formbricks/types/responses";
import { TSurvey } from "@formbricks/types/surveys";
-
import { Logger } from "../shared/logger";
const logger = Logger.getInstance();
diff --git a/packages/js-core/src/website/lib/actions.ts b/packages/js-core/src/website/lib/actions.ts
index b9b98dcc49..72de26ea51 100644
--- a/packages/js-core/src/website/lib/actions.ts
+++ b/packages/js-core/src/website/lib/actions.ts
@@ -1,5 +1,4 @@
import { TJsTrackProperties } from "@formbricks/types/js";
-
import { InvalidCodeError, NetworkError, Result, err, okVoid } from "../../shared/errors";
import { Logger } from "../../shared/logger";
import { WebsiteConfig } from "./config";
diff --git a/packages/js-core/src/website/lib/config.ts b/packages/js-core/src/website/lib/config.ts
index a14baea33c..d18c137cb7 100644
--- a/packages/js-core/src/website/lib/config.ts
+++ b/packages/js-core/src/website/lib/config.ts
@@ -1,5 +1,4 @@
import { TJsWebsiteConfig, TJsWebsiteConfigUpdateInput } from "@formbricks/types/js";
-
import { Result, err, ok, wrapThrows } from "../../shared/errors";
export const WEBSITE_LOCAL_STORAGE_KEY = "formbricks-js-website";
diff --git a/packages/js-core/src/website/lib/sync.ts b/packages/js-core/src/website/lib/sync.ts
index 213f975b52..f7a0e55d65 100644
--- a/packages/js-core/src/website/lib/sync.ts
+++ b/packages/js-core/src/website/lib/sync.ts
@@ -1,7 +1,6 @@
import { diffInDays } from "@formbricks/lib/utils/datetime";
import { TJsWebsiteState, TJsWebsiteSyncParams } from "@formbricks/types/js";
import { TSurvey } from "@formbricks/types/surveys";
-
import { NetworkError, Result, err, ok } from "../../shared/errors";
import { Logger } from "../../shared/logger";
import { getIsDebug } from "../../shared/utils";
diff --git a/packages/js-core/src/website/lib/widget.ts b/packages/js-core/src/website/lib/widget.ts
index c78f6b41ee..3d065a12d0 100644
--- a/packages/js-core/src/website/lib/widget.ts
+++ b/packages/js-core/src/website/lib/widget.ts
@@ -5,7 +5,6 @@ import { getStyling } from "@formbricks/lib/utils/styling";
import { TJSWebsiteStateDisplay, TJsTrackProperties } from "@formbricks/types/js";
import { TResponseHiddenFieldValue, TResponseUpdate } from "@formbricks/types/responses";
import { TSurvey } from "@formbricks/types/surveys";
-
import { Logger } from "../../shared/logger";
import { getDefaultLanguageCode, getLanguageCode, handleHiddenFields } from "../../shared/utils";
import { WebsiteConfig } from "./config";
@@ -184,7 +183,8 @@ const renderWidget = async (
data: responseUpdate.data,
ttc: responseUpdate.ttc,
finished: responseUpdate.finished,
- language: languageCode === "default" ? getDefaultLanguageCode(survey) : languageCode,
+ language:
+ responseUpdate.language === "default" ? getDefaultLanguageCode(survey) : responseUpdate.language,
meta: {
url: window.location.href,
action,
diff --git a/packages/js-core/website.vite.config.ts b/packages/js-core/website.vite.config.ts
index 3ef3ee02bc..e08e44b1b5 100644
--- a/packages/js-core/website.vite.config.ts
+++ b/packages/js-core/website.vite.config.ts
@@ -1,7 +1,6 @@
import { resolve } from "path";
import { defineConfig } from "vite";
import dts from "vite-plugin-dts";
-
import webPackageJson from "../../apps/web/package.json";
const config = () => {
diff --git a/packages/js/src/app.ts b/packages/js/src/app.ts
index 131f87619d..8537af3e9f 100644
--- a/packages/js/src/app.ts
+++ b/packages/js/src/app.ts
@@ -1,6 +1,5 @@
import { TFormbricksApp } from "@formbricks/js-core/app";
import { TFormbricksWebsite } from "@formbricks/js-core/website";
-
import { loadFormbricksToProxy } from "./shared/loadFormbricks";
declare global {
diff --git a/packages/js/src/website.ts b/packages/js/src/website.ts
index 2b7e035d90..4dc6f4fc92 100644
--- a/packages/js/src/website.ts
+++ b/packages/js/src/website.ts
@@ -1,6 +1,5 @@
import { TFormbricksApp } from "@formbricks/js-core/app";
import { TFormbricksWebsite } from "@formbricks/js-core/website";
-
import { loadFormbricksToProxy } from "./shared/loadFormbricks";
declare global {
diff --git a/packages/lib/account/service.ts b/packages/lib/account/service.ts
index 1846da4e2b..c2d42b2d85 100644
--- a/packages/lib/account/service.ts
+++ b/packages/lib/account/service.ts
@@ -1,9 +1,7 @@
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { TAccount, TAccountInput, ZAccountInput } from "@formbricks/types/account";
import { DatabaseError } from "@formbricks/types/errors";
-
import { validateInputs } from "../utils/validate";
import { filterAccountInputData } from "./utils";
diff --git a/packages/lib/action/service.ts b/packages/lib/action/service.ts
index 5e7e9d9d9c..d324e058b6 100644
--- a/packages/lib/action/service.ts
+++ b/packages/lib/action/service.ts
@@ -1,14 +1,11 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { differenceInDays } from "date-fns";
-
import { prisma } from "@formbricks/database";
import { TAction, TActionInput, ZActionInput } from "@formbricks/types/actions";
import { ZOptionalNumber } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, OperationNotAllowedError } from "@formbricks/types/errors";
-
import { actionClassCache } from "../actionClass/cache";
import { getActionClassByEnvironmentIdAndName } from "../actionClass/service";
import { cache } from "../cache";
diff --git a/packages/lib/actionClass/auth.ts b/packages/lib/actionClass/auth.ts
index f84670366b..0be6a21859 100644
--- a/packages/lib/actionClass/auth.ts
+++ b/packages/lib/actionClass/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { getMembershipByUserIdOrganizationId } from "../membership/service";
diff --git a/packages/lib/actionClass/service.ts b/packages/lib/actionClass/service.ts
index a1a5ca0756..537b584bec 100644
--- a/packages/lib/actionClass/service.ts
+++ b/packages/lib/actionClass/service.ts
@@ -1,15 +1,12 @@
"use server";
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { TActionClass, TActionClassInput, ZActionClassInput } from "@formbricks/types/actionClasses";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/airtable/service.ts b/packages/lib/airtable/service.ts
index 5a8835f9cf..77603d838e 100644
--- a/packages/lib/airtable/service.ts
+++ b/packages/lib/airtable/service.ts
@@ -1,5 +1,4 @@
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { DatabaseError } from "@formbricks/types/errors";
import { TIntegrationItem } from "@formbricks/types/integration";
@@ -14,7 +13,6 @@ import {
ZIntegrationAirtableTablesWithFields,
ZIntegrationAirtableTokenSchema,
} from "@formbricks/types/integration/airtable";
-
import { AIRTABLE_CLIENT_ID } from "../constants";
import { createOrUpdateIntegration, deleteIntegration, getIntegrationByType } from "../integration/service";
diff --git a/packages/lib/apiKey/auth.ts b/packages/lib/apiKey/auth.ts
index 48ce4cb352..40ed5ace37 100644
--- a/packages/lib/apiKey/auth.ts
+++ b/packages/lib/apiKey/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/apiKey/service.ts b/packages/lib/apiKey/service.ts
index ea8130090a..ba63059131 100644
--- a/packages/lib/apiKey/service.ts
+++ b/packages/lib/apiKey/service.ts
@@ -1,14 +1,11 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { createHash, randomBytes } from "crypto";
-
import { prisma } from "@formbricks/database";
import { TApiKey, TApiKeyCreateInput, ZApiKeyCreateInput } from "@formbricks/types/apiKeys";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, InvalidInputError } from "@formbricks/types/errors";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { getHash } from "../crypto";
diff --git a/packages/lib/attribute/service.ts b/packages/lib/attribute/service.ts
index 4f916f766e..83f5c33f35 100644
--- a/packages/lib/attribute/service.ts
+++ b/packages/lib/attribute/service.ts
@@ -1,13 +1,10 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { TAttributes, ZAttributes } from "@formbricks/types/attributes";
import { ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, OperationNotAllowedError } from "@formbricks/types/errors";
-
import { attributeCache } from "../attribute/cache";
import { attributeClassCache } from "../attributeClass/cache";
import {
diff --git a/packages/lib/attributeClass/auth.ts b/packages/lib/attributeClass/auth.ts
index 9cf22c9301..f25c2e5cba 100644
--- a/packages/lib/attributeClass/auth.ts
+++ b/packages/lib/attributeClass/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/attributeClass/service.ts b/packages/lib/attributeClass/service.ts
index ce5183335e..59c77fe6b2 100644
--- a/packages/lib/attributeClass/service.ts
+++ b/packages/lib/attributeClass/service.ts
@@ -1,9 +1,7 @@
"use server";
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import {
TAttributeClass,
@@ -15,7 +13,6 @@ import {
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, OperationNotAllowedError } from "@formbricks/types/errors";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE, MAX_ATTRIBUTE_CLASSES_PER_ENVIRONMENT } from "../constants";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/auth.ts b/packages/lib/auth.ts
index 0f3d11fe40..23d18d1028 100644
--- a/packages/lib/auth.ts
+++ b/packages/lib/auth.ts
@@ -1,5 +1,4 @@
import { compare, hash } from "bcryptjs";
-
import { prisma } from "@formbricks/database";
import { AuthenticationError } from "@formbricks/types/errors";
diff --git a/packages/lib/auth/service.ts b/packages/lib/auth/service.ts
index 0e2b80787b..36ec920446 100644
--- a/packages/lib/auth/service.ts
+++ b/packages/lib/auth/service.ts
@@ -1,9 +1,7 @@
import crypto from "crypto";
import { authenticator } from "otplib";
import qrcode from "qrcode";
-
import { prisma } from "@formbricks/database";
-
import { verifyPassword } from "../auth";
import { ENCRYPTION_KEY } from "../constants";
import { symmetricDecrypt, symmetricEncrypt } from "../crypto";
diff --git a/packages/lib/constants.ts b/packages/lib/constants.ts
index 78e4e907fa..34ac086d3d 100644
--- a/packages/lib/constants.ts
+++ b/packages/lib/constants.ts
@@ -1,5 +1,4 @@
import "server-only";
-
import { env } from "./env";
export const IS_FORMBRICKS_CLOUD = env.IS_FORMBRICKS_CLOUD === "1";
diff --git a/packages/lib/crypto.ts b/packages/lib/crypto.ts
index 79bc466508..c21b961f8d 100644
--- a/packages/lib/crypto.ts
+++ b/packages/lib/crypto.ts
@@ -1,6 +1,5 @@
import crypto from "crypto";
import { createCipheriv, createDecipheriv, createHash, createHmac, randomBytes } from "crypto";
-
import { ENCRYPTION_KEY } from "./constants";
const ALGORITHM = "aes256";
diff --git a/packages/lib/customerio.ts b/packages/lib/customerio.ts
index bd7d17cbfa..b91b8abb09 100644
--- a/packages/lib/customerio.ts
+++ b/packages/lib/customerio.ts
@@ -1,5 +1,4 @@
import { TUser } from "@formbricks/types/user";
-
import { CUSTOMER_IO_API_KEY, CUSTOMER_IO_SITE_ID } from "./constants";
export const createCustomerIoCustomer = async (user: TUser) => {
diff --git a/packages/lib/display/service.ts b/packages/lib/display/service.ts
index cad080b85a..491fe9966e 100644
--- a/packages/lib/display/service.ts
+++ b/packages/lib/display/service.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber } from "@formbricks/types/common";
import {
@@ -19,7 +17,6 @@ import {
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
import { TPerson } from "@formbricks/types/people";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { createPerson, getPersonByUserId } from "../person/service";
diff --git a/packages/lib/display/tests/__mocks__/data.mock.ts b/packages/lib/display/tests/__mocks__/data.mock.ts
index 585b1874bd..3672edfd8e 100644
--- a/packages/lib/display/tests/__mocks__/data.mock.ts
+++ b/packages/lib/display/tests/__mocks__/data.mock.ts
@@ -1,5 +1,4 @@
import { Prisma } from "@prisma/client";
-
import { selectDisplay } from "../../service";
export const mockEnvironmentId = "clqkr5961000108jyfnjmbjhi";
diff --git a/packages/lib/display/tests/display.test.ts b/packages/lib/display/tests/display.test.ts
index 2a98ed8704..ee75bea3c5 100644
--- a/packages/lib/display/tests/display.test.ts
+++ b/packages/lib/display/tests/display.test.ts
@@ -14,13 +14,10 @@ import {
mockResponseId,
mockSurveyId,
} from "./__mocks__/data.mock";
-
import { Prisma } from "@prisma/client";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { testInputValidation } from "vitestSetup";
-
import { DatabaseError } from "@formbricks/types/errors";
-
import {
createDisplay,
createDisplayLegacy,
diff --git a/packages/lib/environment/auth.ts b/packages/lib/environment/auth.ts
index d23babd263..7bee822adb 100644
--- a/packages/lib/environment/auth.ts
+++ b/packages/lib/environment/auth.ts
@@ -1,9 +1,7 @@
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError } from "@formbricks/types/errors";
-
import { cache } from "../cache";
import { organizationCache } from "../organization/cache";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/environment/service.ts b/packages/lib/environment/service.ts
index 9c442aecdd..f07e993375 100644
--- a/packages/lib/environment/service.ts
+++ b/packages/lib/environment/service.ts
@@ -1,8 +1,6 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { z } from "zod";
-
import { prisma } from "@formbricks/database";
import type {
TEnvironment,
@@ -16,7 +14,6 @@ import {
ZId,
} from "@formbricks/types/environment";
import { DatabaseError, ResourceNotFoundError, ValidationError } from "@formbricks/types/errors";
-
import { cache } from "../cache";
import { getOrganizationsByUserId } from "../organization/service";
import { getProducts } from "../product/service";
diff --git a/packages/lib/googleSheet/service.ts b/packages/lib/googleSheet/service.ts
index e410965f41..4d82b37e14 100644
--- a/packages/lib/googleSheet/service.ts
+++ b/packages/lib/googleSheet/service.ts
@@ -1,15 +1,12 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { z } from "zod";
-
import { ZString } from "@formbricks/types/common";
import { DatabaseError, UnknownError } from "@formbricks/types/errors";
import {
TIntegrationGoogleSheets,
ZIntegrationGoogleSheets,
} from "@formbricks/types/integration/googleSheet";
-
import {
GOOGLE_SHEETS_CLIENT_ID,
GOOGLE_SHEETS_CLIENT_SECRET,
diff --git a/packages/lib/i18n/i18n.mock.ts b/packages/lib/i18n/i18n.mock.ts
index 7fbff9491d..a586749947 100644
--- a/packages/lib/i18n/i18n.mock.ts
+++ b/packages/lib/i18n/i18n.mock.ts
@@ -306,6 +306,7 @@ export const mockSurvey: TSurvey = {
triggers: [],
languages: mockSurveyLanguages,
segment: mockSegment,
+ showLanguageSwitch: null,
} as unknown as TSurvey;
export const mockTranslatedWelcomeCard = {
diff --git a/packages/lib/i18n/i18n.test.ts b/packages/lib/i18n/i18n.test.ts
index f96e2f2d88..a344e6275d 100644
--- a/packages/lib/i18n/i18n.test.ts
+++ b/packages/lib/i18n/i18n.test.ts
@@ -1,5 +1,4 @@
import { describe, expect, it } from "vitest";
-
import {
mockLegacySurvey,
mockSurvey,
diff --git a/packages/lib/i18n/reverseTranslation.ts b/packages/lib/i18n/reverseTranslation.ts
index a0503a42e2..f31c081e53 100644
--- a/packages/lib/i18n/reverseTranslation.ts
+++ b/packages/lib/i18n/reverseTranslation.ts
@@ -1,8 +1,6 @@
import "server-only";
-
import { TLegacySurvey, ZLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TI18nString, TSurvey } from "@formbricks/types/surveys";
-
import { structuredClone } from "../pollyfills/structuredClone";
import { isI18nObject } from "./utils";
diff --git a/packages/lib/i18n/utils.ts b/packages/lib/i18n/utils.ts
index 624a6a5fb6..ef5116a9f1 100644
--- a/packages/lib/i18n/utils.ts
+++ b/packages/lib/i18n/utils.ts
@@ -32,7 +32,6 @@ import {
ZSurveyThankYouCard,
ZSurveyWelcomeCard,
} from "@formbricks/types/surveys";
-
import { structuredClone } from "../pollyfills/structuredClone";
// Helper function to create an i18nString from a regular string.
@@ -310,3 +309,754 @@ export const getLanguageCode = (surveyLanguages: TSurveyLanguage[], languageCode
const language = surveyLanguages.find((surveyLanguage) => surveyLanguage.language.code === languageCode);
return language?.default ? "default" : language?.language.code || "default";
};
+
+export interface TIso639Language {
+ alpha2: string;
+ english: string;
+}
+
+export const iso639Languages = [
+ {
+ alpha2: "aa",
+ english: "Afar",
+ },
+ {
+ alpha2: "ab",
+ english: "Abkhazian",
+ },
+ {
+ alpha2: "ae",
+ english: "Avestan",
+ },
+ {
+ alpha2: "af",
+ english: "Afrikaans",
+ },
+ {
+ alpha2: "ak",
+ english: "Akan",
+ },
+ {
+ alpha2: "am",
+ english: "Amharic",
+ },
+ {
+ alpha2: "an",
+ english: "Aragonese",
+ },
+ {
+ alpha2: "ar",
+ english: "Arabic",
+ },
+ {
+ alpha2: "as",
+ english: "Assamese",
+ },
+ {
+ alpha2: "av",
+ english: "Avaric",
+ },
+ {
+ alpha2: "ay",
+ english: "Aymara",
+ },
+ {
+ alpha2: "az",
+ english: "Azerbaijani",
+ },
+ {
+ alpha2: "ba",
+ english: "Bashkir",
+ },
+ {
+ alpha2: "be",
+ english: "Belarusian",
+ },
+ {
+ alpha2: "bg",
+ english: "Bulgarian",
+ },
+ {
+ alpha2: "bh",
+ english: "Bihari languages",
+ },
+ {
+ alpha2: "bi",
+ english: "Bislama",
+ },
+ {
+ alpha2: "bm",
+ english: "Bambara",
+ },
+ {
+ alpha2: "bn",
+ english: "Bengali",
+ },
+ {
+ alpha2: "bo",
+ english: "Tibetan",
+ },
+ {
+ alpha2: "br",
+ english: "Breton",
+ },
+ {
+ alpha2: "bs",
+ english: "Bosnian",
+ },
+ {
+ alpha2: "ca",
+ english: "Catalan; Valencian",
+ },
+ {
+ alpha2: "ce",
+ english: "Chechen",
+ },
+ {
+ alpha2: "ch",
+ english: "Chamorro",
+ },
+ {
+ alpha2: "co",
+ english: "Corsican",
+ },
+ {
+ alpha2: "cr",
+ english: "Cree",
+ },
+ {
+ alpha2: "cs",
+ english: "Czech",
+ },
+ {
+ alpha2: "cu",
+ english: "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic",
+ },
+ {
+ alpha2: "cv",
+ english: "Chuvash",
+ },
+ {
+ alpha2: "cy",
+ english: "Welsh",
+ },
+ {
+ alpha2: "da",
+ english: "Danish",
+ },
+ {
+ alpha2: "de",
+ english: "German",
+ },
+ {
+ alpha2: "dv",
+ english: "Divehi; Dhivehi; Maldivian",
+ },
+ {
+ alpha2: "dz",
+ english: "Dzongkha",
+ },
+ {
+ alpha2: "ee",
+ english: "Ewe",
+ },
+ {
+ alpha2: "el",
+ english: "Greek, Modern (1453-)",
+ },
+ {
+ alpha2: "en",
+ english: "English",
+ },
+ {
+ alpha2: "eo",
+ english: "Esperanto",
+ },
+ {
+ alpha2: "es",
+ english: "Spanish; Castilian",
+ },
+ {
+ alpha2: "et",
+ english: "Estonian",
+ },
+ {
+ alpha2: "eu",
+ english: "Basque",
+ },
+ {
+ alpha2: "fa",
+ english: "Persian",
+ },
+ {
+ alpha2: "ff",
+ english: "Fulah",
+ },
+ {
+ alpha2: "fi",
+ english: "Finnish",
+ },
+ {
+ alpha2: "fj",
+ english: "Fijian",
+ },
+ {
+ alpha2: "fo",
+ english: "Faroese",
+ },
+ {
+ alpha2: "fr",
+ english: "French",
+ },
+ {
+ alpha2: "fy",
+ english: "Western Frisian",
+ },
+ {
+ alpha2: "ga",
+ english: "Irish",
+ },
+ {
+ alpha2: "gd",
+ english: "Gaelic; Scottish Gaelic",
+ },
+ {
+ alpha2: "gl",
+ english: "Galician",
+ },
+ {
+ alpha2: "gn",
+ english: "Guarani",
+ },
+ {
+ alpha2: "gu",
+ english: "Gujarati",
+ },
+ {
+ alpha2: "gv",
+ english: "Manx",
+ },
+ {
+ alpha2: "ha",
+ english: "Hausa",
+ },
+ {
+ alpha2: "he",
+ english: "Hebrew",
+ },
+ {
+ alpha2: "hi",
+ english: "Hindi",
+ },
+ {
+ alpha2: "ho",
+ english: "Hiri Motu",
+ },
+ {
+ alpha2: "hr",
+ english: "Croatian",
+ },
+ {
+ alpha2: "ht",
+ english: "Haitian; Haitian Creole",
+ },
+ {
+ alpha2: "hu",
+ english: "Hungarian",
+ },
+ {
+ alpha2: "hy",
+ english: "Armenian",
+ },
+ {
+ alpha2: "hz",
+ english: "Herero",
+ },
+ {
+ alpha2: "ia",
+ english: "Interlingua (International Auxiliary Language Association)",
+ },
+ {
+ alpha2: "id",
+ english: "Indonesian",
+ },
+ {
+ alpha2: "ie",
+ english: "Interlingue; Occidental",
+ },
+ {
+ alpha2: "ig",
+ english: "Igbo",
+ },
+ {
+ alpha2: "ii",
+ english: "Sichuan Yi; Nuosu",
+ },
+ {
+ alpha2: "ik",
+ english: "Inupiaq",
+ },
+ {
+ alpha2: "io",
+ english: "Ido",
+ },
+ {
+ alpha2: "is",
+ english: "Icelandic",
+ },
+ {
+ alpha2: "it",
+ english: "Italian",
+ },
+ {
+ alpha2: "iu",
+ english: "Inuktitut",
+ },
+ {
+ alpha2: "ja",
+ english: "Japanese",
+ },
+ {
+ alpha2: "jv",
+ english: "Javanese",
+ },
+ {
+ alpha2: "ka",
+ english: "Georgian",
+ },
+ {
+ alpha2: "kg",
+ english: "Kongo",
+ },
+ {
+ alpha2: "ki",
+ english: "Kikuyu; Gikuyu",
+ },
+ {
+ alpha2: "kj",
+ english: "Kuanyama; Kwanyama",
+ },
+ {
+ alpha2: "kk",
+ english: "Kazakh",
+ },
+ {
+ alpha2: "kl",
+ english: "Kalaallisut; Greenlandic",
+ },
+ {
+ alpha2: "km",
+ english: "Central Khmer",
+ },
+ {
+ alpha2: "kn",
+ english: "Kannada",
+ },
+ {
+ alpha2: "ko",
+ english: "Korean",
+ },
+ {
+ alpha2: "kr",
+ english: "Kanuri",
+ },
+ {
+ alpha2: "ks",
+ english: "Kashmiri",
+ },
+ {
+ alpha2: "ku",
+ english: "Kurdish",
+ },
+ {
+ alpha2: "kv",
+ english: "Komi",
+ },
+ {
+ alpha2: "kw",
+ english: "Cornish",
+ },
+ {
+ alpha2: "ky",
+ english: "Kirghiz; Kyrgyz",
+ },
+ {
+ alpha2: "la",
+ english: "Latin",
+ },
+ {
+ alpha2: "lb",
+ english: "Luxembourgish; Letzeburgesch",
+ },
+ {
+ alpha2: "lg",
+ english: "Ganda",
+ },
+ {
+ alpha2: "li",
+ english: "Limburgan; Limburger; Limburgish",
+ },
+ {
+ alpha2: "ln",
+ english: "Lingala",
+ },
+ {
+ alpha2: "lo",
+ english: "Lao",
+ },
+ {
+ alpha2: "lt",
+ english: "Lithuanian",
+ },
+ {
+ alpha2: "lu",
+ english: "Luba-Katanga",
+ },
+ {
+ alpha2: "lv",
+ english: "Latvian",
+ },
+ {
+ alpha2: "mg",
+ english: "Malagasy",
+ },
+ {
+ alpha2: "mh",
+ english: "Marshallese",
+ },
+ {
+ alpha2: "mi",
+ english: "Maori",
+ },
+ {
+ alpha2: "mk",
+ english: "Macedonian",
+ },
+ {
+ alpha2: "ml",
+ english: "Malayalam",
+ },
+ {
+ alpha2: "mn",
+ english: "Mongolian",
+ },
+ {
+ alpha2: "mr",
+ english: "Marathi",
+ },
+ {
+ alpha2: "ms",
+ english: "Malay",
+ },
+ {
+ alpha2: "mt",
+ english: "Maltese",
+ },
+ {
+ alpha2: "my",
+ english: "Burmese",
+ },
+ {
+ alpha2: "na",
+ english: "Nauru",
+ },
+ {
+ alpha2: "nb",
+ english: "Bokmål, Norwegian; Norwegian Bokmål",
+ },
+ {
+ alpha2: "nd",
+ english: "Ndebele, North; North Ndebele",
+ },
+ {
+ alpha2: "ne",
+ english: "Nepali",
+ },
+ {
+ alpha2: "ng",
+ english: "Ndonga",
+ },
+ {
+ alpha2: "nl",
+ english: "Dutch; Flemish",
+ },
+ {
+ alpha2: "nn",
+ english: "Norwegian Nynorsk; Nynorsk, Norwegian",
+ },
+ {
+ alpha2: "no",
+ english: "Norwegian",
+ },
+ {
+ alpha2: "nr",
+ english: "Ndebele, South; South Ndebele",
+ },
+ {
+ alpha2: "nv",
+ english: "Navajo; Navaho",
+ },
+ {
+ alpha2: "ny",
+ english: "Chichewa; Chewa; Nyanja",
+ },
+ {
+ alpha2: "oc",
+ english: "Occitan (post 1500)",
+ },
+ {
+ alpha2: "oj",
+ english: "Ojibwa",
+ },
+ {
+ alpha2: "om",
+ english: "Oromo",
+ },
+ {
+ alpha2: "or",
+ english: "Oriya",
+ },
+ {
+ alpha2: "os",
+ english: "Ossetian; Ossetic",
+ },
+ {
+ alpha2: "pa",
+ english: "Panjabi; Punjabi",
+ },
+ {
+ alpha2: "pi",
+ english: "Pali",
+ },
+ {
+ alpha2: "pl",
+ english: "Polish",
+ },
+ {
+ alpha2: "ps",
+ english: "Pushto; Pashto",
+ },
+ {
+ alpha2: "pt",
+ english: "Portuguese",
+ },
+ {
+ alpha2: "qu",
+ english: "Quechua",
+ },
+ {
+ alpha2: "rm",
+ english: "Romansh",
+ },
+ {
+ alpha2: "rn",
+ english: "Rundi",
+ },
+ {
+ alpha2: "ro",
+ english: "Romanian; Moldavian; Moldovan",
+ },
+ {
+ alpha2: "ru",
+ english: "Russian",
+ },
+ {
+ alpha2: "rw",
+ english: "Kinyarwanda",
+ },
+ {
+ alpha2: "sa",
+ english: "Sanskrit",
+ },
+ {
+ alpha2: "sc",
+ english: "Sardinian",
+ },
+ {
+ alpha2: "sd",
+ english: "Sindhi",
+ },
+ {
+ alpha2: "se",
+ english: "Northern Sami",
+ },
+ {
+ alpha2: "sg",
+ english: "Sango",
+ },
+ {
+ alpha2: "si",
+ english: "Sinhala; Sinhalese",
+ },
+ {
+ alpha2: "sk",
+ english: "Slovak",
+ },
+ {
+ alpha2: "sl",
+ english: "Slovenian",
+ },
+ {
+ alpha2: "sm",
+ english: "Samoan",
+ },
+ {
+ alpha2: "sn",
+ english: "Shona",
+ },
+ {
+ alpha2: "so",
+ english: "Somali",
+ },
+ {
+ alpha2: "sq",
+ english: "Albanian",
+ },
+ {
+ alpha2: "sr",
+ english: "Serbian",
+ },
+ {
+ alpha2: "ss",
+ english: "Swati",
+ },
+ {
+ alpha2: "st",
+ english: "Sotho, Southern",
+ },
+ {
+ alpha2: "su",
+ english: "Sundanese",
+ },
+ {
+ alpha2: "sv",
+ english: "Swedish",
+ },
+ {
+ alpha2: "sw",
+ english: "Swahili",
+ },
+ {
+ alpha2: "ta",
+ english: "Tamil",
+ },
+ {
+ alpha2: "te",
+ english: "Telugu",
+ },
+ {
+ alpha2: "tg",
+ english: "Tajik",
+ },
+ {
+ alpha2: "th",
+ english: "Thai",
+ },
+ {
+ alpha2: "ti",
+ english: "Tigrinya",
+ },
+ {
+ alpha2: "tk",
+ english: "Turkmen",
+ },
+ {
+ alpha2: "tl",
+ english: "Tagalog",
+ },
+ {
+ alpha2: "tn",
+ english: "Tswana",
+ },
+ {
+ alpha2: "to",
+ english: "Tonga (Tonga Islands)",
+ },
+ {
+ alpha2: "tr",
+ english: "Turkish",
+ },
+ {
+ alpha2: "ts",
+ english: "Tsonga",
+ },
+ {
+ alpha2: "tt",
+ english: "Tatar",
+ },
+ {
+ alpha2: "tw",
+ english: "Twi",
+ },
+ {
+ alpha2: "ty",
+ english: "Tahitian",
+ },
+ {
+ alpha2: "ug",
+ english: "Uighur; Uyghur",
+ },
+ {
+ alpha2: "uk",
+ english: "Ukrainian",
+ },
+ {
+ alpha2: "ur",
+ english: "Urdu",
+ },
+ {
+ alpha2: "uz",
+ english: "Uzbek",
+ },
+ {
+ alpha2: "ve",
+ english: "Venda",
+ },
+ {
+ alpha2: "vi",
+ english: "Vietnamese",
+ },
+ {
+ alpha2: "vo",
+ english: "Volapük",
+ },
+ {
+ alpha2: "wa",
+ english: "Walloon",
+ },
+ {
+ alpha2: "wo",
+ english: "Wolof",
+ },
+ {
+ alpha2: "xh",
+ english: "Xhosa",
+ },
+ {
+ alpha2: "yi",
+ english: "Yiddish",
+ },
+ {
+ alpha2: "yo",
+ english: "Yoruba",
+ },
+ {
+ alpha2: "za",
+ english: "Zhuang; Chuang",
+ },
+ {
+ alpha2: "zh",
+ english: "Chinese",
+ },
+ {
+ alpha2: "zu",
+ english: "Zulu",
+ },
+];
+
+export const iso639Identifiers = iso639Languages.map((language) => language.alpha2);
+
+export const getLanguageLabel = (languageCode: string) => {
+ const language = iso639Languages.find((lang) => lang.alpha2 === languageCode);
+ return `${language?.english}`;
+};
diff --git a/packages/lib/instance/service.ts b/packages/lib/instance/service.ts
index f413c8ac5e..92ff92b488 100644
--- a/packages/lib/instance/service.ts
+++ b/packages/lib/instance/service.ts
@@ -1,10 +1,7 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { DatabaseError } from "@formbricks/types/errors";
-
import { cache } from "../cache";
import { organizationCache } from "../organization/cache";
import { userCache } from "../user/cache";
diff --git a/packages/lib/integration/auth.ts b/packages/lib/integration/auth.ts
index cf22488957..5183113ead 100644
--- a/packages/lib/integration/auth.ts
+++ b/packages/lib/integration/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/integration/service.ts b/packages/lib/integration/service.ts
index 368db4a3ff..83c525f734 100644
--- a/packages/lib/integration/service.ts
+++ b/packages/lib/integration/service.ts
@@ -1,13 +1,10 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError } from "@formbricks/types/errors";
import { TIntegration, TIntegrationInput, ZIntegrationType } from "@formbricks/types/integration";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/invite/service.ts b/packages/lib/invite/service.ts
index 4328863ca8..63b3978849 100644
--- a/packages/lib/invite/service.ts
+++ b/packages/lib/invite/service.ts
@@ -1,8 +1,6 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { getServerSession } from "next-auth";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import {
@@ -18,7 +16,6 @@ import {
ZInviteUpdateInput,
ZInvitee,
} from "@formbricks/types/invites";
-
import { authOptions } from "../authOptions";
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
diff --git a/packages/lib/jwt.ts b/packages/lib/jwt.ts
index be558dd6e1..4114b732e8 100644
--- a/packages/lib/jwt.ts
+++ b/packages/lib/jwt.ts
@@ -1,7 +1,5 @@
import jwt, { JwtPayload } from "jsonwebtoken";
-
import { prisma } from "@formbricks/database";
-
import { env } from "./env";
export const createToken = (userId: string, userEmail: string, options = {}): string => {
diff --git a/packages/lib/language/service.ts b/packages/lib/language/service.ts
index fbb5f7df7c..1d1554a6cf 100644
--- a/packages/lib/language/service.ts
+++ b/packages/lib/language/service.ts
@@ -1,5 +1,4 @@
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, ValidationError } from "@formbricks/types/errors";
@@ -10,7 +9,6 @@ import {
ZLanguageInput,
ZLanguageUpdate,
} from "@formbricks/types/product";
-
import { productCache } from "../product/cache";
import { surveyCache } from "../survey/cache";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/language/tests/language.unit.ts b/packages/lib/language/tests/language.unit.ts
index 65f3f3b877..998e6cb271 100644
--- a/packages/lib/language/tests/language.unit.ts
+++ b/packages/lib/language/tests/language.unit.ts
@@ -7,12 +7,9 @@ import {
mockProductId,
mockUpdatedLanguage,
} from "./__mocks__/data.mock";
-
import { Prisma } from "@prisma/client";
-
import { prismaMock } from "@formbricks/database/src/jestClient";
import { DatabaseError, ValidationError } from "@formbricks/types/errors";
-
import { createLanguage, deleteLanguage, updateLanguage } from "../service";
const testInputValidation = async (service: Function, ...args: any[]): Promise
=> {
diff --git a/packages/lib/membership/hooks/actions.ts b/packages/lib/membership/hooks/actions.ts
index 788f43a33b..720020d7de 100644
--- a/packages/lib/membership/hooks/actions.ts
+++ b/packages/lib/membership/hooks/actions.ts
@@ -1,12 +1,9 @@
"use server";
import "server-only";
-
import { getServerSession } from "next-auth";
-
import { AuthenticationError } from "@formbricks/types/errors";
import { TUser } from "@formbricks/types/user";
-
import { authOptions } from "../../authOptions";
import { getOrganizationByEnvironmentId } from "../../organization/service";
import { getMembershipByUserIdOrganizationId } from "../service";
diff --git a/packages/lib/membership/hooks/useMembershipRole.tsx b/packages/lib/membership/hooks/useMembershipRole.tsx
index 13c975c9de..4226dcc1d3 100644
--- a/packages/lib/membership/hooks/useMembershipRole.tsx
+++ b/packages/lib/membership/hooks/useMembershipRole.tsx
@@ -1,5 +1,4 @@
import { useEffect, useState } from "react";
-
import { getMembershipByUserIdOrganizationIdAction } from "./actions";
enum MembershipRole {
diff --git a/packages/lib/membership/service.ts b/packages/lib/membership/service.ts
index e43267867c..3553474e63 100644
--- a/packages/lib/membership/service.ts
+++ b/packages/lib/membership/service.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { DatabaseError, ResourceNotFoundError, UnknownError } from "@formbricks/types/errors";
@@ -12,7 +10,6 @@ import {
ZMembership,
ZMembershipUpdateInput,
} from "@formbricks/types/memberships";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { organizationCache } from "../organization/cache";
diff --git a/packages/lib/notion/service.ts b/packages/lib/notion/service.ts
index 0df294f088..76c03467ae 100644
--- a/packages/lib/notion/service.ts
+++ b/packages/lib/notion/service.ts
@@ -3,7 +3,6 @@ import {
TIntegrationNotionConfig,
TIntegrationNotionDatabase,
} from "@formbricks/types/integration/notion";
-
import { ENCRYPTION_KEY } from "../constants";
import { symmetricDecrypt } from "../crypto";
import { getIntegrationByType } from "../integration/service";
diff --git a/packages/lib/organization/auth.ts b/packages/lib/organization/auth.ts
index b29cf12c6a..da227de64a 100644
--- a/packages/lib/organization/auth.ts
+++ b/packages/lib/organization/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { getMembershipByUserIdOrganizationId } from "../membership/service";
import { getAccessFlags } from "../membership/utils";
diff --git a/packages/lib/organization/hooks/actions.ts b/packages/lib/organization/hooks/actions.ts
index aed4ffe451..6dd8e8305c 100644
--- a/packages/lib/organization/hooks/actions.ts
+++ b/packages/lib/organization/hooks/actions.ts
@@ -1,11 +1,8 @@
"use server";
import "server-only";
-
import { getServerSession } from "next-auth";
-
import { AuthenticationError, ResourceNotFoundError } from "@formbricks/types/errors";
-
import { authOptions } from "../../authOptions";
import { getOrganization, getOrganizationBillingInfo } from "../service";
diff --git a/packages/lib/organization/hooks/useGetBillingInfo.ts b/packages/lib/organization/hooks/useGetBillingInfo.ts
index 160b70b9aa..c7af7766c8 100644
--- a/packages/lib/organization/hooks/useGetBillingInfo.ts
+++ b/packages/lib/organization/hooks/useGetBillingInfo.ts
@@ -1,7 +1,5 @@
import { useEffect, useState } from "react";
-
import { TOrganizationBilling } from "@formbricks/types/organizations";
-
import { getOrganizationBillingInfoAction } from "./actions";
export const useGetBillingInfo = (organizationId: string) => {
diff --git a/packages/lib/organization/service.ts b/packages/lib/organization/service.ts
index 6fe56b588b..a8332b1584 100644
--- a/packages/lib/organization/service.ts
+++ b/packages/lib/organization/service.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
@@ -14,7 +12,6 @@ import {
ZOrganizationCreateInput,
} from "@formbricks/types/organizations";
import { TUserNotificationSettings } from "@formbricks/types/user";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { environmentCache } from "../environment/cache";
diff --git a/packages/lib/person/auth.ts b/packages/lib/person/auth.ts
index 15da9f2b42..eee3de32b6 100644
--- a/packages/lib/person/auth.ts
+++ b/packages/lib/person/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/person/service.ts b/packages/lib/person/service.ts
index da53c8499b..5d386cb531 100644
--- a/packages/lib/person/service.ts
+++ b/packages/lib/person/service.ts
@@ -1,13 +1,10 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError } from "@formbricks/types/errors";
import { TPerson } from "@formbricks/types/people";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/posthogServer.ts b/packages/lib/posthogServer.ts
index 06887524ab..6ad14c772e 100644
--- a/packages/lib/posthogServer.ts
+++ b/packages/lib/posthogServer.ts
@@ -1,5 +1,4 @@
import { PostHog } from "posthog-node";
-
import { env } from "./env";
const enabled =
diff --git a/packages/lib/product/auth.ts b/packages/lib/product/auth.ts
index 091fe6c721..ab9926f4f1 100644
--- a/packages/lib/product/auth.ts
+++ b/packages/lib/product/auth.ts
@@ -1,5 +1,4 @@
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { getMembershipByUserIdOrganizationId } from "../membership/service";
import { getAccessFlags } from "../membership/utils";
diff --git a/packages/lib/product/service.ts b/packages/lib/product/service.ts
index 9cbf8a6840..787fab9b70 100644
--- a/packages/lib/product/service.ts
+++ b/packages/lib/product/service.ts
@@ -1,15 +1,12 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { z } from "zod";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, ValidationError } from "@formbricks/types/errors";
import type { TProduct, TProductUpdateInput } from "@formbricks/types/product";
import { ZProduct, ZProductUpdateInput } from "@formbricks/types/product";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE, isS3Configured } from "../constants";
import { environmentCache } from "../environment/cache";
diff --git a/packages/lib/response/auth.ts b/packages/lib/response/auth.ts
index 359ef02d93..a5f7122f0e 100644
--- a/packages/lib/response/auth.ts
+++ b/packages/lib/response/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { getSurvey } from "../survey/service";
diff --git a/packages/lib/response/service.ts b/packages/lib/response/service.ts
index 5e25de8814..a87fdd34b3 100644
--- a/packages/lib/response/service.ts
+++ b/packages/lib/response/service.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { TAttributes } from "@formbricks/types/attributes";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
@@ -21,7 +19,6 @@ import {
} from "@formbricks/types/responses";
import { TSurveySummary } from "@formbricks/types/surveys";
import { TTag } from "@formbricks/types/tags";
-
import { getAttributes } from "../attribute/service";
import { cache } from "../cache";
import { ITEMS_PER_PAGE, WEBAPP_URL } from "../constants";
diff --git a/packages/lib/response/tests/response.test.ts b/packages/lib/response/tests/response.test.ts
index ad550706b7..6389bb5d1a 100644
--- a/packages/lib/response/tests/response.test.ts
+++ b/packages/lib/response/tests/response.test.ts
@@ -17,11 +17,9 @@ import {
mockTags,
mockUserId,
} from "./__mocks__/data.mock";
-
import { Prisma } from "@prisma/client";
import { beforeEach, describe, expect, it } from "vitest";
import { testInputValidation } from "vitestSetup";
-
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
import {
TResponse,
@@ -30,7 +28,6 @@ import {
TResponseLegacyInput,
} from "@formbricks/types/responses";
import { TTag } from "@formbricks/types/tags";
-
import { selectPerson } from "../../person/service";
import { mockAttributeClass, mockSurveyOutput } from "../../survey/tests/__mock__/survey.mock";
import {
diff --git a/packages/lib/responseNote/auth.ts b/packages/lib/responseNote/auth.ts
index 60d937e695..7ad756aa5e 100644
--- a/packages/lib/responseNote/auth.ts
+++ b/packages/lib/responseNote/auth.ts
@@ -1,5 +1,4 @@
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { canUserAccessResponse } from "../response/auth";
import { getResponse } from "../response/service";
diff --git a/packages/lib/responseNote/service.ts b/packages/lib/responseNote/service.ts
index cf14bdcb90..8e9429fffc 100644
--- a/packages/lib/responseNote/service.ts
+++ b/packages/lib/responseNote/service.ts
@@ -1,13 +1,10 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
import { TResponseNote } from "@formbricks/types/responses";
-
import { cache } from "../cache";
import { responseCache } from "../response/cache";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/responseQueue.ts b/packages/lib/responseQueue.ts
index 08550572ed..21c2df8465 100644
--- a/packages/lib/responseQueue.ts
+++ b/packages/lib/responseQueue.ts
@@ -1,6 +1,5 @@
import { FormbricksAPI } from "@formbricks/api";
import { TResponseUpdate } from "@formbricks/types/responses";
-
import { SurveyState } from "./surveyState";
import { delay } from "./utils/promises";
diff --git a/packages/lib/responses.ts b/packages/lib/responses.ts
index 135aebc78f..f1525fe4ab 100644
--- a/packages/lib/responses.ts
+++ b/packages/lib/responses.ts
@@ -1,6 +1,5 @@
import { TResponse } from "@formbricks/types/responses";
import { TSurvey, TSurveyQuestion, TSurveyQuestionType } from "@formbricks/types/surveys";
-
import { getLocalizedValue } from "./i18n/utils";
import { parseRecallInfo } from "./utils/recall";
diff --git a/packages/lib/segment/tests/segment.test.ts b/packages/lib/segment/tests/segment.test.ts
index fedbe8a606..b3d34f839f 100644
--- a/packages/lib/segment/tests/segment.test.ts
+++ b/packages/lib/segment/tests/segment.test.ts
@@ -10,13 +10,10 @@ import {
mockSegmentUpdateInput,
mockSurveyId,
} from "./__mocks__/segment.mock";
-
import { Prisma } from "@prisma/client";
import { beforeEach, describe, expect, it } from "vitest";
import { testInputValidation } from "vitestSetup";
-
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
-
import {
cloneSegment,
createSegment,
diff --git a/packages/lib/segment/utils.ts b/packages/lib/segment/utils.ts
index 47a94a537b..ee10015fd5 100644
--- a/packages/lib/segment/utils.ts
+++ b/packages/lib/segment/utils.ts
@@ -1,5 +1,4 @@
import { createId } from "@paralleldrive/cuid2";
-
import {
TActionMetric,
TAllOperators,
diff --git a/packages/lib/shortUrl/service.ts b/packages/lib/shortUrl/service.ts
index bc19126d15..10c0b3738e 100644
--- a/packages/lib/shortUrl/service.ts
+++ b/packages/lib/shortUrl/service.ts
@@ -1,11 +1,9 @@
import { Prisma } from "@prisma/client";
import { customAlphabet } from "nanoid";
import z from "zod";
-
import { prisma } from "@formbricks/database";
import { DatabaseError } from "@formbricks/types/errors";
import { TShortUrl, ZShortUrlId } from "@formbricks/types/shortUrl";
-
import { validateInputs } from "../utils/validate";
// Create the short url and return it
diff --git a/packages/lib/slack/service.ts b/packages/lib/slack/service.ts
index aff1f5598e..5adbef16dd 100644
--- a/packages/lib/slack/service.ts
+++ b/packages/lib/slack/service.ts
@@ -1,9 +1,7 @@
import { Prisma } from "@prisma/client";
-
import { DatabaseError } from "@formbricks/types/errors";
import { TIntegration, TIntegrationItem } from "@formbricks/types/integration";
import { TIntegrationSlack, TIntegrationSlackCredential } from "@formbricks/types/integration/slack";
-
import { deleteIntegration, getIntegrationByType } from "../integration/service";
export const fetchChannels = async (slackIntegration: TIntegration): Promise => {
diff --git a/packages/lib/storage/service.ts b/packages/lib/storage/service.ts
index 1ae386bfb9..01eb4bd68b 100644
--- a/packages/lib/storage/service.ts
+++ b/packages/lib/storage/service.ts
@@ -13,9 +13,7 @@ import { randomUUID } from "crypto";
import { access, mkdir, readFile, rmdir, unlink, writeFile } from "fs/promises";
import { lookup } from "mime-types";
import path, { join } from "path";
-
import { TAccessType } from "@formbricks/types/storage";
-
import {
MAX_SIZES,
S3_ACCESS_KEY,
diff --git a/packages/lib/styling/constants.ts b/packages/lib/styling/constants.ts
index 47c22e2443..7ae6b188f1 100644
--- a/packages/lib/styling/constants.ts
+++ b/packages/lib/styling/constants.ts
@@ -132,4 +132,5 @@ export const PREVIEW_SURVEY = {
resultShareKey: null,
languages: [],
triggers: [],
+ showLanguageSwitch: false,
} as TSurvey;
diff --git a/packages/lib/survey/auth.ts b/packages/lib/survey/auth.ts
index 964efb0e5d..951da37ea3 100644
--- a/packages/lib/survey/auth.ts
+++ b/packages/lib/survey/auth.ts
@@ -1,5 +1,4 @@
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { getMembershipByUserIdOrganizationId } from "../membership/service";
diff --git a/packages/lib/survey/service.ts b/packages/lib/survey/service.ts
index fc3ea76c17..6ab0a82a98 100644
--- a/packages/lib/survey/service.ts
+++ b/packages/lib/survey/service.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { TLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TActionClass } from "@formbricks/types/actionClasses";
@@ -11,7 +9,6 @@ import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbr
import { TPerson } from "@formbricks/types/people";
import { TSegment, ZSegmentFilters } from "@formbricks/types/segment";
import { TSurvey, TSurveyFilterCriteria, TSurveyInput, ZSurvey } from "@formbricks/types/surveys";
-
import { getActionsByPersonId } from "../action/service";
import { getActionClasses } from "../actionClass/service";
import { attributeCache } from "../attribute/cache";
@@ -75,6 +72,7 @@ export const selectSurvey = {
singleUse: true,
pin: true,
resultShareKey: true,
+ showLanguageSwitch: true,
languages: {
select: {
default: true,
diff --git a/packages/lib/survey/tests/__mock__/survey.mock.ts b/packages/lib/survey/tests/__mock__/survey.mock.ts
index 51560a5642..e91b8d2e25 100644
--- a/packages/lib/survey/tests/__mock__/survey.mock.ts
+++ b/packages/lib/survey/tests/__mock__/survey.mock.ts
@@ -272,6 +272,7 @@ export const updateSurveyInput: TSurvey = {
resultShareKey: null,
segment: null,
languages: [],
+ showLanguageSwitch: null,
...commonMockProperties,
...baseSurveyProperties,
};
diff --git a/packages/lib/survey/tests/survey.test.ts b/packages/lib/survey/tests/survey.test.ts
index d744a3d9d8..703b3f8e67 100644
--- a/packages/lib/survey/tests/survey.test.ts
+++ b/packages/lib/survey/tests/survey.test.ts
@@ -1,11 +1,8 @@
import { prisma } from "../../__mocks__/database";
-
import { Prisma } from "@prisma/client";
import { beforeEach, describe, expect, it } from "vitest";
import { testInputValidation } from "vitestSetup";
-
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
-
import {
createSurvey,
deleteSurvey,
diff --git a/packages/lib/survey/utils.ts b/packages/lib/survey/utils.ts
index 419c3d7a90..0a3bdc2430 100644
--- a/packages/lib/survey/utils.ts
+++ b/packages/lib/survey/utils.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { TLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TSegment } from "@formbricks/types/segment";
import { TSurvey, TSurveyFilterCriteria } from "@formbricks/types/surveys";
diff --git a/packages/lib/tag/auth.ts b/packages/lib/tag/auth.ts
index a396910f87..f2b9b06d9e 100644
--- a/packages/lib/tag/auth.ts
+++ b/packages/lib/tag/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { hasUserEnvironmentAccess } from "../environment/auth";
import { getMembershipByUserIdOrganizationId } from "../membership/service";
import { getAccessFlags } from "../membership/utils";
diff --git a/packages/lib/tag/service.ts b/packages/lib/tag/service.ts
index 6feb991c28..9893e6fccd 100644
--- a/packages/lib/tag/service.ts
+++ b/packages/lib/tag/service.ts
@@ -1,10 +1,8 @@
import "server-only";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber, ZString } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { TTag } from "@formbricks/types/tags";
-
import { ITEMS_PER_PAGE } from "../constants";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/tagOnResponse/auth.ts b/packages/lib/tagOnResponse/auth.ts
index 13fc410661..67e8cb3cf7 100644
--- a/packages/lib/tagOnResponse/auth.ts
+++ b/packages/lib/tagOnResponse/auth.ts
@@ -1,7 +1,5 @@
import "server-only";
-
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { getMembershipByUserIdOrganizationId } from "../membership/service";
import { getAccessFlags } from "../membership/utils";
diff --git a/packages/lib/tagOnResponse/service.ts b/packages/lib/tagOnResponse/service.ts
index 49c4f00928..e116765b0c 100644
--- a/packages/lib/tagOnResponse/service.ts
+++ b/packages/lib/tagOnResponse/service.ts
@@ -1,12 +1,9 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError } from "@formbricks/types/errors";
import { TTagsCount, TTagsOnResponses } from "@formbricks/types/tags";
-
import { cache } from "../cache";
import { responseCache } from "../response/cache";
import { getResponse } from "../response/service";
diff --git a/packages/lib/user/service.ts b/packages/lib/user/service.ts
index 2ea1bcef04..3c4964081e 100644
--- a/packages/lib/user/service.ts
+++ b/packages/lib/user/service.ts
@@ -1,14 +1,11 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
import { z } from "zod";
-
import { prisma } from "@formbricks/database";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors";
import { TMembership } from "@formbricks/types/memberships";
import { TUser, TUserCreateInput, TUserUpdateInput, ZUserUpdateInput } from "@formbricks/types/user";
-
import { cache } from "../cache";
import { createCustomerIoCustomer } from "../customerio";
import { deleteMembership, updateMembership } from "../membership/service";
diff --git a/packages/lib/utils/recall.ts b/packages/lib/utils/recall.ts
index fc31fdaaef..e7553225a5 100644
--- a/packages/lib/utils/recall.ts
+++ b/packages/lib/utils/recall.ts
@@ -8,7 +8,6 @@ import {
TSurveyQuestionsObject,
TSurveyRecallItem,
} from "@formbricks/types/surveys";
-
import { getLocalizedValue } from "../i18n/utils";
import { structuredClone } from "../pollyfills/structuredClone";
import { formatDateWithOrdinal, isValidDateString } from "./datetime";
diff --git a/packages/lib/utils/singleUseSurveys.ts b/packages/lib/utils/singleUseSurveys.ts
index 0a95769992..f6d75d0387 100644
--- a/packages/lib/utils/singleUseSurveys.ts
+++ b/packages/lib/utils/singleUseSurveys.ts
@@ -1,5 +1,4 @@
import cuid2 from "@paralleldrive/cuid2";
-
import { decryptAES128, symmetricDecrypt, symmetricEncrypt } from "../../lib/crypto";
import { env } from "../../lib/env";
diff --git a/packages/lib/utils/validate.ts b/packages/lib/utils/validate.ts
index 2341950704..f9ca6f7500 100644
--- a/packages/lib/utils/validate.ts
+++ b/packages/lib/utils/validate.ts
@@ -1,5 +1,4 @@
import z from "zod";
-
import { ValidationError } from "@formbricks/types/errors";
type ValidationPair = [any, z.ZodSchema];
diff --git a/packages/lib/vitestSetup.ts b/packages/lib/vitestSetup.ts
index 5519de5111..4820c5cc99 100644
--- a/packages/lib/vitestSetup.ts
+++ b/packages/lib/vitestSetup.ts
@@ -1,6 +1,5 @@
// mock these globally used functions
import { afterEach, beforeEach, expect, it, vi } from "vitest";
-
import { ValidationError } from "@formbricks/types/errors";
vi.mock("next/cache", () => ({
diff --git a/packages/lib/webhook/auth.ts b/packages/lib/webhook/auth.ts
index 38f70290d7..f3b4626118 100644
--- a/packages/lib/webhook/auth.ts
+++ b/packages/lib/webhook/auth.ts
@@ -1,5 +1,4 @@
import { ZId } from "@formbricks/types/environment";
-
import { cache } from "../cache";
import { hasUserEnvironmentAccess } from "../environment/auth";
import { validateInputs } from "../utils/validate";
diff --git a/packages/lib/webhook/cache.ts b/packages/lib/webhook/cache.ts
index bdd2f572e7..f3c07fe576 100644
--- a/packages/lib/webhook/cache.ts
+++ b/packages/lib/webhook/cache.ts
@@ -1,5 +1,4 @@
import { revalidateTag } from "next/cache";
-
import { TWebhookInput } from "@formbricks/types/webhooks";
interface RevalidateProps {
diff --git a/packages/lib/webhook/service.ts b/packages/lib/webhook/service.ts
index cb533011b4..156d0ecd48 100644
--- a/packages/lib/webhook/service.ts
+++ b/packages/lib/webhook/service.ts
@@ -1,13 +1,10 @@
import "server-only";
-
import { Prisma } from "@prisma/client";
-
import { prisma } from "@formbricks/database";
import { ZOptionalNumber } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors";
import { TWebhook, TWebhookInput, ZWebhookInput } from "@formbricks/types/webhooks";
-
import { cache } from "../cache";
import { ITEMS_PER_PAGE } from "../constants";
import { validateInputs } from "../utils/validate";
diff --git a/packages/surveys/src/components/general/CalEmbed.tsx b/packages/surveys/src/components/general/CalEmbed.tsx
index 7803fdce64..9dde053f47 100644
--- a/packages/surveys/src/components/general/CalEmbed.tsx
+++ b/packages/surveys/src/components/general/CalEmbed.tsx
@@ -1,7 +1,6 @@
import { cn } from "@/lib/utils";
import snippet from "@calcom/embed-snippet";
import { useEffect, useMemo } from "preact/hooks";
-
import { TSurveyCalQuestion } from "@formbricks/types/surveys";
interface CalEmbedProps {
diff --git a/packages/surveys/src/components/general/FileInput.tsx b/packages/surveys/src/components/general/FileInput.tsx
index 58e272ea58..468751ccd8 100644
--- a/packages/surveys/src/components/general/FileInput.tsx
+++ b/packages/surveys/src/components/general/FileInput.tsx
@@ -1,6 +1,5 @@
import { useMemo, useState } from "preact/hooks";
import { JSXInternal } from "preact/src/jsx";
-
import { getOriginalFileNameFromUrl } from "@formbricks/lib/storage/utils";
import { TAllowedFileExtension } from "@formbricks/types/common";
import { TUploadFileConfig } from "@formbricks/types/storage";
diff --git a/packages/surveys/src/components/general/GlobeIcon.tsx b/packages/surveys/src/components/general/GlobeIcon.tsx
new file mode 100644
index 0000000000..23d4291e4f
--- /dev/null
+++ b/packages/surveys/src/components/general/GlobeIcon.tsx
@@ -0,0 +1,22 @@
+interface GlobeIconProps {
+ className?: string;
+}
+
+export const GlobeIcon = ({ className }: GlobeIconProps) => {
+ return (
+
+ );
+};
diff --git a/packages/surveys/src/components/general/LanguageSwitch.tsx b/packages/surveys/src/components/general/LanguageSwitch.tsx
new file mode 100644
index 0000000000..0e3eed60db
--- /dev/null
+++ b/packages/surveys/src/components/general/LanguageSwitch.tsx
@@ -0,0 +1,71 @@
+import { GlobeIcon } from "@/components/general/GlobeIcon";
+import { useRef, useState } from "react";
+import { getLanguageLabel } from "@formbricks/lib/i18n/utils";
+import { useClickOutside } from "@formbricks/lib/utils/hooks/useClickOutside";
+import { TSurveyLanguage } from "@formbricks/types/surveys";
+
+interface LanguageSwitchProps {
+ surveyLanguages: TSurveyLanguage[];
+ setSelectedLanguageCode: (languageCode: string) => void;
+ setFirstRender?: (firstRender: boolean) => void;
+}
+export const LanguageSwitch = ({
+ surveyLanguages,
+ setSelectedLanguageCode,
+ setFirstRender,
+}: LanguageSwitchProps) => {
+ const [showLanguageDropdown, setShowLanguageDropdown] = useState(false);
+ const toggleDropdown = () => setShowLanguageDropdown((prev) => !prev);
+ const languageDropdownRef = useRef(null);
+ const defaultLanguageCode = surveyLanguages.find((surveyLanguage) => {
+ return surveyLanguage.default === true;
+ })?.language.code;
+
+ const changeLanguage = (languageCode: string) => {
+ if (languageCode === defaultLanguageCode) {
+ setSelectedLanguageCode("default");
+ } else {
+ setSelectedLanguageCode(languageCode);
+ }
+ if (setFirstRender) {
+ //for lexical editor
+ setFirstRender(true);
+ }
+ setShowLanguageDropdown(false);
+ };
+
+ useClickOutside(languageDropdownRef, () => setShowLanguageDropdown(false));
+
+ return (
+
+
+ {showLanguageDropdown && (
+
+ {surveyLanguages.map((surveyLanguage) => {
+ if (!surveyLanguage.enabled) return;
+ return (
+
+ );
+ })}
+
+ )}
+
+ );
+};
diff --git a/packages/surveys/src/components/general/ProgressBar.tsx b/packages/surveys/src/components/general/ProgressBar.tsx
index 47e1afae00..c6fae01c48 100644
--- a/packages/surveys/src/components/general/ProgressBar.tsx
+++ b/packages/surveys/src/components/general/ProgressBar.tsx
@@ -1,8 +1,6 @@
import { calculateElementIdx } from "@/lib/utils";
import { useCallback, useMemo } from "preact/hooks";
-
import { TSurvey } from "@formbricks/types/surveys";
-
import { Progress } from "./Progress";
interface ProgressBarProps {
diff --git a/packages/surveys/src/components/general/ResponseErrorComponent.tsx b/packages/surveys/src/components/general/ResponseErrorComponent.tsx
index 7c51a15d3a..551f60bdc7 100644
--- a/packages/surveys/src/components/general/ResponseErrorComponent.tsx
+++ b/packages/surveys/src/components/general/ResponseErrorComponent.tsx
@@ -1,5 +1,4 @@
import { SubmitButton } from "@/components/buttons/SubmitButton";
-
import { processResponseData } from "@formbricks/lib/responses";
import { type TResponseData } from "@formbricks/types/responses";
import { type TSurveyQuestion } from "@formbricks/types/surveys";
diff --git a/packages/surveys/src/components/general/Survey.tsx b/packages/surveys/src/components/general/Survey.tsx
index 4d47822d73..929e590aad 100644
--- a/packages/surveys/src/components/general/Survey.tsx
+++ b/packages/surveys/src/components/general/Survey.tsx
@@ -1,4 +1,5 @@
import { FormbricksBranding } from "@/components/general/FormbricksBranding";
+import { LanguageSwitch } from "@/components/general/LanguageSwitch";
import { ProgressBar } from "@/components/general/ProgressBar";
import { QuestionConditional } from "@/components/general/QuestionConditional";
import { ResponseErrorComponent } from "@/components/general/ResponseErrorComponent";
@@ -55,7 +56,7 @@ export const Survey = ({
const [isResponseSendingFinished, setIsResponseSendingFinished] = useState(
getSetIsResponseSendingFinished ? false : true
);
-
+ const [selectedLanguage, setselectedLanguage] = useState(languageCode);
const [loadingElement, setLoadingElement] = useState(false);
const [history, setHistory] = useState([]);
const [responseData, setResponseData] = useState(hiddenFieldsRecord ?? {});
@@ -83,6 +84,9 @@ export const Survey = ({
const getShowSurveyCloseButton = (offset: number) => {
return offset === 0 && survey.type !== "link" && (clickOutside === undefined ? true : clickOutside);
};
+ const getShowLanguageSwitch = (offset: number) => {
+ return survey.showLanguageSwitch && survey.languages.length > 0 && offset <= 0;
+ };
useEffect(() => {
// scroll to top when question changes
@@ -122,6 +126,10 @@ export const Survey = ({
}
}, [getSetIsResponseSendingFinished]);
+ useEffect(() => {
+ setselectedLanguage(languageCode);
+ }, [languageCode]);
+
let currIdxTemp = currentQuestionIndex;
let currQuesTemp = currentQuestion;
@@ -147,7 +155,7 @@ export const Survey = ({
if (typeof responseValue === "string") {
// Find the choice in currentQuestion.choices that matches the responseValue after localization
choice = currentQuestion.choices.find((choice) => {
- return getLocalizedValue(choice.label, languageCode) === responseValue;
+ return getLocalizedValue(choice.label, selectedLanguage) === responseValue;
})?.label;
// If a matching choice is found, get its default localized value
@@ -161,7 +169,7 @@ export const Survey = ({
// Filter and map the choices in currentQuestion.choices that are included in responseValue after localization
choice = currentQuestion.choices
.filter((choice) => {
- return responseValue.includes(getLocalizedValue(choice.label, languageCode));
+ return responseValue.includes(getLocalizedValue(choice.label, selectedLanguage));
})
.map((choice) => getLocalizedValue(choice.label, "default"));
}
@@ -199,7 +207,7 @@ export const Survey = ({
const nextQuestionId = getNextQuestionId(responseData);
const finished = nextQuestionId === "end";
onChange(responseData);
- onResponse({ data: responseData, ttc, finished });
+ onResponse({ data: responseData, ttc, finished, language: selectedLanguage });
if (finished) {
// Post a message to the parent window indicating that the survey is completed.
window.parent.postMessage("formbricksSurveyCompleted", "*");
@@ -250,7 +258,7 @@ export const Survey = ({
buttonLabel={survey.welcomeCard.buttonLabel}
onSubmit={onSubmit}
survey={survey}
- languageCode={languageCode}
+ languageCode={selectedLanguage}
responseCount={responseCount}
isInIframe={isInIframe}
replaceRecallInfo={replaceRecallInfo}
@@ -260,15 +268,15 @@ export const Survey = ({
return (
@@ -306,13 +314,21 @@ export const Survey = ({
return (
- {getShowSurveyCloseButton(offset) && }
+
+ {getShowLanguageSwitch(offset) && (
+
+ )}
+ {getShowSurveyCloseButton(offset) && }
+
@@ -328,15 +344,17 @@ export const Survey = ({
};
return (
-
+ <>
+
+ >
);
};
diff --git a/packages/surveys/src/components/general/SurveyCloseButton.tsx b/packages/surveys/src/components/general/SurveyCloseButton.tsx
index d608240697..1af95278a9 100644
--- a/packages/surveys/src/components/general/SurveyCloseButton.tsx
+++ b/packages/surveys/src/components/general/SurveyCloseButton.tsx
@@ -4,16 +4,16 @@ interface SurveyCloseButtonProps {
export const SurveyCloseButton = ({ onClose }: SurveyCloseButtonProps) => {
return (
-
+