Files
ShadowsocksX-NG/genstrings.py
2016-06-10 19:44:49 +08:00

155 lines
5.7 KiB
Python

# Created by Johannes Schriewer on 2011-11-30. Modified by Roy Marmelstein 2015-08-05
# Copyright (c) 2011 planetmutlu.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# - Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# This script is heavily copied from: https://github.com/dunkelstern/Cocoa-Localisation-Helper
# Copied from https://github.com/marmelroy/Localize-Swift By QiuYuzhou
import os, re, subprocess
import fnmatch
def fetch_files_recursive(directory, extension):
matches = []
for root, dirnames, filenames in os.walk(directory):
for filename in fnmatch.filter(filenames, '*' + extension):
matches.append(os.path.join(root, filename))
return matches
# prepare regexes
localizedStringComment = re.compile('NSLocalizedString\("([^"]*)",\s*"([^"]*)"\s*\)', re.DOTALL)
localizedStringNil = re.compile('NSLocalizedString\("([^"]*)",\s*nil\s*\)', re.DOTALL)
localized = re.compile('Localized\("([^"]*)"[^\n\r]*\)', re.DOTALL)
localizedProperty = re.compile('"([^"]*)".localized', re.DOTALL)# Add By QiuYuzhou
localizedSwift2 = re.compile('"([^"]*)".localized\(\)', re.DOTALL)
localizedSwift2WithFormat = re.compile('"([^"]*)".localizedFormat\([^\n\r]*\)', re.DOTALL)
# get string list
uid = 0
strings = []
for file in fetch_files_recursive('.', '.swift'):
with open(file, 'r') as f:
content = f.read()
for result in localizedStringComment.finditer(content):
uid += 1
strings.append((result.group(1), result.group(2), file, uid))
for result in localizedStringNil.finditer(content):
uid += 1
strings.append((result.group(1), '', file, uid))
for result in localized.finditer(content):
uid += 1
strings.append((result.group(1), '', file, uid))
# Add By QiuYuzhou, Begin
for result in localizedProperty.finditer(content):
uid += 1
strings.append((result.group(1), '', file, uid))
# Add By QiuYuzhou, End
for result in localizedSwift2.finditer(content):
uid += 1
strings.append((result.group(1), '', file, uid))
for result in localizedSwift2WithFormat.finditer(content):
uid += 1
strings.append((result.group(1), '', file, uid))
# prepare regexes
localizedString = re.compile('"[^=]*=\s*"([^"]*)";')
# Changed By QiuYuzhou, disable for *.xib
# fetch files
#for file in fetch_files_recursive('.', '.xib'):
# tempFile = file + '.strings'
# utf8tempFile = file + '.strings.utf8'
# subprocess.call('ibtool --export-strings-file "' + tempFile + '" "' + file + '" 2>/dev/null', shell=True)
# subprocess.call('iconv -s -f UTF-16 -t UTF-8 "' + tempFile + '" >"'+utf8tempFile+'" 2>/dev/null', shell=True)
#
# f = open(utf8tempFile, 'r')
# for line in f:
# result = localizedString.match(line)
# if result:
# uid += 1
# strings.append((result.group(1), '', file, uid))
# f.close()
#
# os.remove(utf8tempFile)
# os.remove(tempFile)
# find duplicates
duplicated = []
filestrings = {}
for string1 in strings:
dupmatch = 0
for string2 in strings:
if string1[3] == string2[3]:
continue
if string1[0] == string2[0]:
if string1[2] != string2[2]:
dupmatch = 1
break
if dupmatch == 1:
dupmatch = 0
for string2 in duplicated:
if string1[0] == string2[0]:
dupmatch = 1
break
if dupmatch == 0:
duplicated.append(string1)
else:
dupmatch = 0
if string1[2] in filestrings:
for fs in filestrings[string1[2]]:
if fs[0] == string1[0]:
dupmatch = 1
break
else:
filestrings[string1[2]] = []
if dupmatch == 0:
filestrings[string1[2]].append(string1)
print '\n\n\n\n\n'
print '/*\n * SHARED STRINGS\n */\n'
# output filewise
for key in filestrings.keys():
print '/*\n * ' + key + '\n */\n'
strings = filestrings[key]
for string in strings:
if string[1] == '':
print '"' + string[0] + '" = "' + string[0] + '";'
print
else:
print '/* ' + string[1] + ' */'
print '"' + string[0] + '" = "' + string[0] + '";'
print
# output duplicates
for string in duplicated:
if string[1] == '':
print '"' + string[0] + '" = "' + string[0] + '";'
print
else:
print '/* ' + string[1] + ' */'
print '"' + string[0] + '" = "' + string[0] + '";'
print