ios - attributed string swift 4
LocalizaciĆ³n atribuida de UITextView del storyboard (4)
Estoy usando el guión gráfico y tengo una vista en la que he subclasificado algunos UITextViews.
Mi problema es que estoy usando ibtool --generate-strings-file
para extraer cadenas del guión gráfico para su localización y luego uso ibtool -write
en otro archivo del guión gráfico para aplicar las cadenas traducidas.
Cuando uso ibtool
el ibtool --generate-strings-file
ibtool
cualquier UITextViews que haya atribuido texto y se omite en el archivo de cadenas resultante.
¿Es posible extraer texto atribuido de un guión gráfico para localización?
Aquí hay una solución que me parece bastante útil: simplemente cree un ViewController con el TextView traducido. En detalles (aquí solo traduzco el texto atribuido al inglés):
1) Cree un nuevo controlador con "Nuevo archivo" -> "UIViewController con Xib". Dale el nombre "AttributedTranslated" y rellénalo con solo un TextView con el texto atribuido que se está traduciendo, usando Interface Builder.
2) En el archivo .m de su controlador principal, escriba el siguiente método:
- (BOOL)isEng {
return [[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"];
}
3) Defina un objeto "AttributedTranslated" y una vista en su archivo .h
IBOutlet UIView *attrView;
AttributedTranslated *attr;
4) En el archivo xib (o guión gráfico) de su controlador principal, cree una Vista que contenga solo la Vista de texto atribuida (en el idioma original) y vincúlela a "attrView".
5) En tu viewDidLoad haz algo como lo siguiente:
if ([self isEng]) {
desc = [[Description alloc] init];
[attrView addSubview:attr.view];
}
Tal vez no sea la mejor manera de hacerlo, pero permite traducir el texto atribuido en Interface Builder, fácilmente.
No tendría sentido localizar el texto atribuido del guión gráfico, ya que necesitaría saber dónde aplicar los atributos después de la traducción. Es posible que el orden de las palabras haya cambiado y que, por ejemplo, si hubiera especificado algún texto en negrita azul, ya no tenga sentido.
Por supuesto, todavía puede hacerlo a través de un código donde puede dividir su cadena en varias y localizarlas individualmente. Luego puede especificar setAttributes: range: para que sepa que los atributos correctos siempre se aplicarán en el rango correcto de la cadena.
Terminé concluyendo que no se podía hacer usando ibtool
en la versión actual.
En su lugar, dejo que Textview sea una vista de texto sin formato y, utilizando mi subclase, analicé su propiedad de texto para poder hacer una NSMutableAttributedString
y establecer las propiedades necesarias.
Eso me permitió usar ibtool
para extraer las cadenas y aún tener una vista de texto atribuida.
en Xcode 6.1, la mejor manera es copiar el texto atribuido de una vista de texto en un texto RTF "BASE" (usando TextEdit por ejemplo o directamente desde XCode> Nuevo archivo> recursos> RTF).
Al pasar por el modo TextEdit, necesita importar su texto a su proyecto. Obviamente, si lo has hecho a través de Xcode, nada para importar.
luego solo usa el panel de utilidades para encontrar el botón "localizar" que hará su escritura.
para importar la versión correcta solo haga (en viewWillAppear for ej.),
NSURL *url = [[NSBundle mainBundle] URLForResource:[fileName stringByDeletingPathExtension] withExtension:[fileName pathExtension]];
NSError *error;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithFileURL:url
options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType}
documentAttributes:nil
error:&error];
[_originalMessage setAttributedText:attributedString];
Actualización para Swift 4:
var attrString: NSAttributedString?
let fileUrl: URL = Bundle.main.url(forResource: "mytextfile", withExtension: ".rtf")!
do {
attrString = try NSAttributedString(url: fileUrl, options: [.documentType:NSAttributedString.DocumentType.rtf], documentAttributes: nil)
} catch {
// Somebody do something!!
}