Frequently Asked Questions about WebTranslateIt

Translation

Plural Segments and plural forms

Q: I have one and other rules in English, but I can only type other in Chinese. And why so many in Arabic? Could you allow for 1:1 representation of the master language, even if it’s redundant for some languages?

A: This is how plural segments are translated in these languages. In many languages a 1:1 representation doesn’t make sense, as conjugation sometimes differs from one language to another.

The English language has 2 plural forms split into 2 plural categories. The first category one is used when the placeholder is equal to the number 1. The other category other is used when the placeholder is equal to any other number. We represent these plural categories like this:

plural_example:
  one:   "%{count} message"  # 1 message
  other: "%{count} messages" # 1234 messages

Your software’s i18n framework determines which phrase to use depending on the value of the %{count} variable:

0 messages    # uses rule “other” if %{count} == 0
1 message     # uses rule “one” if %{count} == 1
2 messages    # uses rule “other” if %{count} == 2
1234 messages # uses rule “other” if %{count} == 1234

Other languages can have different grammar rules with different, additional or fewer plural forms split into additional or fewer plural categories.

For instance, Ukrainian has 4 plural categories: one, few, many, other:

uk:
  less_than_x_minutes:
    one:   "менше %{count} хвилини"
    few:   "менше %{count} хвилин"
    many:  "менше %{count} хвилин"
    other: "менше %{count} хвилини"

Chinese only has one plural rule: other

zh:
  less_than_x_minutes:
    other: "%{count} 分钟"

It doesn’t make much sense to add a one rule in that case, because the sentence wouldn’t be any different.

Further reading

The save buttons are gone

Q: I can’t seem to be able to save a translation. The “save” and “save and next” buttons don’t appear…

A: The autosave feature was turned on. You can turn it back off in the toolbar located at the bottom of the screen. Learn more about translating using autosave.

Autosave on WebTranslateIt

Getting “You are not authorized to translate this segment” error

Q: I am trying to translate the latest strings, but get a message “You are not authorized to translate this segment”.

A: The error message should be self-explanatory. Permission errors can be due to one of following reasons:

  1. You are currently signed out to WebTranslateIt. You can sign in to WebTranslateIt at this web page: http://webtranslateit.com/en/sign_in
  2. You are not a member of the project you’re trying to translate on. If that’s the case, request an invitation.
  3. You are a member of the project but don’t have the necessary permissions
    1. Are you a translator in the language you’re trying to translate to? If not, request an invitation for this language or change to another language.
    2. If the translation you are trying to edit is proofread, do you have proofreading rights?

Word Count

Q: Can I get a word count of my segments?

A: You will find a selector at the right side of the statistics area on the translation interface. Select “words” to see a word count of the current selection. Click on “characters” to view a character count of the current selection.

Blank and nil values

Q: We need to leave empty strings in some translations but we can’t, it leaves ~ in the yml files and app says “translation missing”. Is there a way we can define a string to be empty?

A: You can make WebTranslateIt output blank strings instead of nil values by flagging the translation as proofread. In WebTranslateIt, a proofread, blank translation is intentionally left blank, whereas a blank, unproofread translation is a translation that wasn’t translated yet.

  • In YAML files blank but proofread translations will be exported as "" instead of ~. Read more
  • In JSON files blank translations will be exported as null, but blank and proofread translations are exported as "".
  • In Microsoft .resx files blank translations are not exported, but blank and proofread translations are exported as "".
  • In Android XML files blank translations are not exported, but blank and proofread translations are exported as "". Read more.
  • In Apple .strings files blank translations are not exported, but blank and proofread translations are exported as "". Read more.

Editing right-to-left text

Q: I have trouble editing translations in Arabic. When I paste a placeholder syntax like الحجز %{user_name} it gets garbled like {count}% immediatly after pasting. How can I type a variable?

A: Here’s a short explanation: when typing a %{count} variable inside a bi-directional text area the operating system is unable to automatically detect the directionality of %{ and assumes it is right-to-left, since the rest of the text is also right-to-left.

In order to prevent this your translators need to input the variables as %{count} and place unicode markers around the variable to indicate its directionality. These unicode markers are the special character U+200E for a LTR run (Left To Right), and U+200F for a RTL run (Right To Left). Right-to-left translators should know how to input and use these characters.

WebTranslateIt makes things a little bit easier for translators: when translating a segment containing a variable, clicking on the suggested variable will paste the variable surrounded by Unicode markers.

Also, WebTranslateIt detects and highlights these usually invisible Unicode markers.

This article on bidirectional text on Wikipedia is also a great source of information.

Translating different segments with the same translation

Q: I have three different segments with keys, but for each of these segments the text is the same: Are you sure you want to disable periodical updates?. Is there any option in WebTranslateIt to just translate this segment once?

A: We don’t have an option or configuration to “link” these segments together that way. However once the first segment will be translated our Translation Memory will provide the translator with a complete match suggestion for the two other translations, so you won’t have to completely translate the same segment 3 times.

You can also run a complete match batch operation to automatically translate these similar segments.

Translating an iPhone and Android app at the same time

Q: I have an “iOS” and an “Android” project. Usually Android and iOS have the same content for many segments. How can I translate them only once?

A: We have 2 solutions for this:

  1. The first solution is to translate one of the projects first and then use its translation memory to run a “translate complete matches” batch operation on the Android project, as explained in the topic Translating different segments with the same translation.
  2. If the contents of the files are identical, then you can use our converter which lets you quickly convert an Apple .strings files into an Android .xml file and vice-versa.

Managing Segments and Files

Import existent translations

Q: What is the correct way to import existent translations? We can’t just add each translation segment manually.

A: Import existent translations by uploading target language files in the File Manager.

By default, the File Manager only lists the master language files, but you can display the target files by clicking on the small arrow next to each master file’s name. There, next to each target file you will find a button to upload an existent target file by clicking on “update”.

If you have a lot of files to sync with WebTranslateIt, you may find useful to use the synchronization tool wti.

Why do segments get obsoleted?

Q: We pushed 3 segments yesterday but today they were marked as obsolete. Any clue why? Either way, we need to mark them as active and have them translated.

Why do segments get marked as obsolete?

Segments don’t become obsolete by themselves. The workflow on your project probably involves several people. Some of them might make changes that you are not aware of, which makes things appear confusing. Things actually are quite simple.

When someone uploads a new version of your file in which a segment that was present in the last version was removed, then this segment will be removed from WebTranslateIt as well. It’s the basis of syncing.

Now, we know that you might need these segments and translations back again in the future, so instead of taking the huge responsibility to delete work we move them in a special trash from which you can recover them at any time. We call this obsoleting segments. Obsoleted segments are hidden to translators, so they can’t be translated.

Lets’s consider this file, at a state we call version 1:

en:
  greetings: "Hello"
  greetings_user: "Hello %{user}"
  messages_count: "You have %{count} messages."

This file was uploaded on WebTranslateIt. Now developers are working on the app and a new version of the file is available and uploaded to WebTranslateIt. We’ll call the version of this file version 2.

en:
  greetings_user: "Hello %{user}"
  messages_count: "You have %{count} messages."
  how_are_things: "How are things?"
  we_missed_you: "We missed you!"

The differences between these 2 versions are the following:

  1. greetings was removed, so WebTranslateIt obsoletes this segment.
  2. greeting_user hasn’t changed, so WebTranslateIt doesn’t change this segment.
  3. messages_count hasn’t changed, so WebTranslateIt doesn’t change this segment.
  4. how_are_things is new. So WebTranslateIt creates this new segment.
  5. we_missed_you is new. So WebTranslateIt creates this new segment.

What happens if someone in your development team accidentally uploads “version 1” to WebTranslateIt again?

If someone uploads version 1 again the system will revert your file to version 1. It will recover your obsoleted segments and obsolete the new segments from version 2.

  1. greetings is made active again along with the translations which were made.
  2. greeting_user hasn’t changed, so WebTranslateIt doesn’t change this segment.
  3. messages_count hasn’t changed, so WebTranslateIt doesn’t change this segment.
  4. how_are_things isn’t present anymore, so WebTranslateIt obsoletes this segment.
  5. we_missed_you isn’t present anymore, so WebTranslateIt obsoletes this segment.

How can I bring back the changes made in “version 2”?

You can bring everything back as of version 2 by uploading the version 2 file to WebTranslateIt again.

Create a segment

Q: Is there any way to create a segment from the web interface?

A: Yep. Project managers can create new segments from the translation interface. This can also be done programmatically from the API.

Rename a key

Q: Is there any way to rename a key from the web interface?

A: Yes, on the segment details window. On a highlighted segment, press the D key to show a segment’s details window. On this window you will find a field to edit your segment’s key.

You can also access this window by clicking on the options button and “Show Details”.

Merging conflicting changes

Q: Here’s our scenario:

  1. We have developers working on new features/changes and they will edit our existing translation files, mainly the master language ones.
  2. Concurrently we have translators working on translations and editing the master language strings as well on the wti site.
  3. The developer now pushes his new version to WebTranslateIt.

A: Dealing with multiple feature branches isn’t usually a problem as long as there are no translations that are modified in both. This isn’t specific to WebTranslateIt since there would already be a conflict with git.

But you will have to pay attention if you update master files both on WebTranslateIt and on git.

What happens to changes that the translators made on wti? Are they preserved? Or overwritten? Or only overwritten, if the same segment has been edited in the file and online?

By default these changes will be overwritten, so what you push to WebTranslateIt will be exactly what you get. Also, already translated text will be flagged as “to verify” (because if the source text was changed, the translations probably have to change too). Also, segments that were removed from your file will be flagged as obsolete.

You have a 3 options to tweak this behaviour. You can choose to:

  1. merge the file,
  2. ignore missing segments,
  3. flag the changes as minor.

These options can be found on the File Manager’s web interface when you update a file by clicking on “advanced options”.

Advanced sync options

These options are also available on the API: https://webtranslateit.com/en/docs/api/file#update-file. These are the merge, ignore_missing and minor_changes options.

And on the wti client as well:

% wti push --help
wti push [filename] - Push master language file(s)
[options] are:
      --locale, -l <s>:   ISO code of locale(s) to push
             --all, -a:   Upload all files
           --force, -f:   Force push (bypass conditional requests to WTI)
    --low-priority, -o:   WTI will process this file with a low priority
           --merge, -m:   Force WTI to merge this file
  --ignore-missing, -i:   Force WTI to not obsolete missing strings
           --minor, -n:   Minor Changes. When pushing a master file, prevents
                          target translations to be flagged as `to_verify`.
       --label, -b <s>:   Apply a label to the changes
      --config, -c <s>:   Path to a configuration file (default: .wti)
            --help, -h:   Show this message

Is there a way to detect and handle the conflicts? What is your suggested workflow?

One way to handle the conflicts is to be aware of the changes that will be pushed to WTI and use the merge or ignore-missing option.

You could also decide to only sync one branch with WebTranslateIt’s master file for instance. This will limit the amount of translation changes pushed, as updates will only be pushed only when they are merged to the master file.

Translators like stability and don’t like to have strings appearing or disappearing while they are translating. Depending on your workflow it could also make sense to have some translation release cycle and an integration branch for translations (which is the only branch you would push to WTI).

Target files naming convention

Q: Our source file is named Radio/en.lproj/Localizable.strings. When I add new language to the project, localizable.strings files are automatically created, but they seem to have the wrong naming convention. For example, if I add Spanish, the file generated is named Radio/en.lproj/Localizable.es.strings

A: The naming system for target files works by substituting your source language code to your target language code on your source file name. The problem you encounter is likely due to the fact that your source file is named Radio/en.lproj/Localizable.strings but your source language is not exactly en, but en-US for instance.

The target file naming system looks for en-US in the source file code, can’t find it and therefore doesn’t replace the en.lproj by es.lproj but instead appends .es before the file extension name.

The automatic file naming convention would work if your source language was named just en or if your source file name was named Radio/en-US.lproj/Localizable.strings.

You have two solutions to fix that:

  1. Rename your source language under the “Language and Stats” tab so the source language code matches the code in your files.
  2. Alternatively you can rename manually your target files on the File Manager.

How to rename files in WebTranslateIt

You can learn more about file naming conventions in the File Manager documentation.

Importing many files

Q: I have a large Java project to upload. It contains about 150 files in 10 languages. Can I upload a zip file?

A: We don’t support uploading zip archives, as WebTranslateIt would have to guess which file is a target file of which. However we do have wti, a powerful tool to sync files with WebTranslateIt.

Once wti is installed, you can add all your master .properties files with:

$ find . -name "*en.properties" | xargs wti add

Now you can upload all your target files with:

$ wti push --all

Now that all your linguistic files are on WebTranslateIt, syncing your files back and forth is only a matter of using wti push and wti pull

Sharing suggestions between projects

Q: We would like to use the translations from our iOS project as a basis for our Android project. Is it possible for WebTranslateIt to use this project for the suggestions?

A: Sure. You will find an option to fine-tune each project’s translation memory in your project settings. For each one of your projects, go into the project settings and click on the “Translation Resources” tab.

Under “Translation Memory”, tick the iOS project to reuse its translations and save. This will make its translations available to your other project’s translation memory.

Convert Android .xml file to iOS .strings

Q: Is there a way to generate both Android and iOS compatible files from the same set of translations? We’re developing an app that has both iOS and Android version and they’re going to have exactly the same text and translations.

A: You can try our converter: http://converter.webtranslateit.com

You can input a Android file and get a compatible iOS file. We might integrate this feature in WebTranslateIt someday.

Sharing a Term Base between projects

Q: I’m building a Term Base, and realizing that I actually need one term base to be shared across the different projects. How can I do that?

A: Share your Term Base with the other projects. You can set this up on each project’s settings. Under the tab “Translation Resources”, choose which Term Base a project will use.

YAML files: “no” imported as “false”?!

Q: Here’s my file:
en:
    gb: "Great Britain"
    fr: "France"
    no: "Norway"
    se: "Sweden"
  
WebTranslateIt imported Norway as “false”. Why?

The good news is that you probably found a bug in your application. In YAML files keys and values can have different types (string, boolean, nil, integer, …). For instance, the number 1 is cast into an Integer and the word false is cast into a boolean.

The YAML specification regarding booleans specifies that words like yes, no, on, off are booleans.

WebTranslateIt use the Psych YAML parser to read your files so when it parses this file the words no and off are interpreted as false and not as "no".

You can easily reproduce this behaviour. Using this YAML file:

en:
  country:
    es: Spain
    no: "Norway (doesn’t work)"
    "no": Norway

Let’s try to load this YAML file using irb:

$ irb
ruby-1.9.3-p247 :001 > require 'yaml'
 => true 
ruby-1.9.3-p247 :002 > YAML.load_file('test.yaml')
 => {"en"=>{"country"=>{"es"=>"Spain", false=>"Norway (doesn’t work)", "no"=>"Norway"}}} 

The no key is interpreted as false by Ruby. In order for you to use the no key for Norway in your app, you’ll have to rename your key in your file to "no", so it can be cast as a string instead of as a boolean.

Once this is done, upload your language file to WebTranslateIt again, and the no key should appear, instead of false.

API: “Master File is already queued for import” or “File is being processed at the moment” error messages

Q: Why do I get a File is being processed at the moment error message?

A: Your file is currently being imported. You can’t update a file that is currently being imported. Try this request later.

Q: I pushed all my files and got many Master File is already queued for import error messages. What’s wrong?

A: You get this error message when you push a target file for which the master file is being imported or queued for import. Try this request later.

WebTranslateIt prevents you from doing so because it can cause synchronization issues. Let’s consider the following scenario:

  1. A Master File is pushed to WebTranslateIt. This push adds 1 segment and removes 1 segment. Because WebTranslateIt syncs your target files for you it also changes your target files and adds 1 segment and removes 1 segment in all your target files.
  2. At the same time you push your target files as well. This push changes a few translations. Since file imports go through an asynchronous queue, your master file may still be importing, and the syncing on your target files may overwrite or conflict your target files.

Searching for segments having many labels

Q: Is it possible to either search or filter segments by more than one label. For example if I have a label “video” and a label “page_name” on a section, can I isolate those?

A: We don’t have a UI for it yet, but you can now modify the URL in the translation interface to pass an array of labels.

Here’s an example: https://webtranslateit.com/en/projects/406-WebTranslateIt/locales/en..en/strings?&label=[label+1,label+2]

This will list the segments having the labels label 1 AND label 2.

You can pass as many labels as you want. They need to be URL-encoded and separated by a comma.

Accounts and Billing

How do I change my credit card used to pay for billing

Q: I would like to change the credit card used for billing but can’t find where to do that.

A: It depends on whether you have subscribed directly using your credit card or using PayPal.

If your WebTranslateIt subscription is paid by card

On your organization page click on the “Edit account information” tab and then on the “Card on File” tab. There you will be able to change the card we charge for your subscription.

If you do not see the “Card on File” tab it means your subscription isn’t paid by card but via PayPal.

If your WebTranslateIt subscription is paid via PayPal

You will have to change your card on file directly on PayPal’s website. Follow these instructions:

  1. Go to www.paypal.com and log in to your account.
  2. Click “Profile” near the top of the page.
  3. Click “My money”.
  4. Click “Update” beside “Debit and credit cards”.
  5. Click “Edit” next to the card you want to change.
  6. Update your information.
  7. Enter your card security code.
  8. Click “Save”.

Move a project to another account

Q: We’ve created a project for a customer in our account. Is it possible to move that project to a seperate account?

A: Please send us an e-mail including the following information and we’ll move the project for you:

  • The project ID
  • The organization ID you’re moving the project from
  • The organization ID you’re moving the project to.

Use another e-mail address for billing

Q: Is it possible to receive our monthly invoices and receipts update at another email address?

A: Sure. Head over to your organization page. Click on “Change your account name”. On this page you will find an option named “email address for invoices” that lets you enter the e-mail address of your financial department for instance. This e-mail address will be used to send:

  • Payments receipts
  • Invoices
  • Notifications about unpaid invoices.

Note that several email addresses can be entered in this field (separated by commas) if you wish to have several recipients for all emails regarding billing.

How do I delete my user account?

Q: I joined a translation project but I would like to delete my user account.

A: We’re sorry to see you go! :( You can delete your user account on the Settings page.

Hosting and Security

Q: Is your system running on a cloud or another architecture? And in which country is it based?

A: WebTranslateIt uses 2 dedicated servers hosted by Leaseweb in Amsterdam, Netherlands. One of the servers replicates the main database in real time and is ready to take the service over if the main server fails.

Q: What security level and procedures do you have in place to protect your customers’ information?

A: WebTranslateIt’s service is reliable and secure. Here’s a basic checklist of the security level and procedures:

  1. All connections to WebTranslateIt are served with HTTPS. It means the transfer of webpages between WebTranslateIt’s server and your web browser is encrypted to prevent eavesdropping. This is the same level of security as online banking. You can check the status of the HTTPS connection with any web browser.

  1. Cookies used by WebTranslateIt to store the user session are secure and are only sent over encrypted connections. This prevents session highjacking.

  1. User passwords are encrypted using bcrypt.

  2. Our server is regularly updated with the latest security patches and is hosted at a very dependable hosting company.

  3. All our servers are based in Europe.

  4. WebTranslateIt’s database is replicated in real time to a secondary dedicated server. The data transfer between these servers is encrypted with SSL.

  5. Database dumps are backed up 4 times a day and transferred to a third server via SCP, an encrypted protocol. We test these database dumps daily.

  6. An incremental backup of the language files is done every 5 minutes to a server. Transfers are encrypted via SSL.