我们正在将我的团队正在开发的移动应用程序国际化,我注意到"取消" SearchBar中的按钮没有翻译(其他一切都正常翻译) - 它总是说"取消"无论用什么语言,我都会将iPad模拟器改为。如果我可以自己设置文本,那么我可以确保它正确地国际化。所以......
如何更改"取消" Xamarin.Forms SearchBar上的按钮文字?我尝试过自定义渲染器,但我很难定位取消按钮子视图。 This answer似乎在解释如何在Objective C中执行此操作方面做得很好,但我在Xamarin.Forms框架中将其转换为C#时遇到了问题。
答案 0 :(得分:4)
为iOS创建新的custom renderer。类似CustomSearchBarRenderer和子类Xamarin的原始SearchBarRenderer
public class CustomSearchBarRenderer : SearchBarRenderer { }
我可能会尝试覆盖OnElementChanged
方法,并在基类完成所有工作后设置自定义标题。像这样:
protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
base.OnElementChanged(e);
var cancelButton = Control.FindDescendantView<UIButton>();
cancelButton.Title = "Whatever";
}
编辑:请注意,cancelButton可能会在某个时刻重新创建,因此您可能还必须在其他位置设置标题。但是,这应该是一个很好的起点。
您还可以查看当前的SearchBarRenderer实现here。
答案 1 :(得分:0)
我结合了答案,并在需要的每个事件上设置了按钮文本。我还修复了取消按钮的显示和隐藏(请参见here):
using FestivalHolledauApp.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using System.Linq;
[assembly: ExportRenderer(typeof(SearchBar), typeof(CustomSearchBarRenderer))]
namespace FestivalHolledauApp.iOS
{
public class CustomSearchBarRenderer : SearchBarRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
base.OnElementChanged(e);
// Fixing Cancel button
if (e.NewElement != null)
{
this.Control.TextChanged += (s, ea) =>
{
this.Control.ShowsCancelButton = true;
SetCancelButtonText();
};
this.Control.OnEditingStarted += (s, ea) => //when control receives focus
{
this.Control.ShowsCancelButton = true;
SetCancelButtonText();
};
this.Control.OnEditingStopped += (s, ea) => //when control looses focus
{
this.Control.ShowsCancelButton = false;
};
}
}
private void SetCancelButtonText()
{
var cancelButton = Control.Descendants().OfType<UIButton>().FirstOrDefault();
if (cancelButton != null)
{
cancelButton.SetTitle("Schließen", UIControlState.Normal);
}
}
}
}
答案 2 :(得分:0)
我在...上遇到了同样的问题
我用resource based localization进行了本地化。
有很多黑客可以找到本机按钮并手动设置文本,但是我知道这不是本来的方式。因此,我进行了更深入的研究,发现了Gerald Versluis撰写的以下精彩文章:
对我来说,这只是要将以下代码块添加到我的Info.plist中:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>de</string>
</array>
这样,iOS会自动转换当前系统区域性的所有UI元素(无需将这些文本添加到任何资源文件中)。