I'd like to use a Ruby based script to go through the strings.xml file in Android to update certain values.
For example:
This is the original xml file
<resources>
<string name="accounts">accounts</string>
</resources>
I want it to become this after running the ruby script:
<resources>
<string name="accounts">my accounts</string>
</resources>
I'm completely new to ruby, but I was able to get it to read a xml file....just not sure how to update the values.
(In case you are wondering, I'm doing this so I can white-label my app and sell it to businesses. This will help speed up the process a lot.)
I found a way to do it.
require 'rubygems'
require 'nokogiri'
#opens the xml file
io = File.open('/path/to/my/strings.xml', 'r')
doc = Nokogiri::XML(io)
io.close
#this line looks for something like this: "<string name="nameOfStringAttribute">myString</string>"
doc.search("//string[#name='nameOfStringAttribute']").each do |string|
#this line updates the string value
string.content = "new Text -- IT WORKED!!!!"
#this section writes back to the original file
output = File.open('/path/to/my/strings.xml', "w")
output << doc
output.close
end
Be warned, if you are using the resources from the strings.xml file from the android code, using the R.string class, then modifying the XML externally will not work.
The R.string class is created when you compile your application, so if you modify the XML file after compilation, the changes will not take effect in your application.
Super helpful! For posterity's sake...I opted for:
doc = Nokogiri::XML(File.open('path_to/strings.xml')))
doc.search("//string[#name='my_string_attribute']").first.content = "my new string value"
File.open('path_to/strings.xml', 'w') { |f| f.print(doc.to_xml) }
That works well when your string key (name) is unique (which Android Studio enforces so you can trust that they will be). You can throw as many string edits in the middle there and then save the changes without worrying about messing up any other values.
Related
Hi Guys so I am trying to create a single xml file from many strings xml file i have in my android gradle project this is done for some automation as the the tool can only single file hence I am trying to add all strings into a single xml for this purpose,This is how I am trying to achieve it
Copy and rename the main string file as needed like this
task copyMain(type: Copy){
from ("$rootDir/service/src/main/res/values/")
into ("$rootDir/main_build/")
include ('strings.xml')
rename {String fileName -> fileName.replace("strings.xml","strings_service.xml")}
doLast{
println("copying strings_service.xml from values to main_build is complete");
}
}
Now I want to read each of the smaller strings.xml files and append the entry into the "/main_build/strings_service.xml"
Here but i am able to read the attributes of each strings but not the actual value
Sample strings xml
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="auto_classify_hint_message" comment="Frequent drive hint message; no plurals as prompt always requires several drives" tools:ignore="PluralsCandidate">You have classified %1$d other drives like this<br>as <b>%2$s</b>.</string>
</resources>
These are the ways i try to read.
def stringXml = new XmlParser().parse("$rootDir//src/main/res/values/strings_hints.xml")
stringXml.'string'.each{ s ->
println("line:"+s+"\n");
println("name:"+s.#name+"\n");
println("comment:"+s.#comment+"\n");
println("tools1:"+s."{http://schemas.android.com/tools}ignore"+"\n")
println("tools2:"+s.#tools:ignore+"\n")
println("tools3:"+s.'tools:ignore'+"\n")
println("val1:"+s.value[0]+"\n");
println("val2:"+s#value+"\n");
println("val3:"+s.value+"\n");
println("\n");
}
The console output looks like this
line:string[attributes={name=auto_classify_hint_message, comment=Frequent drive hint message; no plurals as prompt always requires several drives, {http://schemas.android.com/tools}ignore=PluralsCandidate}; value=[You have classified %1$d other drives like this<br>as <b>%2$s</b>.]]
name:auto_classify_hint_message
comment:Frequent drive hint message; no plurals as prompt always requires several drives
tools1:[]
tools2:null
tools3:[]
val1:null
val2:null
val3:[]
How do i do the following
read the "value" and "tools:ignore" attribute it seem that in compile time the tools get replaced by hyperlink (check println "line" in console) which is i dont want to . I just want to copy each row of <string> </string> from each of the string xml
and append each such row into "strings_service.xml" under the <resources> </resources> tag
I use Android Studio in app development. I want to translate strings by exporting/importing the Android language resources (strings.xml) to Excel file (xlsx). What is the best way to do it?
If anyone else needed the answer,
from res -> strings -> right click-> Open Translations Editor. Select data/variable you need then copy and paste data from Translations Editor to excel . done.
Since CTRL+A not working now in the android studio.
There is one way to convert the android strings file to CSV and then translate it with the help of google translator and then again convert back to XML.
https://www.skydevelopers.net/blog/2-best-ways-to-translate-the-android-strings-file/
here is a blog in detail
Export Strings resource file to csv
Get its content translated(probably from google translate)
convert back the Translated file to Strings.xml(android string resource file)
I used http://convertcsv.com/csv-to-xml.htm this website for converting csv file to strings resource file
need to mention Custom output template to convert it to strings resource file
<string name="{f1}">{f2}</string>
put this in template section provided
website also displays the desired converted output file
As many others pointed out, pressing Ctrl+A in the Translations Editor doesn't work since Android Studio 3.2
I work for a company that outsources translations constantly, so we need to convert android strings to and from xls files.
The only solution that worked for us reliably is this fork of the older android-lang-tool. Just build with maven and run the jar.
It exports strings, string-arrays, plurals and their key-values to an xls file. It even exports the comments.
I would suggest the best tool for android app string localization is the Translations Editor that is inbuilt into Android Studio.
The reason this is a great approach is you are able to make the process both easier for translators and less prone to errors. The XML string files in Android Studio support XLIFF notations that are a standardized method to aid string localization.
By utilizing XLIFF notation in your XML string files you can do the following to help the translators:
Provide additional context for declared strings
Mark message parts that should not be translated
To use XLIFF in your Android string XML files you need to include the XLIFF 1.2 namespace:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
Here are a few examples of strings from the android localization documentation:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Example placeholder for a special unicode symbol -->
<string name="star_rating">Check out our 5
<xliff:g id="star">\u2605</xliff:g>
</string>
<!-- Example placeholder for a for a URL -->
<string name="app_homeurl">
Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g>
</string>
<!-- Example placeholder for a name -->
<string name="prod_name">
Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
</string>
<!-- Example placeholder for a literal -->
<string name="promo_message">
Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>” to get a discount.
</string>
</resources>
To access the Translations Editor in Android Studio, select Open Translations Editor from the context menu for your XML string file (ie. strings.xml) in your project tree (see below).
Convert your strings.xml to csv xml-to-csv
Import to Google Sheets
Translate using the formula =GOOGLETRANSLATE(B2, "auto", "de")
Generate output in another column using =CONCATENATE("<string name=",char(34),A2,char(34),">",C2,"</string>") where A2 is the resource_ID and C2 is the translated string
Copy the whole output column and paste inside the <resource>...</resource> tag
As Saad Mahmud answered, you can copy from the translation editor (ctrl+a ctrl+c) and then paste into a spreadsheet.
You can copy it back from a spreadsheet to the translation editor by only copying the "default value" and other languages columns, click on the topmost default value and paste (ctrl+v).
It also works with subsets (both subsets of rows and columns), as long as they are next to each other.
Be aware that empty cells in the spreadsheet will not blank out the translation in the editor, it will leave the current untouched.
Also be careful that you haven't added or removed any translation keys since the spreadsheet was created...
Export or copy to excel only supported in Windows PC.
Still not yet in MAC
As many others pointed out, you can't simply copy and paste translations from and into Translations Editor since Android Studio 3.2.
The simplest solution I found was saving the Excel file with translations as CSV file and then converting it to XML with regex and vice versa.
To "import" translations the steps:
Save xls/xlsx file with key in first column and translation in second column as CSV file (If you have file with non-ANSI caracters use Google sheets, because Excel doesn't support saving in CSV using utf-8)
Open csv file in text editor which supports "find and replace" with regex (eg. Notepad++)
Open "find and replace" and set regex search
Search ^([^,]*),(.*)$ and replace it with <string name="$1">$2</string>
Copy file to string resources file between tag
Fix possible mistakes
You can use similar method in reverse for "export". Use <string.+name="(.*)".*>(.*)</string> for finding and $1,$2 for replacing. But it only works if every string tag in in one line.
NOTE: If your res folder doesn't contians strings.xml then Android Studio won't show "Open Editor" in top right corner of the strings.xml file(Open the file). In my case all my string res files are named like strings_feature.xml
To copy/paste from Translations Editor use Android Studio 3.2 Version and below. It allows copy/paste of full column.
I have two string xml for two different languages, I would like to know the different between those xml files.
For example, there is one xml for English,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Keep Accounts</string>
<string name="insertNewOne">Insert Accounts</string>
<string name="browseRecord">Browse Records</string>
<string name="set">Setting</string>
</resources>
And another xml for other language,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Example</string>
<string name="insertNewOne">Example</string>
<string name="browseRecord">Example</string>
<string name="dateNoColon">Example</string>
</resources>
We can see the difference is xml for English has element string name="set", and the other has not. On the other hand, the xml file for other language has element string name="dateNoColon" but the xml for English has not.
In this case, I would like to know the English xml lacks the element string name="dateNoColon", and other xml lacks the element string name="set".
Android Studio has translations editor starting of 0.8.12 version. You can find there missing translation strings.
You can enable check for missing translations in Lint tool. There are "Missing translation" and "Extra translation" checks.
Extra translation If a string appears in a specific language translation file, but there is no corresponding string in the default locale, then this string is probably unused. (It's technically possible that your application is only intended to run in a specific locale, but it's still a good idea to provide a fallback.).
Incomplete translation If an application has more than one locale, then all the strings declared in one language should also be translated in all other languages.
Suppose if the device is set to Other language, Android will look for title in the otherlanguage.xml file in value folder. But if no such string is included in that file, Android will fall back to the default, and will load title in English from the english.xml file.
For more detail go to http://developer.android.com/guide/topics/resources/localization.html#using-framework
I wrote a small tool for that: resdiff.
Check it out! https://github.com/danijoo/resdiff
Try sorting both files using some perl or bash script or something like that for example, using bash:
sort temp.txt -o temp.txt
and then look at the diff for example using DiffMergeit.
Use Android Lint to find both incomplete translations i.e. strings missing in a language variant and extra translations i.e. strings introduced in a language variant but missing in the default locale.
In Android Studio you can run Lint (and some other analysis tools) with Analyze -> Inspect Code.
I wrote a big app with thousands of string in the code.... very bad idea, because now I want to translate each string.... big problem.
Copying all strings to the strings.xml takes a long time.
Eclipse has an option to take all selected strings and put them into messages.properties.
Does this work similiar like strings.xml? When, why all people use strings.xml.
Or should is use eclipse to seperate each string and than I should copy them to string.xml?
All people are using strings.xml because this is the normal way to do it on Android. You don't have to manage the load of the strings, to call any locale function in your script.
You can see the documentation here : http://developer.android.com/guide/topics/resources/index.html
BTW, you can easily transform your eclipse generated file to an strings.xml file after the extraction.
In Eclipse you can use the shortcut keys Alt + Shift A, S to extract an inline string in to the strings.xml file via a popup dialog - might be a bit easier than doing it by hand. And as the others say, yes you should ALWAYS use the strings.xml file so that you only have to look in one place when you want to change a string, instead of having to search through all your code.
How to implement Android system l10n ?It has been l10n in German.What is different between Android and Linux in realizing system localization?
What is Operational process of implementing Android l10n ?
What is needed to implement Android system localization? such as Unicode UTF8, charset,other anything else?
Are you asking about internationalization/localization? If so there's a pretty extensive writeup in the docs.
Localization in Android is a native function, what you have to understand is how to "tell android" where to pick the words translated based on the Language that is set on the device that is running your application.
1. When developing an application for Android avoid "hardcoding" the string values and always use the strings.xml file located in the res/values folder. In that file enter every string used in your application using the tag:
<string name="app_title">Super App</string>
2. From the java side use this string resources from anywhere with the method getString(), this method receives as parameter the id of the item you want to get:
getString(R.string.app_title)
3. Once you have defined every string your app will use, just copy the strings.xml file and paste it in a new folder at the same level of the res/values folder but name it according to the new language you want to add (Read this)
4. Finally, translate every string in each folder to the proper language but keeping the same ids of every string, just changing its content:
res/values-EN/strings.xml
<string name="app_title">Best Application Ever!</string>
res/values-ES/strings.xml
<string name="app_title">La Mejor Aplicación!</string>
res/values-FR/strings.xml
<string name="app_title">Meilleure Application Jamais!</string>