Estou tentando localizar meu aplicativo usando NSLocalizedString. Quando eu importo o arquivo XLIFF, a maioria funciona bem, mas algo não funciona e algumas strings não são localizadas. Percebi que o problema é de NSLocalizedString contendo algo variável como:
NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")
ou
NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")
Talvez esta não seja a sintaxe correta para esse tipo de coisa. Alguém pode me explicar como fazer isso rapidamente? Muito obrigado.
ios
swift
localization
nslocalizedstring
xliff
Andorath
fonte
fonte
Respostas:
Você pode usar os
sprintf
parâmetros de formato deNSLocalizedString
, para que seu exemplo seja parecido com este:let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
fonte
" - %d Notifica"=" - %d Notifica";
%s
modificador que não funcionou = \%@
para substituir uma string.Na Sessão # 412 do WWDC2014 "Localizing with Xcode 6", a maneira adequada para fazer isso em Swift é a seguinte:
String.localizedStringWithFormat( NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
fonte
Eu segui a abordagem de criação de extensão para String, pois tenho muitas strings para localizar.
extension String { var localized: String { return NSLocalizedString(self, comment:"") } }
Para usá-lo para localização no código, faça:
self.descriptionView.text = "Description".localized
Para strings com variáveis dinâmicas, siga:
self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"
Declare as strings em arquivos String para diferentes idiomas (exemplo: árabe e inglês)
Espero estar ajudando!
fonte
The doors open at %@ o'clock
. Sua solução ainda funcionaria?Localizable.strings
. No entanto, acho que @Houman tem uma preocupação válida.Eu tentei as soluções acima, mas o código abaixo funcionou para mim
SWIFT 4
extension String { /// Fetches a localized String /// /// - Returns: return value(String) for key public func localized() -> String { let path = Bundle.main.path(forResource: "en", ofType: "lproj") let bundle = Bundle(path: path!) return (bundle?.localizedString(forKey: self, value: nil, table: nil))! } /// Fetches a localised String Arguments /// /// - Parameter arguments: parameters to be added in a string /// - Returns: localized string public func localized(with arguments: [CVarArg]) -> String { return String(format: self.localized(), locale: nil, arguments: arguments) } } // variable in a class let tcAndPPMessage = "By_signing_up_or_logging_in,_you_agree_to_our" .localized(with: [tAndc, pp, signin]) // Localization File String "By_signing_up_or_logging_in,_you_agree_to_our" = "By signing up or logging in, you agree to our \"%@\" and \"%@\" \nAlready have an Account? \"%@\"";
fonte
Aqui está uma extensão que uso em String, ela adiciona uma função localizeWithFormat com argumentos variáveis,
extension String:{ func localizeWithFormat(arguments: CVarArg...) -> String{ return String(format: self.localized, arguments: arguments) } var localized: String{ return Bundle.main.localizedString(forKey: self, value: nil, table: "StandardLocalizations") } }
Uso:
let siriCalendarText = "AnyCalendar" let localizedText = "LTo use Siri with my app, please set %@ as the default list on your device reminders settings".localizeWithFormat(arguments: siriCalendarTitle)
Apenas tome cuidado para não usar os mesmos nomes de função e propriedade que String possui. Eu normalmente uso um prefixo de 3 letras para todas as minhas funções de framework.
fonte
Eu criei um
extension
toString
porque tinha muitosstrings
para serlocalized
.extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } }
Por exemplo:
let myValue = 10 let anotherValue = "another value" let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized print(localizedStr)
fonte
Editor > Export for Localization...
não vai pegá-las.