         id = InputSource.getProperty(tisInputSource, kTISPropertyInputSourceID)!
         name = InputSource.getProperty(tisInputSource, kTISPropertyLocalizedName)!
 
-        let langs: Array<String> = InputSource.getProperty(tisInputSource, kTISPropertyInputSourceLanguages)!
-        isCJK = langs.contains(where: { $0 == "ko" || $0 == "ja" || $0.hasPrefix("zh") })
+        let lang = (
+            InputSource.getProperty(tisInputSource, kTISPropertyInputSourceLanguages)!
+                as Array<String>
+        )[0]
+        isCJKV = lang == "ko" || lang == "ja" || lang == "vi" || lang.hasPrefix("zh")
 
         let imageURL: URL? = InputSource.getProperty(tisInputSource, kTISPropertyIconImageURL)
         if imageURL != nil {

            }
    }
    
    static func nonCJKSource() -> InputSource? {
        return inputSources.first(where: { !$0.isCJK })
    }

    static func selectPrevious(shortcut: (Int, UInt64)) {

    func select() {
        TISSelectInputSource(tisInputSource)

        if isCJKV, let selectPreviousShortcut = InputSourceManager.getSelectPreviousShortcut() {
            // Workaround for TIS CJKV layout bug:
            // when it's CJKV, select nonCJKV input first and then return
            if let nonCJKV = InputSourceManager.nonCJKVSource() {
                nonCJKV.select()
                InputSourceManager.selectPrevious(shortcut: selectPreviousShortcut)
            }
        }
