Xcode Localizable.string múltiple problema de objectives

Tengo un proyecto con múltiples objectives, que representan la misma aplicación con styles y traducciones diferentes.

Dado que el proyecto casi integer tiene el mismo aspecto para cada objective, necesito tener pocas cadenas en el file Localizable.strings , que necesito ser diferente. Y no quiero copyr todo el enorme file Localizable.strings a cada proyecto solo por el hecho de que tiene pocas líneas diferentes.

Es necesario que tenga solo 1 file de cadenas debido a las bibliotecas / SDK de terceros que se incluyen en el proyecto. Entonces no puedo usar tableName para localizedString .

El problema es que tengo que tener la posibilidad flexible de anular solo algunas líneas de las cadenas Localizable.strings para cada objective por separado. Y no me gusta la idea de copyr todo el file a cada objective, ya que conducirá a un flujo molesto en el futuro, en caso de que tenga 10 objectives y necesito agregar 1 cadena a todos ellos.

El objective es tener 1 file Localizable.strings con todas las cadenas incluidas, que sería común para todos los objectives, y tener una configuration pequeña para cada objective para las cadenas que deberían ser diferentes. Entonces, el file del objective debería unir y anular el que es común.

AFAIK no es soportado nativamente por Xcode, así que probablemente esté buscando un script que lo haga funcionar.

Por lo tanto, la secuencia de commands debe search en los files Localizable comunes y de destino, fusionarlos, y en caso de que se definan algunas keys en ambos, debería usar uno del file del objective.

¿Alguien puede ayudarme con tal guión?


PD Existe un problema similar con .xcassets , y CocoaPods lo resuelve fusionando varios activos en 1, y funciona como se esperaba: si algunos objectives tienen un activo que contiene la image con el mismo nombre que ya está incluido en un activo común, entonces el desde el objective lo replaceá.

PS2. Una característica similar es compatible con los desarrolladores de Android de forma nativa: cada image, cada traducción puede ser anulada por un "hijo", o lo que sea que se llame 🙂

TL, DR:

Proyecto de ejemplo: https://github.com/JakubMazur/SO45279964


De acuerdo, lo más fácil de hacer sería un script shell / python, porque funcionará para cada server de compilation. Supongo que tienes un esquema diferente para cada objective (de lo contrario, no tendrá sentido). Entonces, lo que puedes hacer es:

Digamos que su objective se denomina:

  • target1
  • target2
  • target3

1) Crear files separados contiene todas las cadenas que deberían ser diferentes (lo pondré debajo del directory Localizable .

Su file Localizable.strings puede verse así:

 "someGeneralString" = "General string 1"; "AppName" = "This is a string that you probably need to change"; "someOtherGeneralString" = "General string 2"; 

Y cualquiera de su file targetX.strings puede verse así:

 "AppName" = "target[x]" 

Y así es como debería verse en tu proyecto:

introduzca la descripción de la imagen aquí

Tenga en count que los files localizables de target deben tener una membresía objective establecida solo para un objective, ¡pero sus Localizable.strings deberían ser para todos los objectives!

Eso es todo para la configuration del proyecto. Vamos a las secuencias de commands (utilizaré python para eso):

 #!/usr/bin/python import sys supportedLanguages = ["en","pl"] commonPath = ".lproj/Localizable.strings" keys = ["AppName"] class CopyLocalizable(): target = "" def __init__(self,arg): self.target = arg self.perform() def perform(self): for lang in supportedLanguages: pathToLocalizable = lang+commonPath textToFile = "" with open(pathToLocalizable,"r") as languageFile: for line in languageFile.readlines(): for key in keys: if key in line: textToFile += self.foundAndReplace(key,lang) else: textToFile += line self.saveInFile(pathToLocalizable,textToFile) def foundAndReplace(self,key,lang): pathToTargetFile = "Localizable/"+lang+".lproj/"+self.target+".strings" with open(pathToTargetFile,"r") as targetFile: for targetLine in targetFile.readlines(): if key in targetLine: return targetLine def saveInFile(self,file,stringToSave): with open(file,"w+") as languageFile: languageFile.write(stringToSave) 

Puede optimizarlo usted mismo. Es un script más sencillo en el que puedo pensar para hacer un trabajo.

Y al final vamos a automatizarlo un poco: – Ir a tu objective – Agregar una nueva fase de creación – Agregar un nuevo script:

 export PATH="/usr/local/bin:$PATH" cd SO45279964/ python localize.py target[x] 

y mira cómo sucede una magia;)

http://www.giphy.com/gifs/26n6NKgiwYvuQk7WU

Aquí puede encontrar el proyecto de ejemplo que he creado para ejecutar este ejemplo: https://github.com/JakubMazur/SO45279964

Para mantenerlo simple, tenga una macro definida para cada objective en Configuración de compilation y defina cadenas específicas de destino dentro de la sección de macros como

 #ifdef __TARGET__ //key values in localizable file #endif