Since a head unit can support multiple languages, you may want to add support for more than one language to your SDL app. The SDL library allows you to check which language is currently used by the head unit. If desired, the app's name and the app's text-to-speech (TTS) name can be customized to reflect the head unit's current language. If your app name is not part of the current lexicon, you should tell the VR system how a native speaker will pronounce your app name by setting the TTS name using phonemes from either the Microsoft SAPI phoneme set or from the LHPLUS phoneme set.
The initial configuration of the SDLManager
requires a default language when setting the SDLLifecycleConfiguration
. If not set, the SDL library uses American English (EN_US) as the default language. The connection will fail if the head unit does not support the language
set in the SDLLifecycleConfiguration
. The RegisterAppInterface
response RPC will return INVALID_DATA
as the reason for rejecting the request.
If your app does not support the current head unit language, you should decide on a default language to use in your app. All text should be created using this default language. Unfortunately, your VR commands will probably not work as the VR system will not recognize your users' pronunciation.
After starting the SDLManager
you can check the registerResponse
property for the head unit's language
and hmiDisplayLanguage
. The language
property gives you the current VR system language; hmiDisplayLanguage
the current display text language.
SDLLanguage headUnitLanguage = self.sdlManager.registerResponse.language; SDLLanguage headUnitHMIDisplayLanguage = self.sdlManager.registerResponse.hmiDisplayLanguage;
let headUnitLanguage = sdlManager.registerResponse?.language let headUnitHMIDisplayLanguage = sdlManager.registerResponse?.hmiDisplayLanguage
To customize the app name for the head unit's current language, implement the following steps:
Set the default language
in the SDLLifecycleConfiguration
.
Add all languages your app supports to languagesSupported
in the SDLLifecycleConfiguration
.
SDLManagerDelegate
's managerShouldUpdateLifecycleToLanguage:hmiLanguage:
method. If the module's current HMI language or voice recognition (VR) language is different from the app's default language, the method will be called with the module's current HMI and/or VR language. Please note that the delegate method will only be called if your app supports the head unit's current language. Return a SDLLifecycleConfigurationUpdate
object with the new appName
and/or ttsName
.LifecycleConfigurationUpdate
with the new appName
and/or ttsName
.// The `hmiLanguage` is the text language of the head unit, the `language` is the VR language of the head unit. These will usually be the same, but not always. You may want to update your `appName` (text) and `ttsName` (VR) separately. - (nullable SDLLifecycleConfigurationUpdate *)managerShouldUpdateLifecycleToLanguage:(SDLLanguage)language hmiLanguage:(SDLLanguage)hmiLanguage { SDLLifecycleConfigurationUpdate *configurationUpdate = [[SDLLifecycleConfigurationUpdate alloc] init]; if ([language isEqualToEnum:SDLLanguageEnUs]) { configurationUpdate.appName = <#App Name in English#>; } else if ([language isEqualToEnum:SDLLanguageEsMx]) { configurationUpdate.appName = <#App Name in Spanish#>; } else if ([language isEqualToEnum:SDLLanguageFrCa]) { configurationUpdate.appName = <#App Name in French#>; } else { return nil; } configurationUpdate.ttsName = [SDLTTSChunk textChunksFromString:configurationUpdate.appName]; return configurationUpdate; }
// The `hmiLanguage` is the text language of the head unit, the `language` is the VR language of the head unit. These will usually be the same, but not always. You may want to update your `appName` (text) and `ttsName` (VR) separately. func managerShouldUpdateLifecycle(toLanguage language: SDLLanguage, hmiLanguage: SDLLanguage) -> SDLLifecycleConfigurationUpdate? { let configurationUpdate = SDLLifecycleConfigurationUpdate() switch language { case .enUs: configurationUpdate.appName = <#App Name in English#> case .esMx: configurationUpdate.appName = <#App Name in Spanish#> case .frCa: configurationUpdate.appName = <#App Name in French#> default: return nil } configurationUpdate.ttsName = [SDLTTSChunk(text: configurationUpdate.appName!, type: .text)] return configurationUpdate }