Tránh Android Lint phàn nàn về chuỗi không được dịch


119

Có thể chỉ định rằng các chuỗi trong một tệp trong các value-* thư mục cố ý không được dịch sang các ngôn ngữ khác không? Tôi có một loạt các chuỗi phổ biến cho tất cả các ngôn ngữ và không cần bản dịch, vì vậy tôi đã tạo một unlocalized-strings.xmltệp trong valuesthư mục .. Đang chạy Android Lint để kiểm tra các vấn đề, nó liên tục thông báo rằng một số bản dịch bị thiếu .. Tôi không muốn để tắt kiểm tra này trên toàn bộ dự án, tôi chỉ muốn tắt nó trong một số tệp XML .. có được không?

"title_widget_updater_service" is not translated in de, en, en-rUS, it

Issue: Checks for incomplete translations where not all strings are translated
Id: MissingTranslation

If an application has more than one locale, then all the strings declared in one language     
should also be translated in all other languages.

By default this detector allows regions of a language to just provide a subset of the 
strings and fall back to the standard language strings. You can require all regions to 
provide a full translation by setting the environment variable 
ANDROID_LINT_COMPLETE_REGIONS.

Làm thế nào có thể định nghĩa này khu vực của unlocalized chuỗi?


Câu trả lời:


159

Tôi không biết làm thế nào để bỏ qua tất cả các tệp, nhưng bạn có thể làm điều đó bằng chuỗi ký tự bằng cách sử dụng:

<string name="hello" translatable="false">hello</string>

1
điều này cung cấp cho 'tài nguyên không thể dịch chỉ nên được xác định trong thư mục / giá trị cơ sở.
anon58192932 Ngày

2
Và điều đó chính xác. Nếu bạn không muốn một chuỗi được dịch, bạn chỉ nên xác định nó trong "giá trị cơ sở / thư mục", có nghĩa là không nhập chuỗi vào các giá trị / thư mục đã dịch.
Luis

1
Câu trả lời @CyrilLeroux toàn diện hơn và nên được đánh dấu là câu trả lời đúng vì nó hiển thị tùy chọn đặt tất cả các chuỗi không thể dịch vào một tệp.
Yoel Gluschnaider

Điều này hoạt động nhưng tôi không nghĩ là cách tốt nhất để giải quyết vấn đề bằng cách đánh dấu một chuỗi thực sự có thể dịch là "không thể dịch được" chỉ để loại bỏ thông báo lỗi. Chúng tôi chỉ chọn không dịch một số chuỗi vào lúc này. Nhưng điều đó không có nghĩa là chúng không thể dịch được.
Zili FENG

Tôi muốn đặt chuỗi chỉ bằng một ngôn ngữ và đó là ngôn ngữ Đức (de) (không phải tiếng Anh mặc định). Tôi đặt nó ở đó và khi tôi cố gắng phát hành bản dựng, nó đã báo lỗi cho tôi. Làm gì trong trường hợp này?
Aanal Mehta

228

Đó là ignorethuộc tính của toolskhông gian tên trong tệp chuỗi của bạn, như sau:

<?xml version="1.0" encoding="utf-8"?>
<resources
  xmlns:tools="http://schemas.android.com/tools"
  tools:ignore="MissingTranslation" >

  <!-- your strings here; no need now for the translatable attribute -->

</resources>

<cụ nguồn: bỏ qua = "MissingTranslation"> đang đem lại cho tôi Lỗi Parsing XML: không ràng buộc tiền tố
anon58192932

5
Điều này hoạt động tốt nhưng tôi phải đi Project->Cleanđể loại bỏ các lỗi dứt điểm.
xonya

Ít nhất thì eclipse đã không ép buộc chúng tôi dịch mọi thứ, bao gồm cả các thư mục chuỗi lẻ như ids.xml và analytics.xml.
Androidcoder

2
Câu trả lời này phải được chấp nhận vì giải quyết tất cả các vấn đề chỉ trong 2 dòng mã.
nhoxbypass

153

Thêm vào build.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}

7
Giải pháp khả thi duy nhất để xử lý các tài nguyên chuỗi được tạo tự động. Cảm ơn.
SqueezyMo

6
không có nó không nên căn cứ vào câu hỏi: "Tôi không muốn vô hiệu hóa việc kiểm tra này trên toàn bộ dự án"
Yoel Gluschnaider

@Giraffe Lion, bạn nên đăng câu hỏi này dưới dạng một câu hỏi khác và tự trả lời nó, Cảm ơn vì giải pháp, trước đây tôi đã phải vô hiệu hóa nó theo cách thủ công.
Diljeet

1
Điều này đã vô hiệu hóa toàn bộ việc kiểm tra mà nên tránh nếu có thể. Tôi không thể hiểu tại sao nó có nhiều phiếu bầu như vậy.
tasomaniac

23

Có 3 cách mà tôi biết:

Để áp dụng giá trị sửa đổi theo giá trị: Đặt thuộc tính translatable="false"trên <string>định nghĩa:

<string name="account_setup_imap" translatable="false">IMAP</string>

Nếu bạn có nhiều tài nguyên không nên dịch, bạn có thể đặt chúng vào một tệp có tên donottranslate.xmlvà lint sẽ coi tất cả chúng là tài nguyên không thể dịch được.

Một cách khác tôi đã phát hiện ra khi duyệt các nguồn dự án Bàn phím Tin tặc :
Bạn có thể thêm tiền tố donottranslate-vào tệp tài nguyên của mình. Như trong ví dụ trước, lint sẽ coi tất cả chúng là tài nguyên không thể dịch được.
Trong trường hợp của bạn, bạn có thể thay thế unlocalized-strings.xmlbằng donottranslate-strings.xml. Nó có vẻ hoạt động, nhưng tôi không tìm thấy bất kỳ tài liệu nào cho mẹo này.

Xem: Trang web dự án công cụ Android: Chuỗi không thể dịch


Có đúng là nếu chúng ta đặt chuỗi của mình vào tệp donottranlate.xml, chúng ta không cần thêm translatable="false"thẻ nữa không?
Yuchen Zhong

Vâng. Tôi sử dụng tệp donottranslate-string.xml trong tất cả dự án của mình. Hoạt động tốt. Hãy thử nó, nó rất hữu ích!
Cyril Leroux

12

Và đây là giải pháp Android Studio để tắt lỗi Lint nghiêm trọng này:

nhập mô tả hình ảnh ở đây


2
Đây có thể là một lỗi khó chịu, nhưng nó có thể cứu bạn khi bạn vô tình quên dịch một chuỗi mới sang một trong các ngôn ngữ ứng dụng của mình.
Elad Nava

2

Tôi nghĩ rằng những gì bạn cần thay vì vô hiệu hóa xơ vải là đánh dấu chúng bằng thuộc tính

translatable="false"

2

Tạo tệp tài nguyên với tên tệp bắt đầu bằng " donottranslate " (ví dụ: donottranslate.xml , donottranslate_urls.xml , v.v.) và lint sẽ hoàn toàn bỏ qua các chuỗi của nó khi kiểm tra các bản dịch bị thiếu.


1

Nếu bạn muốn kiểm tra xơ vải về bản dịch bị thiếu, bạn có thể đi

"Thuộc tính dự án -> Tùy chọn Android Lint -> Chọn Dịch thiếu -> Chuyển sang Bỏ qua ở mức độ nghiêm trọng",

hy vọng điều này sẽ giúp những người khác vì tôi chỉ gặp vấn đề này :)


2
Có cách nào để làm điều đó trong Android Studio không? Tôi không thể tìm thấy cài đặt liên quan đến lint
adrian_88

1

Một cách khác để làm điều đó là thêm chuỗi của bạn vào tệp gradle, sử dụng resValuehoặc buildConfigField. Đại loại như vậy:

buildTypes {
    debug {
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
}

Tập quán:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)

0

Để tránh cảnh báo trong Android Studio, hãy mở Tùy chọn ==> Kiểm tra, bỏ chọn "Bản dịch chưa hoàn chỉnh". Nhưng nó sẽ không ảnh hưởng đến việc xây dựng Gradle.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.