1

I am creating an iMessage Sticker Pack Extension that have stickers that contain texts. I don't see any option in Xcode to localize the stickers? Is it possible to localize stickers?

Van Du Tran
  • 6,736
  • 11
  • 45
  • 55

2 Answers2

2

Maybe it's obvious, but you can manage it inside of an extension. If you create not a pack, but extension, you can fetch exact stickers for your localization

Vladyslav Zavalykhatko
  • 15,202
  • 8
  • 65
  • 100
2

If you want to show different sticker-assets dependant on e.g. your device's language, you need to create a iMessage Application instead of a Sticker Pack Application. And you need to write some code as it's not possible to have this behaviour within a simple Sticker Pack Application.

However this is pretty simple. For a start, follow this tutorial: http://blog.qbits.eu/ios-10-stickers-application/

Some code-syntax there is outdated, but XCode will help you to easily fix that.

You can place your localized resources inside different folders and drag'n'drop them into you XCode project (make sure to check "Create folder references"): Screenshot of project structure

You can then do something like this in your viewDidLoad():

//-- get current language set
    var imageSetPath = "/EN";   //-- default to english

    let languageCode = NSLocale.preferredLanguages[0]
    if      languageCode.hasPrefix("zh-Hans") { imageSetPath = "/CNS"   }
    else if languageCode.hasPrefix("zh-Hans") { imageSetPath = "/CNT"   }
    else if languageCode.hasPrefix("ko")      { imageSetPath = "/KR"    }
    else if languageCode.hasPrefix("ja")      { imageSetPath = "/JP"    }

    //-- load localized stickers
    imageUrls = recursivePathsForResources(path: Bundle.main.bundlePath + imageSetPath, type: "png")
    loadStickers(urls: imageUrls)

where

func recursivePathsForResources(path: String, type: String) -> [URL] {
    // Enumerators are recursive
    let enumerator = FileManager.default.enumerator(atPath: path)
    var filePaths = [URL]()

    while let filePath = enumerator?.nextObject() as? String {
        if NSURL(fileURLWithPath: filePath).pathExtension == type {
            let url = URL(fileURLWithPath: path).appendingPathComponent(filePath)
            filePaths.append(url)
        }
    }
    return filePaths
}

(altered from https://stackoverflow.com/a/5860015/6649403)

Community
  • 1
  • 1
Paul E
  • 21
  • 3