IOS本地化声音文件无法在设备上运行

时间:2017-08-23 11:42:02

标签: ios swift localization

我正在开发一款多语言应用。这个程序包括一些声音文件。例如,如果用户系统语言是英语,当用户点击苹果图标时,“apple”名称的发音将从/base.lproj/apple.mp3文件中播放。如果用户系统语言是土耳其语,“apple”名称的发音将从/tr.lproj/apple.mp3文件中以土耳其语播放。

enter image description here

Localizable.string,Main.string,InfoPlist.strings和所有声音文件本地化,项目正常工作在模拟器上。

然而,当我们来真实设备进行测试时,声音文件不会根据系统语言进行本地化。并且只播放基本语言(英语)声音文件。

我认为我发现了问题,但我不知道解决方案。

要播放声音,首先我找到了这样的声音网址:

 let path = Bundle.main.path(forResource: name, ofType: "mp3")
 print(path)
 let soundURL = URL(fileURLWithPath: path!)

当我在模拟器中打印声音网址时,模拟器会根据语言找到正确的声音文件:

/Bundle/Application/.../tr.lproj/apple.mp3"  //Applang: Turkish - Play Tur
/Bundle/Application/.../base.lproj/apple.mp3"  //Applang: System - Play Eng

但是当我在真实设备中打印语音为土耳其语的声音网址时,它会找到基本语言文件(英语)并打印此路径。

/Bundle/.../grapefruit.mp3" // where is tr.lproj ?

再次Localizable.string(土耳其语),Main.string(土耳其语),InfoPlist.strings(土耳其语)工作正常,并在他们自己的语言中正确显示文本。

根据Apple Document

  

path(forResource:ofType :):   该方法首先在指定包的非本地化资源目录中查找匹配的资源文件。如果找不到匹配的资源文件,则会查找可用语言特定的.lproj文件夹的顶层。

所以我明白我应该使用另一条路径method

  

路径(forResource:ofType:inDirectory:forLocalization:)

并指定我的代码

let path = Bundle.main.path(forResource: name, ofType: "mp3",inDirectory:"tr.lproj",forLocalization:"tr")

在设备中有没有其他方法可以正确使用本地化声音文件?  或者我应该使用path(forResource:ofType:inDirectory:forLocalization :)方法并构建一些逻辑代码。 (检查系统语言等)

2 个答案:

答案 0 :(得分:1)

我尝试在测试应用中使用本地化的mp3,它在真实设备上运行良好。你在name中以let path = Bundle.main.path(forResource: name, ofType: "mp3")传递的确切内容是什么?如果您的项目中有另一个文件,那么每次都可能需要这个文件!

如果您的项目导航器中除了本地化的文件之外没有任何名称相同的文件,请尝试卸载您的应用程序,可能还有一个位于您设备上的应用程序目录中。< / p>

答案 1 :(得分:0)

这是 IOS 9 中的一个已知错误。 iOS localization is broken with the upgrade iOs 9 + Xcode 7

看起来它已经回归到 IOS 14...
作为一种解决方法,您可以使用本地化的包,就像这样。

使用类似的东西。 ** Localize.currentLanguage() 返回您需要的语言的字符串,也就是“it”。

   @objc static func getLocalizedBundle() -> Bundle {
        let bundle: Bundle = .main
        if let path = bundle.path(forResource: Localize.currentLanguage(), ofType: "lproj") {
            if let locolizedBundle = Bundle(path: path) {
                return locolizedBundle
            } else {
                return bundle
            }
        }
        return bundle
    }

那么你就可以这样使用它了。

  NSURL *audioFileLocationURL;
        audioFileLocationURL = [[Localize getLocalizedBundle] URLForResource:soundName withExtension:nil];
        //fallback
        if (!audioFileLocationURL) {
            audioFileLocationURL = [[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
        }