GenStrings.swift 修改,呈現(xiàn)新增追加效果

#!/usr/bin/swift
import Foundation
class GenStrings {

    let fileManager = NSFileManager.defaultManager()
    let acceptedFileExtensions = ["swift", "strings"]
    let excludedFolderNames = ["Carthage"]
    let excludedFileNames = ["genstrings.swift"]
    var regularExpresions = [String:NSRegularExpression]()
    let localizedRegex = "(?<=\")([^\"]*)(?=\".(localized|localizedFormat))|(?<=(Localized|NSLocalizedString)\\(\")([^\"]*?)(?=\")"
    let keyRegex = "(?<=\")([^\"]*)(?=\" =)"
    let pathExtension = "lproj"
    
    var resourcesPathName = ""
    var  resourcesPath:NSURL? = nil//資源文件路徑
    var addStringFilePath = ""http://追加字符串目標文件路徑
    //let addStringFilePath = NSBundle.mainBundle().pathForResource("Localizable", ofType: "strings")!
    
    var newStrings:String? = String()//最新的語言字符串集
    
    //獲取文件路徑
    func getFilePaths(){
        
        let fileManager = NSFileManager.defaultManager()
        var root:NSURL? = nil
        root = NSURL(fileURLWithPath:fileManager.currentDirectoryPath)
        let rootPath = String(root)
        
        print(String(root))
    
        let index = rootPath.startIndex.advancedBy(7)
        rootPath = rootPath.substringFromIndex(index)
        resourcesPathName = rootPath + "resources/"
        addStringFilePath = rootPath + "resources/zh-Hans.lproj/Localizable.strings"
        resourcesPath = NSURL(string: resourcesPathName )
    }
    
    enum GenstringsError:ErrorType {
        case Error
    }
    
    ///系統(tǒng)當前時間
    func createNowDate()->String{
        let date = NSDate()
        let timeFormatter = NSDateFormatter()
        timeFormatter.dateFormat = "yyy-MM-dd HH:mm"
        return timeFormatter.stringFromDate(date) as String
    }
    
    //獲取已存在的語言文件
    func getExistLocalizableFile() -> [String] {
        
        
        //獲取當前文件根路徑的所有子文件路徑集合
        let allFiles = fetchFilesInFolder(resourcesPath!, pathExtension: pathExtension)
        print("資源文件數(shù): \(allFiles.count)")
        //裝載文件名
        var localizableStrings = Set<String>()
        
        //遍歷文件
        for filePath in allFiles {
            let stringsInFile = keyStringsInFile(filePath)
            //獲取所在文件字符串的并集合秩彤,即去掉重復的
            localizableStrings = localizableStrings.union(stringsInFile)
        }
        // We sort the strings
        //排序整理字符串,按字母排序
        let sortedStrings = localizableStrings.sort({ $0 < $1 })
        
        return sortedStrings
    }
    
    func keyStringsInFile(filePath: NSURL) -> Set<String> {
        
        if let fileContentsData = NSData(contentsOfURL: filePath), let fileContentsString = NSString(data: fileContentsData, encoding: NSUTF8StringEncoding) {
            do {
                let localizedStringsArray = try regexMatches(keyRegex, string: fileContentsString as String).map({fileContentsString.substringWithRange($0.range)})
                
                return Set(localizedStringsArray)
            } catch {}
        }
        return Set<String>()
    }
    
    
    //把最新最新的語言字符串寫到本地.Strings文件中
    func writeToLocalizableStringsInFile() ->Void{
        /// 沒有新增最新的語言字符串停止執(zhí)行
        if newStrings!.isEmpty{
            return
        }
        
        
        let fileHandle = NSFileHandle(forUpdatingAtPath: addStringFilePath as String)
        fileHandle?.seekToEndOfFile()
        
        //寫入時間
        let date = "\n/******************************   新增于:  " + createNowDate() + "  ************************/\n"
        let stringDate = date.dataUsingEncoding(NSUTF8StringEncoding)
        fileHandle?.writeData(stringDate!)
        
        //寫入最新的語言字符串
        let stringData = newStrings!.dataUsingEncoding(NSUTF8StringEncoding)
        fileHandle?.writeData(stringData!)
        fileHandle?.closeFile()
        

        
    }
    
    // Performs the genstrings functionality
    func perform1() {
        //獲取文件路徑
        getFilePaths()
        
        let fileManager = NSFileManager.defaultManager()
        var root:NSURL? = nil
        root = NSURL(fileURLWithPath:fileManager.currentDirectoryPath)
        print(String(root))
        
        //獲取當前文件根路徑/Users/imac/Documents/code/bter_app/resources/
        //項目的根絕對路徑(這是我的項目文件路徑脂新,根據(jù)自己的項目文件路徑修改)
        let  rootPath = NSURL(string: "/Users/imac/Documents/code/xxx/")
        
        //獲取當前文件根路徑的所有子文件路徑集合
        let allFiles = fetchFilesInFolder(rootPath!)
        
        // We use a set to avoid duplicates
        //裝載文件名
        var localizableStrings = Set<String>()
        
        //遍歷文件
        for filePath in allFiles {
            let stringsInFile = localizableStringsInFile(filePath)
            //獲取所在文件字符串的并集合伞插,即去掉重復的
            localizableStrings = localizableStrings.union(stringsInFile)
        }
        
        //獲取已存在的語言文本數(shù)組
        let existStrings = getExistLocalizableFile()
        
        // We sort the strings
        //排序整理字符串,按字母排序
        let sortedStrings = localizableStrings.sort({ $0 < $1 })
        
        for string in sortedStrings {
            print(string)
            print(sortedStrings.count)
            print(existStrings.count)
            if existStrings.contains(string) {
                continue
            }
            newStrings!.appendContentsOf("\"\(string)\" = \"\(string)\";\n")
            
        }
        //打印
        print(newStrings)
        //追加把最新最新的語言字符串寫到本地
        writeToLocalizableStringsInFile()
    }
    
    // Applies regex to a file at filePath.
    func localizableStringsInFile(filePath: NSURL) -> Set<String> {
        if let fileContentsData = NSData(contentsOfURL: filePath), let fileContentsString = NSString(data: fileContentsData, encoding: NSUTF8StringEncoding) {
            do {
                let localizedStringsArray = try regexMatches(localizedRegex, string: fileContentsString as String).map({fileContentsString.substringWithRange($0.range)})
                return Set(localizedStringsArray)
            } catch {}
        }
        return Set<String>()
    }
    
    //MARK: Regex
    
    func regexWithPattern(pattern: String) throws -> NSRegularExpression {
        var safeRegex = regularExpresions
        if let regex = safeRegex[pattern] {
            return regex
        }
        else {
            do {
                let currentPattern: NSRegularExpression
                currentPattern =  try NSRegularExpression(pattern: pattern, options:NSRegularExpressionOptions.CaseInsensitive)
                safeRegex.updateValue(currentPattern, forKey: pattern)
                self.regularExpresions = safeRegex
                return currentPattern
            }
            catch {
                throw GenstringsError.Error
            }
        }
    }
    
    func regexMatches(pattern: String, string: String) throws -> [NSTextCheckingResult] {
        do {
            let internalString = string
            let currentPattern =  try regexWithPattern(pattern)
            // NSRegularExpression accepts Swift strings but works with NSString under the hood. Safer to bridge to NSString for taking range.
            let nsString = internalString as NSString
            let stringRange = NSMakeRange(0, nsString.length)
            let matches = currentPattern.matchesInString(internalString, options: [], range: stringRange)
            return matches
        }
        catch {
            throw GenstringsError.Error
        }
    }
    
    //MARK: File manager
    
    func fetchFilesInFolder(rootPath: NSURL, pathExtension: String = "") -> [NSURL] {
        var files = [NSURL]()
        do {
            let directoryContents = try fileManager.contentsOfDirectoryAtURL(rootPath, includingPropertiesForKeys: [], options: .SkipsHiddenFiles)
            for urlPath in directoryContents {
                if let stringPath = urlPath.path, let lastPathComponent = urlPath.lastPathComponent, let pathExtension = urlPath.pathExtension {
                    var isDir : ObjCBool = false
                    
                    if fileManager.fileExistsAtPath(stringPath, isDirectory:&isDir) {
                        if isDir {
                            if !excludedFolderNames.contains(lastPathComponent) && pathExtension == urlPath.pathExtension {
                                let dirFiles = fetchFilesInFolder(urlPath)
                                files.appendContentsOf(dirFiles)
                            }
                        } else {
                            
                            if acceptedFileExtensions.contains(pathExtension) && !excludedFileNames.contains(lastPathComponent)  {
                                files.append(urlPath)
                            }
                        }
                    }
                }
            }
        } catch {}
        return files
    }
}
let genStrings = GenStrings()
//genStrings.getExistLocalizableFile()
genStrings.perform1()
//genStrings.perform()

執(zhí)行后的效果:

Paste_Image.png

在原來的基礎上新增國際化字段

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艇纺,一起剝皮案震驚了整個濱河市怎静,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黔衡,老刑警劉巖消约,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異员帮,居然都是意外死亡,警方通過查閱死者的電腦和手機导饲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門捞高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氯材,“玉大人,你說我怎么就攤上這事硝岗∏庀” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵型檀,是天一觀的道長冗尤。 經(jīng)常有香客問我,道長胀溺,這世上最難降的妖魔是什么裂七? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮仓坞,結果婚禮上背零,老公的妹妹穿的比我還像新娘。我一直安慰自己无埃,他們只是感情好徙瓶,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫉称,像睡著了一般侦镇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上织阅,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天壳繁,我揣著相機與錄音,去河邊找鬼蒲稳。 笑死氮趋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的江耀。 我是一名探鬼主播剩胁,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祥国!你這毒婦竟也來了昵观?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤舌稀,失蹤者是張志新(化名)和其女友劉穎啊犬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壁查,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡觉至,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睡腿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片语御。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡峻贮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出应闯,到底是詐尸還是另有隱情纤控,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布碉纺,位于F島的核電站船万,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骨田。R本人自食惡果不足惜耿导,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盛撑。 院中可真熱鬧碎节,春花似錦、人聲如沸抵卫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介粘。三九已至殖氏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姻采,已是汗流浹背雅采。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慨亲,地道東北人婚瓜。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像刑棵,于是被迫代替她去往敵國和親巴刻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容