【问题标题】:IOS localized sound file not working on deviceIOS本地化声音文件在设备上不起作用
【发布时间】:2018-01-31 23:40:43
【问题描述】:

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

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

但是,当我们在真机上进行测试时,声音文件并没有根据系统语言进行本地化。并且只播放基本语言(英语)的声音文件。

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

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

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

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

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

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

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

Localizable.string(土耳其语)、Main.string(土耳其语)、InfoPlist.strings(土耳其语)再次运行良好,并在真实设备上以自己的语言正确显示文本。

根据苹果Document

路径(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:) 方法并构建一些逻辑代码。 (检查系统语言等)

【问题讨论】:

    标签: ios swift localization


    【解决方案1】:

    这是 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];
            }
    

    【讨论】:

      【解决方案2】:

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

      如果您的项目导航器中除了已本地化的文件之外没有任何类似名称的文件,请尝试卸载您的应用,可能在您设备上的应用目录中还有一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多