{"id":946,"date":"2016-03-21T09:56:38","date_gmt":"2016-03-21T09:56:38","guid":{"rendered":"http:\/\/phyline.com\/blog\/?p=946"},"modified":"2016-08-06T19:14:49","modified_gmt":"2016-08-06T19:14:49","slug":"swift-internacionalizacion-de-strings","status":"publish","type":"post","link":"http:\/\/sophyonline.com\/blog\/2016\/03\/swift-internacionalizacion-de-strings\/","title":{"rendered":"Swift: Internacionalizaci\u00f3n de Strings"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-957 size-medium aligncenter\" src=\"http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2016\/08\/swift-e1456593526993-300x77.png\" width=\"300\" height=\"77\" srcset=\"http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2016\/08\/swift-e1456593526993-300x77.png 300w, http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2016\/08\/swift-e1456593526993-768x196.png 768w, http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2016\/08\/swift-e1456593526993-1024x262.png 1024w, http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2016\/08\/swift-e1456593526993-1200x307.png 1200w, http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2016\/08\/swift-e1456593526993.png 1550w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Est\u00e1s escribiendo tu app, digamos que est\u00e1s en tu zona <strong>ZEN<\/strong>, y por obvias razones quieres que sea adaptable a diferentes idiomas. Pero eso en cierta manera rompe el<strong> MOJO del ZEN<\/strong>, porque tienes que crear el fichero de internacionalizaci\u00f3n y comenzar a aplicar NSLocalizedString en <strong>TODO<\/strong>.<\/p>\n<p>En mi caso, cuando estaba en ello me encontr\u00e9 repitiendo c\u00f3digo, y todos sabemos que:<\/p>\n<ol>\n<li>Va encontra de los principios de <code>\u00a0Clean Code<\/code><\/li>\n<li>y qu\u00e9 pereza estar escribiendo lo mismo una y otra vez, lo que aplica a <code>DRY<\/code><\/li>\n<\/ol>\n<p>As\u00ed que, me he creado una extension de un <code>String<\/code> en los que se puede evitar los puntos 1 y 2 al llamar solo a una propiedad localized en la cadena de texto que quiero internacionalizar. <strong>Amazing<\/strong>.<\/p>\n<pre class=\"theme:github line-height:25 lang:swift decode:true \">extension String {\r\n\r\n   var localized: String {\r\n      return String.localizedStringWithFormat(NSLocalizedString(self,comment: \"\"))\r\n   }\r\n\r\n   func localizedWithComment(comment:String) -&gt; String {\r\n      return String.localizedStringWithFormat(NSLocalizedString(self,comment: comment))\r\n   }\r\n}<\/pre>\n<p>Creando constantes y luego haciendo referencia a estos podemos usarlo donde querramos:<\/p>\n<pre class=\"theme:github line-height:25 lang:swift decode:true\">\/\/Usamos constants\r\nlet errortitle = \"Este es mi mensaje de error\".localized\r\n\r\n\/\/Usando la constante especificada en el fichero localized.strings\r\n\"errorMessage\" = \"Este es mi mensaje de error\"\r\nlet errortitle = \"errorMessage\".localized\r\n<\/pre>\n<p>Y ahora \u00a0aplicamos esta l\u00f3gica en un segmento de c\u00f3digo, como el AlertController:<a href=\"http:\/\/sophyonline.com\/blog\/wp-content\/uploads\/2015\/08\/swift-e1456593526993.png\" rel=\"attachment wp-att-685\"><br \/>\n<\/a><\/p>\n<pre class=\"theme:github line-height:25 lang:swift decode:true\">func showAlertError(){\r\n\r\n    var alertController = UIAlertController(title: errortitle,\r\n                                            message: errormessage,\r\n                                            preferredStyle: .Alert)\r\n\r\n    let cancelAction = UIAlertAction(title: cancel, style: .Cancel) {\r\n      (action) in\r\n      \/\/blah blah tu c\u00f3digo aqu\u00ed\r\n    }\r\n    alertController.addAction(cancelAction)\r\n    presentViewController(alertController, animated: true, completion: nil)\r\n}<\/pre>\n<p>Y ya est\u00e1. F\u00e1cil y sencillo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Est\u00e1s escribiendo tu app, digamos que est\u00e1s en tu zona ZEN, y por obvias razones quieres que sea adaptable a diferentes idiomas. Pero eso en cierta manera rompe el MOJO del ZEN, porque tienes que crear el fichero de internacionalizaci\u00f3n y comenzar a aplicar NSLocalizedString en TODO. En mi caso, cuando estaba en ello me <a class=\"read-more\" href=\"http:\/\/sophyonline.com\/blog\/2016\/03\/swift-internacionalizacion-de-strings\/\">&hellip;&nbsp;<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-946","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/posts\/946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/comments?post=946"}],"version-history":[{"count":10,"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/posts\/946\/revisions"}],"predecessor-version":[{"id":1062,"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/posts\/946\/revisions\/1062"}],"wp:attachment":[{"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/media?parent=946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/categories?post=946"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/sophyonline.com\/blog\/wp-json\/wp\/v2\/tags?post=946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}