หลีกเลี่ยง Android Lint บ่นเกี่ยวกับสตริงที่ไม่ได้แปล


119

เป็นไปได้หรือไม่ที่จะระบุว่าสตริงในไฟล์ภายในvalue-* ไดเร็กทอรีไม่ได้ถูกแปลเป็นภาษาอื่นโดยเจตนา? ฉันมีสตริงมากมายที่ใช้กันทั่วไปในทุกภาษาและไม่จำเป็นต้องแปลฉันจึงสร้างunlocalized-strings.xmlไฟล์ในvaluesไดเร็กทอรี .. เรียกใช้ Android Lint เพื่อตรวจสอบปัญหาที่มันบอกว่ามีการแปลบางส่วนหายไป .. ฉันไม่ต้องการ หากต้องการปิดใช้งานการตรวจสอบนี้ในโครงการทั้งหมดฉันต้องการปิดใช้งานในไฟล์ XML บางไฟล์เท่านั้น .. เป็นไปได้ไหม

"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.

วิธีการสามารถกำหนดนี้ภูมิภาคของunlocalizedสตริง?


คำตอบ:


159

ฉันไม่รู้ว่าจะเพิกเฉยต่อไฟล์ทั้งหมดได้อย่างไร แต่คุณสามารถทำได้โดยใช้สตริงโดยใช้:

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

1
สิ่งนี้ทำให้ 'ทรัพยากรที่ไม่สามารถแปลได้ควรกำหนดไว้ในค่า / โฟลเดอร์ฐาน
anon58192932

2
และถูกต้อง หากคุณไม่ต้องการให้แปลสตริงคุณควรกำหนดเฉพาะใน "ค่าฐาน / โฟลเดอร์" ซึ่งหมายความว่าอย่าป้อนสตริงในค่า / โฟลเดอร์ที่แปล
ลุย

1
คำตอบของ @CyrilLeroux นั้นครอบคลุมมากกว่าและควรทำเครื่องหมายว่าถูกต้องเนื่องจากแสดงตัวเลือกในการใส่สตริงที่แปลไม่ได้ทั้งหมดไว้ในไฟล์เดียว
Yoel Gluschnaider

วิธีนี้ใช้ได้ผล แต่ฉันไม่คิดว่าเป็นวิธีที่ดีที่สุดในการแก้ปัญหาโดยการทำเครื่องหมายสตริงที่แปลได้จริง "ไม่สามารถแปลได้" เพียงเพื่อระงับข้อความแสดงข้อผิดพลาด เราเลือกที่จะไม่แปลบางสตริงในขณะนี้ แต่นั่นไม่ได้หมายความว่าพวกเขาไม่สามารถแปลได้
Zili FENG

ฉันต้องการใส่สตริงในภาษาเดียวและนั่นคือภาษาเยอรมัน (de) (ไม่ใช่ภาษาอังกฤษเริ่มต้น) ฉันวางมันไว้ที่นั่นและเมื่อฉันพยายามปล่อยบิลด์มันทำให้ฉันเกิดข้อผิดพลาด จะทำอย่างไรในกรณีนี้?
Aanal Mehta

228

เป็นignoreแอตทริบิวต์ของtoolsเนมสเปซในไฟล์สตริงของคุณดังนี้:

<?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>

<resources tools: ignlation = "MissingTranslation"> กำลังให้ Error Parsing XML: unbound prefix
anon58192932

5
ใช้งานได้ดี แต่ฉันต้องไปProject->Cleanเพื่อลบข้อผิดพลาดอย่างเด็ดขาด
xonya

อย่างน้อย eclipse ก็ไม่ได้บีบบังคับให้เราแปลทุกอย่างรวมถึงโฟลเดอร์สตริงแปลก ๆ เช่น ids.xml และ analytics.xml
Androidcoder

2
นี่ควรเป็นคำตอบที่ยอมรับได้สำหรับการแก้ไขปัญหาทั้งหมดด้วยโค้ดเพียง 2 บรรทัด
nhoxbypass

153

เพิ่มในbuild.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}

7
โซลูชันเดียวที่ใช้งานได้สำหรับจัดการกับทรัพยากรสตริงที่สร้างขึ้นโดยอัตโนมัติขอบคุณ
SqueezyMo

6
ไม่ควรตามคำถาม: "ฉันไม่ต้องการปิดการใช้งานการตรวจสอบนี้ในโครงการทั้งหมด"
Yoel Gluschnaider

@Giraffe Lion คุณควรโพสต์คำถามนี้เป็นคำถามอื่นและตอบด้วยตัวเองขอบคุณสำหรับวิธีแก้ปัญหาก่อนหน้านี้ฉันต้องปิดการใช้งานด้วยตนเอง
Diljeet

1
สิ่งนี้ปิดใช้งานการตรวจสอบทั้งหมดซึ่งควรหลีกเลี่ยงถ้าเป็นไปได้ ฉันไม่เข้าใจว่าทำไมจึงมีการโหวตมากมายขนาดนี้
tasomaniac

23

มี 3 วิธีที่ฉันรู้:

เมื่อต้องการใช้ค่าการปรับเปลี่ยนตามค่า: ตั้งค่าแอตทริบิวต์translatable="false"ตาม<string>คำจำกัดความ:

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

หากคุณมีทรัพยากรจำนวนมากที่ไม่ควรแปลคุณสามารถวางไว้ในไฟล์ที่ชื่อdonottranslate.xmlและผ้าสำลีจะพิจารณาทรัพยากรทั้งหมดที่ไม่สามารถแปลได้

อีกวิธีหนึ่งที่ฉันค้นพบขณะเรียกดูแหล่งที่มาของโครงการ Hackers Keyboard :
คุณสามารถเพิ่มคำนำหน้าdonottranslate-ในไฟล์ทรัพยากรของคุณได้ ดังตัวอย่างก่อนหน้านี้ผ้าสำลีจะพิจารณาทรัพยากรที่ไม่สามารถแปลได้ทั้งหมด
ในกรณีของคุณคุณสามารถแทนที่โดยunlocalized-strings.xml donottranslate-strings.xmlดูเหมือนจะใช้ได้ แต่ฉันไม่พบเอกสารใด ๆ สำหรับเคล็ดลับนี้

ดู: ไซต์โครงการเครื่องมือ Android: สตริงที่แปลไม่ได้


จริงหรือไม่ถ้าเราใส่สตริงของเราในไฟล์donottranlate.xmlเราไม่จำเป็นต้องเพิ่มtranslatable="false"แท็กอีกต่อไป?
Yuchen Zhong

อ๋อ ฉันใช้ไฟล์ donottranslate-strings.xml ในโครงการทั้งหมดของฉัน ใช้งานได้ดี ลองดูสิมีประโยชน์มาก!
Cyril Leroux

12

และนี่คือโซลูชัน Android Studio สำหรับการปิดใช้งานข้อผิดพลาดร้ายแรง Lint นี้:

ใส่คำอธิบายภาพที่นี่


2
อาจเป็นข้อผิดพลาดที่น่ารำคาญ แต่อาจช่วยประหยัดเวลาที่คุณลืมแปลสตริงใหม่เป็นภาษาของแอปโดยไม่ได้ตั้งใจ
Elad Nava

2

ฉันคิดว่าสิ่งที่คุณต้องการแทนที่จะปิดการใช้งานผ้าสำลีคือการทำเครื่องหมายด้วยแอตทริบิวต์

translatable="false"

2

สร้างไฟล์ทรัพยากรที่มีชื่อไฟล์ขึ้นต้นด้วย " donottranslate " (เช่นdonottranslate.xml , donottranslate_urls.xmlเป็นต้น) และผ้าสำลีจะละเว้นสตริงทั้งหมดเมื่อตรวจสอบคำแปลที่ขาดหายไป


1

หากคุณต้องการเปลี่ยนการตรวจสอบผ้าสำลีในการแปลที่ขาดหายไปคุณสามารถไปได้

"คุณสมบัติโครงการ -> การตั้งค่า Android Lint -> เลือก MissingTranslation -> Swtich เพื่อละเว้นในความรุนแรง",

หวังว่านี่จะช่วยคนอื่นได้เพราะฉันเพิ่งเจอปัญหานี้ :)


2
มีวิธีทำใน Android Studio ไหม ฉันไม่พบการตั้งค่าที่เกี่ยวข้องกับผ้าสำลี
Adrian L

1

อีกวิธีในการทำเช่นนั้นคือเพิ่มสตริงของคุณลงในไฟล์ gradle โดยใช้resValueหรือbuildConfigField. อะไรแบบนั้น:

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"
    }
}

ประเพณี:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)

0

เพื่อหลีกเลี่ยงคำเตือนใน Android Studio ให้เปิดการตั้งค่า ==> การตรวจสอบยกเลิกการเลือก "คำแปลไม่สมบูรณ์" แต่จะไม่ส่งผลกระทบต่อการสร้าง Gradle


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.