@@ -62,7 +62,19 @@ final class SurveyManager {
6262
6363 // Display percentage
6464 let shouldDisplay = shouldDisplayBasedOnPercentage ( firstSurveyWithActionClass? . displayPercentage)
65-
65+ let isMultiLangSurvey = firstSurveyWithActionClass? . languages? . count ?? 0 > 1
66+
67+ if isMultiLangSurvey {
68+ guard let survey = firstSurveyWithActionClass else { return }
69+ let currentLanguage = Formbricks . language
70+ guard let languageCode = getLanguageCode ( survey: survey, language: currentLanguage) else {
71+ Formbricks . logger? . error ( " Survey \( survey. name) is not available in language “ \( currentLanguage) ”. Skipping. " )
72+ return
73+ }
74+
75+ Formbricks . language = languageCode
76+ }
77+
6678 // Display and delay it if needed
6779 if let surveyId = firstSurveyWithActionClass? . id, shouldDisplay {
6880 isShowingSurvey = true
@@ -93,7 +105,8 @@ extension SurveyManager {
93105 self ? . filterSurveys ( )
94106 case . failure:
95107 self ? . hasApiError = true
96- Formbricks . logger? . error ( FormbricksSDKError ( type: . unableToRefreshEnvironment) . message)
108+ let error = FormbricksSDKError ( type: . unableToRefreshEnvironment)
109+ Formbricks . logger? . error ( error. message)
97110 self ? . startErrorTimer ( )
98111 }
99112 }
@@ -171,7 +184,8 @@ extension SurveyManager {
171184 if let data = UserDefaults . standard. data ( forKey: SurveyManager . environmentResponseObjectKey) {
172185 return try ? JSONDecoder ( ) . decode ( EnvironmentResponse . self, from: data)
173186 } else {
174- Formbricks . logger? . error ( FormbricksSDKError ( type: . unableToRetrieveEnvironment) . message)
187+ let error = FormbricksSDKError ( type: . unableToRetrieveEnvironment)
188+ Formbricks . logger? . error ( error. message)
175189 return nil
176190 }
177191 }
@@ -180,7 +194,8 @@ extension SurveyManager {
180194 UserDefaults . standard. set ( data, forKey: SurveyManager . environmentResponseObjectKey)
181195 backingEnvironmentResponse = newValue
182196 } else {
183- Formbricks . logger? . error ( FormbricksSDKError ( type: . unableToPersistEnvironment) . message)
197+ let error = FormbricksSDKError ( type: . unableToPersistEnvironment)
198+ Formbricks . logger? . error ( error. message)
184199 }
185200 }
186201 }
@@ -212,7 +227,8 @@ private extension SurveyManager {
212227 }
213228
214229 default :
215- Formbricks . logger? . error ( FormbricksSDKError ( type: . invalidDisplayOption) . message)
230+ let error = FormbricksSDKError ( type: . invalidDisplayOption)
231+ Formbricks . logger? . error ( error. message)
216232 return false
217233 }
218234
@@ -234,6 +250,47 @@ private extension SurveyManager {
234250 }
235251 }
236252
253+ func getLanguageCode(
254+ survey: Survey ,
255+ language: String ?
256+ ) -> String ? {
257+ // 1) Collect all codes
258+ let availableLanguageCodes = survey. languages?
259+ . map { $0. language. code }
260+
261+ // 2) If no language was passed or it's the explicit "default" token → default
262+ guard let raw = language? . lowercased ( ) , !raw. isEmpty else {
263+ return " default "
264+ }
265+
266+ if raw == " default " {
267+ return " default "
268+ }
269+
270+ // 3) Find matching entry by code or alias
271+ let selected = survey. languages? . first { entry in
272+ entry. language. code. lowercased ( ) == raw ||
273+ entry. language. alias? . lowercased ( ) == raw
274+ }
275+
276+ // 4) If that entry is marked default → default
277+ if selected? . isDefault == true {
278+ return " default "
279+ }
280+
281+ // 5) If no entry, or not enabled, or code not in the available list → nil
282+ guard
283+ let entry = selected,
284+ entry. enabled,
285+ availableLanguageCodes? . contains ( entry. language. code) == true
286+ else {
287+ return nil
288+ }
289+
290+ // 6) Otherwise return its code
291+ return entry. language. code
292+ }
293+
237294 /// Filters the surveys based on the user's segments.
238295 func filterSurveysBasedOnSegments( _ surveys: [ Survey ] , segments: [ String ] ) -> [ Survey ] {
239296 return surveys. filter { survey in
0 commit comments