Có cách nào để dễ dàng xác định xem ngôn ngữ thiết bị được đặt thành phải sang trái (RTL) không?iOS: Xác định xem ngôn ngữ của thiết bị là phải sang trái (RTL)
Trả lời
Trong iOS 9, người dùng có thể xác định hướng hiện tại cho từng chế độ xem riêng lẻ.
if #available(iOS 9.0, *) {
if UIView.userInterfaceLayoutDirection(
for: myView.semanticContentAttribute) == .rightToLeft {
// The view is shown in right-to-left mode right now.
}
} else {
// Use the previous technique
if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft {
// The app is in right-to-left mode
}
}
Đây là cách đề nghị xác định hướng bố trí trong iOS 9.
WWDC 2015 Video New UIKit Support for International User Interfaces. Sau phút 31:20.
NSLocale
có hai phương pháp +characterDirectionForLanguage:
và +lineDirectionForLanguage:
. Điều đầu tiên có lẽ là Trái sang phải và Từ phải sang trái và thứ hai là từ trên xuống dưới so với từ dưới lên trên. Bạn có thể vượt qua kết quả của [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]
.
Cập nhật:
Các câu hỏi ban đầu hỏi là làm thế nào để xác định xem ngôn ngữ điện thoại là RTL. Sử dụng +[NSLocale characterDirectionForLanguage:]
và +[NSLocale lineDirectionForLanguage:]
là chính xác một cách rõ ràng cho điều đó; bạn có thể vượt qua [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]
hoặc [NSLocale preferredLanguages][0]
để biết thông tin có liên quan (Tôi không chắc chắn liệu có phải NSLocaleLanguageCode
sử dụng ngôn ngữ ưa thích hay vùng đã đặt) hay không.
Tuy nhiên, rất có khả năng những gì mà áp phích ban đầu thực sự muốn biết là liệu giao diện của ứng dụng có nên được trình bày trong RTL hoặc LTR hay không. Điều này rất giống với việc hỏi hướng của ngôn ngữ là gì, ngoại trừ việc tính toán nội địa hóa sẵn có của ứng dụng. Nếu ứng dụng không được bản địa hóa sang ngôn ngữ ưa thích của người dùng, nó sẽ sử dụng ngôn ngữ không ưa thích thay thế. Và câu trả lời cho câu hỏi này là sử dụng [UIApplication sharedApplication].userInterfaceLayoutDirection
.
Thật không may điều này là không chính xác; cách tốt nhất để làm điều đó là thông qua '' '[UIApplication sharedApplication] .userInterfaceLayoutDirection''', như đã đề cập trong [answer below] (http://stackoverflow.com/a/25500099/242849). – wakachamo
Bỏ phiếu bầu cho câu trả lời này. Vui lòng xem nhận xét của 'wakachamo' để biết cách xác định hướng bố cục giao diện tốt nhất. – Sean
@wakachamo: Câu hỏi được hỏi là xác định ngôn ngữ là RTL hay không. '[UIApplication sharedApplication] .userInterfaceLayoutDirection' khai báo xem hướng giao diện có nên được đặt ra LTR hay RTL hay không. Đây không phải là điều tương tự mà câu hỏi đang hỏi. Mặc dù trên thực tế nó có thể là những gì mà poster gốc muốn. –
Nhờ câu trả lời Kevin Ballard của tôi đã có thể để tạo ra các chức năng hữu ích sau đây để làm điều này:
+ (BOOL)isDeviceLanguageRTL {
return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft;
}
Mặc dù câu trả lời của @ Accatyyc là đúng về mặt kỹ thuật, nhưng nó không trả lại giá trị chính xác trong trường hợp của tôi. Tôi thử nghiệm trên iOS8, thay đổi ngôn ngữ thành arabic nhưng phương thức 'userInterfaceLayoutDirection' trả về LTR. Vì vậy, tôi đã thử câu trả lời này và nó đã giải quyết được vấn đề của tôi. – FormigaNinja
Hãy chắc chắn rằng bạn quay trở lại ngôn ngữ hiện đang được chọn, không phải là khu vực hiện tại của thiết bị. Khu vực và ngôn ngữ thường giống nhau. Tuy nhiên, nếu tôi ở Bắc Mỹ và tôi đặt ngôn ngữ của tôi sang tiếng Nhật, khu vực của tôi sẽ vẫn là tiếng Anh (Hoa Kỳ). Để kiểm tra sự chỉ đạo đặc trưng của ngôn ngữ hiện đang được chọn, bạn có thể làm:
+ (BOOL)isDeviceLanguageRTL {
return ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft);
}
Bạn có thể muốn để cache kết quả, sử dụng dispatch_once
.
Hãy nhớ rằng đây là hướng ngôn ngữ ưa thích của người dùng và không nhất thiết phải là hướng ngôn ngữ của văn bản. Đối với điều đó, hãy sử dụng hàm C dựa trên u_charDirection
.
Câu trả lời này cũng không đúng - xem câu trả lời của tôi. – Accatyyc
Rose Perrone hoàn toàn chính xác. Tuy nhiên việc sử dụng dispatch_once trong một getter cho một giá trị boolean đơn giản - thực sự là quá nhiều chi phí. Sử dụng không cần thiết của công văn một lần. Bởi vì bạn có thể muốn sử dụng nhiều lần trong một bố cục hoặc chức năng vẽ.
Vì vậy, bạn có hai lựa chọn nhanh hơn:
+ (BOOL)isRtl
{
static BOOL isRtl = NO;
static BOOL isRtlFound = NO;
if (!isRtlFound)
{ // This is "safe enough". Worst case is this code will be called twice in the app's lifecycle...
isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft;
isRtlFound = YES;
}
return isRtl;
}
Hoặc chỉ cần bộ nhớ cache nó trong một biến tĩnh, sử dụng constructor tĩnh:
static BOOL s_isRtl = NO;
+ initialize
{
s_isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft;
}
Lưu ý rằng điều này thực sự sẽ chia sẻ các biến tĩnh giữa bất kỳ lớp sử dụng mã này.
dispatch_once refresher: "Chức năng này rất hữu ích cho việc khởi tạo dữ liệu toàn cầu (đơn) trong một ứng dụng. Luôn gọi hàm này trước khi sử dụng hoặc kiểm tra bất kỳ biến nào được khởi tạo bởi khối. Nếu được gọi đồng thời từ nhiều chủ đề, chức năng này chờ đồng bộ cho đến khi khối hoàn thành. Vị từ phải trỏ đến một biến được lưu trữ trong phạm vi toàn cục hoặc tĩnh. " – SK9
Dưới đây là làm thế nào tôi sử dụng nó:
+(NSTextAlignment) alignmentOfLanguage {
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]]==NSLocaleLanguageDirectionRightToLeft){
return NSTextAlignmentRight;
}
return NSTextAlignmentLeft;
}
Ví dụ cuối không làm việc cho tôi, nhưng với một biến thể nhỏ, tôi đã nhận nó rightX2.
mọi nhận xét?
Có một cách chính thức để làm điều đó:
if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
}
tôi muốn giới thiệu với sử dụng một số giải pháp khác, vì họ sẽ không luôn luôn trả về địa phương chính xác. Chỉ vì nó ở trên cùng của các ngôn ngữ ưa thích không có nghĩa là ứng dụng hỗ trợ nó.
Đây là (do không rõ ràng ý nghĩa của câu hỏi của OP) rất có thể những gì OP muốn. – Sean
Xin lưu ý rằng Apple đã cập nhật tài liệu của họ và giờ đây, nó chỉ đề xuất một phương pháp khác là iOS 9. Xem: http://stackoverflow.com/a/31759275/785716 – Keab42
Tôi sử dụng điều này trong một số trường hợp, ngay cả trên iOS 9, vì đôi khi bạn chỉ đơn giản là không có một thể hiện của UIView để kiểm tra ngữ nghĩaContentAttribute chống lại. – Mike
Ok, mặc dù nó là một câu hỏi cũ với một câu trả lời được chấp nhận, tôi sẽ trả lời nó anyway.
Đối với những người muốn kiểm tra xem ngôn ngữ điện thoại là RTL, độc lập nếu ứng dụng của bạn có hỗ trợ hay không bằng ngôn ngữ này, bạn nên sử dụng [NSLocale characterDirectionForLanguage:]
như thế này:
+ (BOOL)isDeviceLanguageRightToLeft {
NSLocale *currentLocale = [NSLocale currentLocale];
NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:[currentLocale objectForKey:NSLocaleLanguageCode]];
return (direction == NSLocaleLanguageDirectionRightToLeft);
}
Đoạn mã trên sẽ trở YES
nếu ứng dụng của bạn chỉ hỗ trợ tiếng Anh, nhưng thiết bị của bạn được đặt thành tiếng Ả Rập chẳng hạn.
Apple khuyên bạn nên sử dụng [UIApplication sharedApplication].userInterfaceLayoutDirection
, chỉ vì nó trả về hướng dựa trên ngôn ngữ mà ứng dụng của bạn đang sử dụng (có hỗ trợ). Dưới đây là đoạn mã:
+ (BOOL)isAppLanguageRightToLeft {
NSLocaleLanguageDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection;
return (direction == UIUserInterfaceLayoutDirectionRightToLeft);
}
Đoạn mã trên sẽ trở NO
khi ứng dụng của bạn chỉ hỗ trợ tiếng Anh, nhưng thiết bị của bạn được đặt sang tiếng Ả Rập ví dụ.
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:self.view.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft) {
NSLog(@"Right to left");
}
else{
NSLog(@"left to Right");
}
} else {
/* Use the previous technique */
//Work for earlier ios 6 to ios 10
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft) {
NSLog(@"Right to left");
}
else{
NSLog(@"left to Right");
}
}
Đây là 3 phiên bản nhanh chóng:
import UIKit
extension UIView
{
/// Returns text and UI direction based on current view settings
var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection
{
if #available(iOS 9.0, *) {
return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute)
} else {
return UIApplication.shared.userInterfaceLayoutDirection
}
}
}
nếu bạn muốn kiểm tra xem thiết bị đang chạy trong RTL hoặc LTR trong nhanh chóng 3
if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) {
//RTL
} else {
//LTR
}
- 1. Xác định ngôn ngữ RTL trong Android
- 2. Trạng thái của ngôn ngữ từ phải sang trái trên Android là gì?
- 3. ngôn ngữ từ phải sang trái trong Python
- 4. phải sang trái Ngôn ngữ Bracket Đảo ngược
- 5. Xác định xem thiết bị có phải là Kindle
- 6. Cách sử dụng jqueryui cho các ngôn ngữ từ phải sang trái
- 7. Phải sang trái UILabels
- 8. Twitter Bootstrap CSS hỗ trợ từ các ngôn ngữ RTL
- 9. Tải ngôn ngữ mặc định của thiết bị BlackBerry
- 10. Thay đổi hướng của HTML <title> thẻ sang phải sang trái
- 11. Các nhánh của liên kết từ phải sang trái và từ trái sang phải trong ngôn ngữ dựa trên C là gì?
- 12. thay đổi cài đặt ngôn ngữ ứng dụng trong iOS không phải toàn bộ thiết bị
- 13. Sử dụng ngôn ngữ khác cho chế độ xem hệ thống so với ngôn ngữ thiết bị hiện tại
- 14. Ngôn ngữ mặc định không phải tiếng Anh cho ứng dụng iOS?
- 15. Làm cách nào để xác định xem ngôn ngữ có phải là ngữ cảnh miễn phí hay không?
- 16. Bố cục từ phải sang trái trong android
- 17. Ngôn ngữ PHP có phải là C?
- 18. Có cách nào để phát hiện ngôn ngữ RTL trong Java không?
- 19. hỗ trợ từ phải sang trái (RTL) trong dự án SASS
- 20. Làm thế nào để xác định xem một ngôn ngữ là LL (1)?
- 21. Android: Có cách nào để thay đổi ngôn ngữ mặc định của android sang ngôn ngữ mới không?
- 22. ngôn ngữ lập trình không xác định
- 23. Python không phải là ngôn ngữ chuẩn?
- 24. Xem hoạt ảnh từ phải sang trái android
- 25. IOS: xác minh xem chuỗi có phải là chuỗi rỗng
- 26. Iphone và văn bản từ phải sang trái
- 27. dịch một ngôn ngữ này sang ngôn ngữ khác?
- 28. iOS: Cách nhận ngôn ngữ ứng dụng hiện tại
- 29. Chuyển đổi ngôn ngữ lập trình trên thiết bị Android
- 30. Text: phải sang trái (CSS)
Có cách nào để đánh dấu câu trả lời là "đúng bây giờ" không? Đối với hậu thế, câu trả lời tôi đã chọn ba năm trước là chính xác vào thời điểm đó, nhưng điều này có lẽ nên cao hơn. – BarrettJ
@BarrettJ bạn luôn có thể không chấp nhận và chấp nhận một câu trả lời khác. – SmokeDispenser
Bây giờ là 'UIView.userInterfaceLayoutDirectionForSemanticContentAttribute (semanticContentAttribute) == .RightToLeft'. – ChrisB