如何将本地化的界面文件(XIB、Storyboard)作为 xcode 项目结构并进行国际化工作?

Posted

技术标签:

【中文标题】如何将本地化的界面文件(XIB、Storyboard)作为 xcode 项目结构并进行国际化工作?【英文标题】:How to pod Localized interface files(XIB, Storyboard) as xcode project structure and make internationalization work? 【发布时间】:2016-08-04 10:08:20 【问题描述】:

正如 cocoapods 1.0.0.beta.1 的 changes 所说“使用 Base Internationalization 的本地化界面文件(XIB,Storyboard) - Base.lproj/Main.xib 和 en.lproj/Main.strings 表示为名为 Main.xib 的变体组”和 cocoapods 1.0.0.beta.1 “使用 Base Internationalization 时变体组使用 XIB 或 Storyboard 名称的特殊情况接口文件。”

我参考 demo 并使用 resource_bundles 来组织我的 podspecs 上的资源。

s.resource_bundles = 
     'Resources' => ['LocalizationDemo/LocalizationDemo/Resources/**/*.lproj,storyboard']

我的 cocoapods 版本是 1.0.1,但目录结果是

-Resources
--en.lproj
---LocalizationDemo.strings
--LocalizationDemo.storyboard
--de.lproj
---LocalizationDemo.strings

这不是我期望的结果目录,接口国际化不起作用。 云谁给我一个正确的用法或demo?

添加:我使用 xcode 的导入/导出本地化,然后再将其添加到其他项目。我希望它可以通过直接导入的 xliff 文件来工作,而不是添加 IBOutlet 或 UI 控件的子类。

【问题讨论】:

***.com/questions/38716367/… @PoojaM.Bohora。谢谢你的回复,但这对我没有帮助。 【参考方案1】:

您应该为 XIB OR Storyboard Views 中使用的 controls 编写类,并将这些类分配给相应的控件类型,如下所示 -

class LocalizedTextField: UITextField 

    override func drawPlaceholderInRect(rect: CGRect) 

        let localizedPlaceHolder = self.placeholder!.localized
        self.placeholder = localizedPlaceHolder
        super.drawPlaceholderInRect(rect)
    

class LocalizedLabel : UILabel 
    override func awakeFromNib() 
        if let text = text 
            self.text = text.localized
            self.bounds.size.width = CGFloat.max
            self.sizeToFit()
        
    


class LocalizedButton : UIButton 
    override func awakeFromNib() 
        for state in [UIControlState.Normal, UIControlState.Highlighted, UIControlState.Selected, UIControlState.Disabled, UIControlState.Focused] 
            if let title = titleForState(state) 
                setTitle(title.localized, forState: state)
            
        
    


extension String 

    var localized: String 
        let localizedValue =  NSLocalizedString(self, tableName: nil, bundle: NSBundle.mainBundle(), value: "", comment: "")
        if localizedValue == "" 

            return self
        
        else
        
            return localizedValue
        
        return self

    

【讨论】:

我在 pod 到其他项目之前使用 xcode 的导入/导出本地化。我希望它可以通过直接导入的 xliff 文件而不是添加 IBOutlet 或 UI 控件的子类来工作。

以上是关于如何将本地化的界面文件(XIB、Storyboard)作为 xcode 项目结构并进行国际化工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不为每种语言创建 xib 的情况下本地化 xib 视图中的文本?

使用xib开发界面

Cocoa/iPhone:如何防止凳子在 xib 文件中输出不可本地化的字符串?

我需要向每个 xib 添加本地化文件吗?

从 xib 文件中删除界面元素

如何在 Xcode 中为 XIB 文件设置默认色调?