swift - 使用核心数据进行本地化

标签 swift core-data localization relationship

今天我阅读并创建了大约 10 个与 Core Data 相关的项目。我终于完成了我需要的,但我不确定这种方法是否很好

我想根据用户设备语言更改书名,我将使用

let locale = NSLocale.preferredLanguages()[0] as! String

但首先要测试核心数据实现

核心数据设置

core data setup

源代码

// Get the data from Core Data and change the book title base on the lang
func printBooks(){

    let request = NSFetchRequest(entityName: "Langs")
    let predicate: NSPredicate = NSPredicate(format: "lang==%@", "fr");

    request.returnsObjectsAsFaults = false;
    request.predicate = predicate;

    let result:NSArray = context.executeFetchRequest(request, error: nil)!;
    var frTitle: String!
    if(result.count > 0){

        for res in result {
            let resTmp = res as! NSManagedObject
            frTitle = resTmp.valueForKey("langTitle") as! String
        }

    } else {
        println("empty");
    }

    let requestTwo = NSFetchRequest(entityName: "Book")
    requestTwo.returnsObjectsAsFaults = false;

    let resultTwo:NSArray = context.executeFetchRequest(requestTwo, error: nil)!;
    if(resultTwo.count > 0){

        for res in resultTwo {
            let resTmpTwo = res as! NSManagedObject

            // rename the title
            resTmpTwo.setValue(frTitle, forKey: "title");
        }

        // add to NSArray    
        entriesArray = resultTwo;

    } else {
        println("empty two");
    }


}

// Adds the new book with the fr version
func insertBook(){

    let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
    let context: NSManagedObjectContext = appDel.managedObjectContext!

    let newBook = NSEntityDescription.insertNewObjectForEntityForName("Book", inManagedObjectContext: context) as! DB.Book

    newBook.setValue("Sir Arthur Conan Doyle", forKey: "author")
    newBook.setValue("Sherlock Holmes", forKey: "title")

    let newLang = NSEntityDescription.insertNewObjectForEntityForName("Langs", inManagedObjectContext: context) as! DB.Langs

    newLang.setValue("fr", forKey: "lang")
    newLang.setValue("Sherlock Holmes fr - test", forKey: "langTitle")

     newBook.setValue(newLang, forKey: "lanBook")

    context.save(nil)

    println("Saved");

}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.entriesArray.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = self.tableView.dequeueReusableCellWithIdentifier("cell_one", forIndexPath: indexPath) as! UITableViewCell
    let db = entriesArray[indexPath.row] as! NSManagedObject
    // result in the UITableView is: Sherlock Holmes fr - test
    cell.textLabel?.text = db.valueForKey("title") as? String

    return cell
}

该代码确实更改了书名,但可以做得更好。我不确定如何处理大量书籍。

任何知道如何完成此操作的人,请花点时间并用一些代码来回答:)

请原谅我的英语不好..

最佳答案

您应该考虑在 NSObjectModel 上实现一个 transient 属性,例如“langSpecificTitle”,它将根据实际的“title”属性为您计算此值。理想情况下,要访问本地化标题,您应该访问此属性,并且它应该通过读取实际的“标题”属性来获取特定于语言的标题。

这个tutorial很好地解释了“ transient ”属性。

另请参阅 Apple documentation

希望这有帮助。

关于swift - 使用核心数据进行本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31195025/

相关文章:

ios - 在 CoreData 中保留 ABPerson 的引用

hibernate - 在嵌入 map 上选择 HQL

Java 本地化最佳实践

unit-testing - Swift - 涉及 IBOutlets 的单元测试功能?

swift - 关闭弹出窗口后表格 View 没有更新?

ios - 将 ABRecordID 转换为 NSNumber 总是 -1

ios - 项目中相同语言的多个 .string 文件

swift - 明天如何将 NSDate 存储到 Firebase 中?

ios - Swift - 如何在从外部服务器验证后以编程方式更改 View

Swift View Controller 声明返回 nil