Unikaj Androida Lint narzeka na nieprzetłumaczony ciąg

119

czy można określić, że ciągi znaków w pliku w value-* katalogach celowo nie są tłumaczone na inne języki? Mam kilka ciągów znaków, które są wspólne dla wszystkich języków i nie wymagają tłumaczenia, więc utworzyłem unlocalized-strings.xmlplik w valueskatalogu. Uruchamiam Android Lint w celu sprawdzenia problemów. Ciągle mówi, że brakuje niektórych tłumaczeń. Nie chcę aby wyłączyć to sprawdzanie w całym projekcie, chciałbym to wyłączyć tylko w niektórych plikach XML .. czy to możliwe?

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

W jaki sposób można to zdefiniowany obszar z unlocalized strun?

Gianni Costanzi
źródło

Odpowiedzi:

159

Nie wiem, jak zignorować cały plik, ale możesz to zrobić ciąg po łańcuchu, używając:

<string name="hello" translatable="false">hello</string>
Luis
źródło
1
to daje „nieprzekładalne zasoby powinny być zdefiniowane tylko w podstawowych wartościach / folderze.
anon58192932
2
I to się zgadza. Jeśli nie chcesz, aby ciąg był tłumaczony, powinieneś zdefiniować go tylko w „wartościach bazowych / folderze”, co oznacza, że ​​nie wpisuj ciągu w przetłumaczonych wartościach / folderze.
Luis
1
Odpowiedź @CyrilLeroux jest bardziej wyczerpująca i powinna być oznaczona jako poprawna, ponieważ pokazuje opcję umieszczenia wszystkich nieprzetłumaczalnych ciągów w jednym pliku.
Yoel Gluschnaider
To działa, ale nie sądzę, aby najlepszym sposobem rozwiązania problemu było oznaczenie łańcucha, który można przetłumaczyć jako „niemożliwy do przetłumaczenia”, tylko po to, aby usunąć komunikat o błędzie. Po prostu postanowiliśmy nie tłumaczyć na razie niektórych ciągów. Ale to nie znaczy, że nie można ich przetłumaczyć.
Zili FENG
Chcę umieścić ciąg tylko w jednym języku, a jest to język niemiecki (de) (nie domyślny angielski). Włożyłem go tam i kiedy próbowałem wydać kompilację, dostałem błąd. Co robić w takim przypadku?
Aanal Mehta
228

Jest to ignoreatrybut toolsprzestrzeni nazw w pliku ciągów znaków, jak poniżej:

<?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>
Adil Hussain
źródło
<resources tools: ignore = "MissingTranslation"> daje mi błąd podczas analizowania XML: niepowiązany prefiks
anon58192932
5
To działa dobrze, ale musiałem przejść Project->Cleanostatecznie, aby usunąć błędy.
Xonya
Przynajmniej eclipse nie zmusiło nas do przetłumaczenia wszystkiego, w tym dziwnych folderów z ciągami znaków, takich jak ids.xml i analytics.xml.
Androidcoder,
2
Powinno to być zaakceptowaną odpowiedzią na rozwiązanie wszystkich problemów w zaledwie 2 wierszach kodu.
nhoxbypass
153

Dodaj do build.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}
Żyrafa Lew
źródło
7
Jedyne możliwe rozwiązanie do radzenia sobie z automatycznie generowanymi zasobami ciągów. Dzięki.
SqueezyMo
6
nie, nie powinno, na podstawie pytania: „Nie chcę wyłączać tego sprawdzania w całym projekcie”
Yoel Gluschnaider
@Giraffe Lion powinieneś zamieścić to jako inne pytanie i odpowiedzieć sobie samodzielnie.Dziękuję za rozwiązanie, wcześniej musiałem to wyłączyć ręcznie.
Diljeet
1
To zablokowało całą kontrolę, której należy unikać, jeśli to możliwe. Nie mogę zrozumieć, dlaczego ma tyle głosów.
tasomaniac
23

Znam 3 sposoby:

Aby zastosować wartość modyfikacji według wartości: Ustaw atrybut translatable="false"w <string>definicji:

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

Jeśli masz dużo zasobów, które nie powinny być tłumaczone, możesz umieścić je w pliku o nazwie, donottranslate.xmla lint uzna je wszystkie za nieprzekładalne.

Inny sposób, który odkryłem podczas przeglądania źródeł projektów Hackers Keyboard :
Możesz dodać prefiks donottranslate-do swojego pliku zasobów. Podobnie jak w poprzednim przykładzie, lint weźmie pod uwagę wszystkie z nich zasoby nieprzekładalne.
W twoim przypadku można zastąpić unlocalized-strings.xmlprzez donottranslate-strings.xml. Wygląda na to, że działa, ale nie znalazłem żadnej dokumentacji do tej wskazówki.

Zobacz: Witryna projektu Android Tools: ciągi nieprzekładalne

Cyril Leroux
źródło
Czy to prawda, że ​​jeśli umieścimy nasz ciąg w pliku donottranlate.xml, nie musimy już dodawać translatable="false"tagu?
Yuchen Zhong
Tak. W całym projekcie używam plików donottranslate-strings.xml. Działa w porządku. Spróbuj, to bardzo przydatne!
Cyril Leroux
12

A oto rozwiązanie Android Studio do wyłączania tego krytycznego błędu Lint:

wprowadź opis obrazu tutaj

Dzhuneyt
źródło
2
Może to być irytujący błąd, ale może cię uratować, gdy przypadkowo zapomnisz przetłumaczyć nowy ciąg na jeden z języków aplikacji.
Elad Nava,
2

Myślę, że zamiast wyłączania kłaczków potrzebujesz oznaczyć je atrybutem

translatable="false"
Diego Torres Milano
źródło
2

Utwórz plik zasobów z nazwą pliku zaczynającą się od „ donottranslate ” (np. Donottranslate.xml , donottranslate_urls.xml itp.), A lint całkowicie zignoruje jego ciągi znaków podczas sprawdzania brakujących tłumaczeń.

Kai
źródło
1

Jeśli chcesz wyłączyć sprawdzanie kłaczków w brakującym tłumaczeniu, możesz iść

"Project Properties -> Android Lint Preferences -> Select MissingTranslation -> Swtich To Ignore In Severity",

ma nadzieję, że pomoże to innym, ponieważ właśnie napotykam ten problem :)

hctang
źródło
2
Czy jest na to sposób w Android Studio? Nie mogłem znaleźć ustawień związanych z
lintem
1

Innym sposobem na to jest dodanie swojego ciągu znaków do pliku gradle za pomocą resValuelub buildConfigField. Coś w tym stylu:

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

Zastosowania:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)
heloisasim
źródło
0

Aby uniknąć ostrzeżeń w Android Studio, otwórz Preferencje ==> Inspekcje, odznacz „Niekompletne tłumaczenia”. Ale nie wpłynie to na kompilację Gradle.

Kof
źródło