As you translate more and more content, whether it’s strings in an app or text on a website, you’ll encounter content that’s similar to or even the same as what’s been translated before. For example, an app may contain both the phrase “Download file” as well as “Download all files.”
In our new infographic, we explain what Translation Memory is, and how it can help you handle these similar content.
This guide runs you through the basics to set up a PHP development environment for plugin development. Many steps in this guide are intended for Mac OSX systems running WordPress on a virtual Ubuntu server. If you are attempting to follow this on a different platform, the steps might be different.
For starters, let’s download a bunch of things:
- A virtual machine manager: Virtual Box
- A virtual image of WordPress: Bitnami WordPress
- A Git client (there are so many ways to do this, I hope you have one already)
- A PHP IDE (I use Netbeans)
- Firefox Developers Edition + FireFTP (A really great dev tool)
The first task is to get WordPress up and running locally from the image. Following the steps from Bitnami, you should be able to easily import the image.
One key item to note at this point…make sure you are connected to a network with internet access. The VM will setup itself with ‘Bridged’ networking initially, so it needs an external DNS. I’ll address working offline later.
Also reference the following FAQ from Bitnami.
The cloud setup will be slightly different, so be sure you are on the ‘Virtual Appliance’ FAQ.
After you have installed and launched VirtualBox, go to File > Import Appliance, and navigate to the folder of your extracted VM image and import it.
In the next window, allocate at least 2048 MB of RAM.
Next up: starting the VM!
If you get the
WRITE SAME failed. Manually zeroing error, just wait. It will eventually boot to the OS.
Note: If the default login credentials don’t work, try
bitnami for the username and password. Also, if prompted to change the password, change it to whatever you like.
The boilerplate generator will create 2 directories: 1 for your assets which will be displayed on the WordPress plugin page , and another for your plugin. I recommend creating two separate projects for these directories. Right now, we are only focused on the plugin code.
At this point, go ahead and install NetBeans; you’ll also need to set up Firefox with the FireFTP plugin.
We are SO close to being able to do something productive!
Just a few more quick setup tasks:
- Shell into the VM as ‘bitnami’ user (you can use console or set up SSH).
- Enable SSH in the VM
- The VM’s IP address can be found using
- Make a symbolic link to the WordPress plugin directory as it’s somewhat hidden in Bitnami’s special paths.
ln -s /opt/bitnami/apps/wordpress/htdocs/wp-content/plugins/ plugins
- Now, set up your sFTP connection. I recommend just using the IP address displayed on the VM console screen, and the ‘bitnami’ user. (Note: You can create separate users for security purposes…but it’s easy to lose track if you have many vms)
- While still inside the FireFTP console, navigate on the left pane to your boilerplate plugin (WPPB.me) and copy the plugin directory over to the VM.
- Finally! You can now log in to WordPress and activate your plugin! The default WordPress login info is ‘user’ / ‘bitnami’
You’ll need to set up PHPUnit and WP-CLI on the VM.
- WordPress Command Line. Just grab the phar: http://wp-cli.org/.
To install PHPunit:
wget https://phar.phpunit.de/phpunit.phar chmod +x phpunit.phar sudo mv phpunit.phar /usr/local/bin/phpunit
For additional info: https://github.com/sebastianbergmann/phpunit#installation.
To install WP-CLI (similiar to PHPUnit):
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp
For additional info: http://wp-cli.org/.
If you have existing tests…simply go to your plugin directory and run the WP-CLI initialization script:
sudo ./bin/install-wp-tests.sh wordpress_test <mysql root user> <mysql root user password> localhost
Now, if everything is good and the starts aligned for you…simply run:
If you are working on a project that needs tests setup, there’s a few more steps which I’m not going to cover here. Instead, please refer to WP-CLI docs here.
When you are not connected to a network, this setup doesn’t work since the WordPress Virtual Machine can’t get an IP address to support a local connection. In this case, you will need to setup ‘host-only networking’. For Virtual Box, this is fairly straightforward…although you do need to take some extra configuration steps.
Unfortunately, the VirtualBox documentation isn’t completely clear. I’ll break it down quickly here:
- Create the host-only loopback device. The management console will default to ‘vboxnet0′ which is fine. Be sure to turn DHCP server on. This will prevent you from having to change networking on the guest.
- Now you will be able to flip from bridged to host-only in your Virtual Machine’s settings panel.
- Be sure to reboot the VM so that the virtual hardware settings are updated and you will get a new IP address on the virtual machine’s console.
If you found this guide useful, please check out our WordPress plugin that helps you to quickly translate your website or blog: https://wordpress.org/plugins/transifex-live-integration/
When comes to localization, many people don’t know where to start. Publishing and content platforms are not always internationalized – you couldn’t translate your content even if you wanted to. And even if a publishing platform did come with multilingual support, you often had to localize content in roundabout ways; for example, duplicating pages or copy-and-pasting content. This became exponentially more challenging when you have lots of frequently-updated content.
Not fun, to say the least.
Our vision for Transifex Live
By eliminating the need to internationalize code, manage files, and track frequently changing web content, Transifex Live made it possible for anyone to create multilingual sites and reach customers in their native language. Today, we’re excited to take our vision a step further with our Transifex Live integration with WordPress.
Transifex Live Multilingual WordPress Plugin
WordPress is by far the most popular Content Management System out there, owning nearly half of the CMS market . We use it for the Transifex website (product tour, blog, etc.), as do many of our users. But it doesn’t offer multilingual support out-of-the-box .
After seeing several members of our community build Transifex Live plugins for WordPress, we decided to join forces and create an official Transifex Live WordPress plugin. A big thanks to Brian Miyaji from ThemeBoy and Ayebare Mucunguzi from Zanto!
With the plugin, you can:
- Integrate Transifex Live into your WordPress site without modifying any themes or templates.
- Auto-detect the browser locale and load the matching translations, e.g. visitors from France will see your content in French.
- Automatically identify new/updated content and pages on your site.
- Choose where the language selector appears: top left, top right, bottom left, or bottom right corner of your site.
- Customize the language switcher by choosing your own color scheme.
Unlike other existing solutions for translating WordPress sites or blogs, the Transifex Live plugin doesn’t require you to create one language per post, insert language tags manually, or host separate instances for each language. Plus, by using Transifex Live together with the WordPress plugin, you can also use all the other translation and collaboration tools in the Transifex platform, including Translation Memory, Glossary, ordering translations, to name a few.
We didn’t stop after our WordPress plugin. If you go to our documentation, you’ll now find Integration Guides that walk you through how to use Transifex Live to translate content on a number of CMS, documentation, help desk, e-commerce, and blogging platforms. You don’t use only one tool for your company or organization, so we didn’t stop at one integration guide
Currently, there are guides for:
- Help Scout Docs
- Sphinx Documentation
And just like using Transifex Live with WordPress, using Transifex Live with these platforms means there’s no complex system integrations or need to deal with files. You also get the ability to translate in-context and publish translation without waiting for deploys. Best of all, keeping translations up to date is no longer a challenge.
We hope you find the WordPress plugin and Integration Guides helpful in getting started with localizing your web content with Transifex Live. This is just the start!
Today, we’re proud to announce a completely re-vamped version of our Translation Memory (TM) service for all our users. A TM database is a tool used by translators to find similarities between something they are trying to translate, and previous translations. By leveraging previously translated content, translators can speedily and accurately do their job.
So… what’s new with Translation Memory 3.0?
Firstly, we completely re-engineered the way content is stored and the speed in which it’s done. Transifex now presents translation suggestions in real time. This means that if many translators are translating content concurrently, they will immediately see each others’ translations presented as suggestions if they are deemed similar. This is especially handy if you are primarily translating with your user community.
We’ve also significantly improved the accuracy and relevancy of suggestions, regardless of the source language. The following suggestions were derived from the same piece of text, “Project Languages”. Take a look.
As you can see, TM 3.0 is able to provide significantly improved and relevant suggestions. A translator can now completely translate the string using the provided suggestions.
Additionally, the TM now only considers the most recent version of a translation for suggestion.
If you are on the Premium plan or above, you also get access to the following features.
Delete TM suggestions
You can now remove unwanted entries from your Translation Memory by clicking the “x” icon next to a suggestion. Once deleted, a suggestion will no longer be shown for similar translations.
Another way to delete TM suggestions is by navigating to a Project > Manage > Translation Memory. There, you’ll be able to search for a specific term in your source content and see the existing TM entries for strings containing that term. Like before, hit the “x” icon to remove an unwanted entry.
Multiple TM Groups
In the past, an organization was able to only have a single multi-project TM group. Now, you can enjoy multiple TM groups (groups are managed under Dashboard > Settings > Translation Memory). This will improve consistency of translations across projects since translators will get 100% matches from a unified pool of strings.
Note: Those on the Plus plan can still create a single TM group within their organization.
See TM leverage
Just because a file has 750 words, doesn’t mean all of those words need to be translated from scratch. With TM 3.0, you can see reports that show how much of the content being translated matches what’s already been translated before. For example, if 450 out of 750 words in your file has a 94-75% Translation Memory match, then you know translations shouldn’t take as long as translating those 450 words from scratch.
We hope you like the new TM!
In our survey last year, you told us that your biggest challenge with translations was quality and consistency. Well, good news! Our new Integrated Translation Provider service with translation agency e2f addresses both of these issues head on. You get a seamless localization experience that’s built directly into Transifex.
With just a few clicks, you can order high-quality, professional translations from e2f. You have the ability to specify the industry and tone, as well as provide instructions to the translators. All translations are reviewed by professional reviewers before it’s delivered to you.
Translators will leverage your existing Glossary and Translation Memory to ensure your translations are consistent over time, even as more content is being translated. Plus, it drives costs down since fewer words need to be translated once in Translation Memory.
Convenient for you
Translations are done and delivered to you in Transifex. This means you can upload screenshots, answer questions via comments, tag strings, and set character limits for translations. Plus, you can track the progress of translations as it happens.
You also have access to special email support for all your translation-related questions. Billing for your orders is handled directly through Transifex, so you have one less vendor to manage.
Ordering translations is super easy. Just log in to Transifex, click the Order button, and select e2f from the list of vendors to get started!
If you work with a lot of teams and projects in Transifex, we’ve got some great improvements for you that’ll give you more flexibility in structuring your organization.
Project languages are decoupled from teams
With today’s update, languages now work on a project level. Each project has its own set of languages that it’s being translated to. You will still have to assign a project to a team, but teams are simply groups of people who translate to certain languages.
This setup lets you reuse one team across multiple projects, even if each project is being translated to a different set of languages. Here’s a look at the new structure of things:
You’ll find this change reflected in a new “Edit languages” button in the Dashboard and Project Overview page. Hitting that button reveals a popup with a list of the languages that particular project is being translated to. There, you can also add new languages to the project, as well as see the requested languages.
Adding new languages to an existing project
Say you added Greek to your iOS project. If the team assigned to the iOS project doesn’t already have someone translating to Greek, all you have to do is go to the People tab (formerly Teams & Languages) and invite someone to translate to Greek. It’s important to note that this won’t add Greek to the other projects that are assigned to the team, since languages work on a project level.
Creating new projects
When you create a new project, you’ll see that assigning a team and selecting the project’s target language are now two separate steps. If you assign the project to an existing team, all the languages of the team will be added to the project by default. You can still remove languages from the list, or add other ones to the project.
Transferring projects between teams
One great thing about decoupling project languages from teams is that you don’t have to worry about matching languages when transferring a project from one team to another. Simply assign the project to the new team, then invite your collaborators!
Dedicated page for reviewing team join requests
Each team in your organization now has its own page for reviewing and approving join requests. Enter this page by going to the People tab, then clicking the “Pending join requests” link to the right of the team name.
Join requests are split between new and existing languages, then grouped by language. You can even accept or deny requests in bulk!
New “Join team” button on Project Overview Page
In the Project Overview page of public projects, there’s a new Join team button. This makes it easy for translators to request access to a team. In the popup, they’ll be able to specify which language they want to help translate or review.
We hope you like the changes! We’d love to hear your feedback.
A year ago, we partnered with Facebook’s FbStart program to help mobile startups expand globally. In its first year, FbStart gave out over $100 million in benefits to more than 3,800 companies. Hundreds of startups joined Transifex to localize their apps. As year two of the program begins, we’re stoked to share that we’ve been invited to be a partner again.
This time around, there’s a third track in the program – Pre-Launch – for companies that haven’t launched their apps yet. Startups have limited budgets and resources, so we want to make going global not only as easy as possible, but accessible too. It’s because of FbStart that Chromatik was able to localize their sheet-music apps to 8 languages. Check out their story.
If you’re an early-stage mobile startup and want access to Transifex along with other awesome tools such as Workable and Parse, take a look at FbStart and apply!
This post initially appeared on SaaScribe.
For the last few years, I’ve been fortunate enough to have two homes and two “lives”. One is in California, where we’re working primarily on Customers and Growth. The second is with Transifex’s Product & Engineering team in beautiful, sunny Greece.
Which one do I like the most? To be honest, I’m not sure, really. When I’m in the US, I don’t miss Greece, and when I’m in Greece, I’m not in a hurry to return to the US. Living in two countries gives you access to a variety of different activities, personalities and ways to have fun.
As I’m writing this, I’m in Greece. It’s a gorgeous 29°C (84°F) day; I’m working from home, with our cat sitting on my lap. So let’s go through what a typical day looks while in Greece.
It’s a brand new day
Wake-up time is adjusted to the Engineering team’s schedule. You see, in Greece, people go out at 9pm (that’s considered early), so you start the day later too. A typical wake-up time for me is 8am-ish, almost 2 hours later than when I’m in the US.
Checking emails before properly waking up and experiencing a good start to the day is a no-no. The first thing I like to do is to put some fresh, vivid music on the stereo, welcome our cat in the living room and prepare a rich breakfast. Depending on the day that might range from a big jug of mixed fruit juice with delicious cheese and prosciutto on the side, to a good-ol’ eggs-with-5-sides plate. Before leaving for work, I put on my outfit. Typically, it’s a pair of jeans and a shirt with lightweight, cool materials by brands such as Prana or Arc’teryx. Then I check emails and spend 30 minutes answering stuff.
At the Office
During the drive to work, I’ll have a call with friends or family and do some finger exercises, preparing for rock climbing on the weekend.
I arrive at the office around 10:30am. Before even making coffee, I’ll walk around and chat with the people in the office, listening to stories about adorable kids, gym workouts or an amazing gourmet dinner experienced the night before. If I’m lucky, I’m at the office early enough to see Elena from our Customer Success team arrive and say “Good Morning!” with a wide smile and a royal salutation.
Walking around the office is one of my favorite things to do. I’ll openly ask colleagues to tell me what they’re working on and encourage them to get into the details – and I love it when they do the same. If someone is really concentrated, I might walk by and hit random keys on their keyboard.
For the first couple hours of the day, I’ll read articles from other cool, inspiring startups (some of my favorites are Help Scout, Groove and Unbounce). Afterwards, I’ll dive into one of the many things that have been keeping me busy the last couple of weeks:
- I am jumping into planned (and sometimes impromptu) brainstorming sessions with Antoine from Product. Our discussions involve big scribbles on whiteboards that never have enough space and heated discussions about button placements. In these discussions, we’re pulling people in to better understand how a user would interact with a design choice, how it might be implemented and how it’ll scale.
- I am learning how well we’re performing in fields like customer acquisition, customer satisfaction and growth. I do this by first collecting data myself from tools like Mixpanel, KISSmetrics and consolidating in a dashboard and a spreadsheet. When I find something interesting, I’ll go to someone’s desk with my laptop to show them and then we’ll try to refine the data and share them with more people.
- More often than I want to, I deal with paperwork, like documents a bank needs signed and other frustrating items. Oh well… you gotta do what you gotta do.
Our Greek team eats lunch together at 1:30pm. We order food from nearby family-owned restaurants and share salads and pies which people bring from home. Lunch is a sacred part of Greek culture and our team has some of its best moments during our lunch break. Every now and then, we’ll have lunch outside or bring pans of galaktobureko (semolina custard pie in phyllo) and share.
Then it’s foosball time for anyone interested. Things get very noisy.
Second half of the day
During this part of the day, I’m doing a number of things:
- I’m isolating myself from the rest of the gang for 1 to 2 hours every day to focus on strategic stuff. Product positioning, what our users really need and what they’ll need three years from now, and what are the real problems behind the proposed solutions from customers or other companies.
- Growing our team is one of the top recurring items I have in my week – I typically work on this in the afternoons. I’ll invest at least 1 hour every day identifying interesting people. The key questions I ask myself when meeting someone are “Is she a doer?”, “Do we have a lot to learn from her?” and “What would it be like working with her every day for the next 5 years?”
- At around 3pm, I’ll take an afternoon break and make a decaf coffee and eat some apples or bananas.
- At 5pm, our California team wakes up. Late afternoon is reserved for any kind of discussion with our Sales, Marketing and Business Development folks. I’m most often working to remove roadblocks from people’s paths, such as a team waiting for something from another team, a clarification on why we’re not implementing support for Microsoft Office files.
Wrapping up the day
I’m usually back at home at 7:30pm.
On the way back home, I reflect about the day. What went well, what went wrong and how to fix it tomorrow. I also take time to remember all the big things happening in my life other than Transifex: girlfriend, family, friends. Some serious context switching happening there.
After getting home, we’ll cook something, watch a movie with popcorn, hit the gym or play a few games of StarCraft as Zerg. On the weekends, it’s either rock climbing, inviting friends over for barbecue, or a day-long trip to a nearby town or village for some good, local food.
Follow Dimitris on Twitter (@glezos) to keep up with the latest updates and thoughts.
Recently, we added a Social Responsibility section to our website. Before you click on that link, pause and think about what Social Responsibility means to you and why it exists. Then put that into context in terms of tech companies. Here’s our take on it.
It’s easy to argue that tech companies should be giving back to the community. There are plenty of stories that prove it’s been a boom time for the tech sector. Many companies are attracting the best talent, providing enviable work environments, and perhaps most importantly, they are adding value to the communities in which they work in and beyond through their day-to-day operations.
From the outside looking in, life is very good for these companies.
Talk with anyone in the non-profit sector, and the situation isn’t as rosy. They face daily challenges across almost every facet of their organization. Resources are often scarce, appealing to the public for support is never easy in a crowded market, and the nature of their work and the causes they support are more often than not, an endless cycle (alleviating poverty, protecting human rights, etc.). These challenge faced by the non-profits are prime opportunities for companies to help.
Helping looks different for every company. When we came up with our Social Responsibility program, we decided to focus on what we do best. We localize. Our platform helps companies and organizations grow by expanding their presence into new markets. So localizing the websites and expanding the reach of non-profits seemed like the most natural way for us to give back. This became the foundation of our Social Responsibility program: by providing our translation tools, we’re able to support the causes of many non-profits and help them reach a larger audience and connect with people who may not speak English.
Transifex’s own growth came about through the support of other people, organizations, and companies, especially in the Open Source community. We want to do the same for others. If you’re interested, the Social Responsibility section of our website highlights some of the organizations we work with, how we work with them, and why we work with them. Check it out! We’ll be adding more stories as time goes on.
Localization is complicated. There are linguistic issues, technical challenges, formatting problems that will make you crazy. Based on the experience of Transifex users, we have identified 5 best practices that will help you avoid some serious mistakes when localizing software applications. Here they are:
1. Give yourself some room
Did you know that the phrase “Repeat password” is 50% longer in German than in English? This is a real challenge for anyone localizing software. Design is a critical part of a software app. You probably invest as much time and energy in how the app looks as on how it works. Good designers allow room for strings to grow and shrink. Keep in mind that text size will vary across all languages. If you don’t leave yourself some room, localizing into some languages will “break” your design – it will look awkward and have an unnatural feel to it.
You want to allow for a 40% variance in text sizes. This will take care of most strings in most languages, but you will need to test your content and your application to see how it plays out.
2. Never Concatenate Strings
Qualifying one string with another (or combining string in some way) is a shortcut that nobody will notice until your software is localized. But when the translators start working, you’re going to have a big problem. Subtle syntactical differences (where the modifier is placed, for example) change significantly between languages. If not handled properly, you will end up with more bugs than a summer picnic.
The best practice is to code the entire string together and allow your translators to put the words in the correct order for each linguistic context. It’s a bit more work for you up front, but it will definitely pay off in the end.
3. Pay Attention to Punctuation
When you’re coding, you’re in the groove. You want to write strings that you can reuse later – so you leave out the punctuation and plan to add it later. Don’t. Maybe you plan to re-use a string in different context where it might need different punctuation. Don’t do that either.
Always include punctuation in context, and create unique strings for each line of text. Even the same sequence of words may translate differently with different punctuation in different languages. In French, for example, a colon is surrounded by spaces. If you omit the colon in your string, and try to add it later, your French interface will have a typo and your work will look sloppy. Probably not what you had in mind.
4. Give Proper Names Their Due
Depending on the language, the spelling and pronunciation of proper names may change based on how they are used. For example, Joe Smith vs. Smith Joe.
Give extra attention to how you treat names in your software app. It’s best to separate and capture all three main name fields “first”, “last” and “username” for example. This give you the most flexibility to use the names based on both language and context.
5. Use a Universal Format for Date, Time & Currency
Time, date and currency formats vary wildly from country to country. The most commonly know formatting challenge is the month/date/year vs. date/month/year issue. But that’s nothing compared to some of the variations we’ve come across. Think about what day is the first day of the week. Did you know that in Estonia, Saturday is the first day of the week, the US starts on Sunday, the UK on Monday, the Maldives on Friday.
The good news is, you can use the jQuery UI date picker to overcome this challenge. Java can help as well. Code in a universal format like ISO time and then tap an open-source library like Datejs to format for your specific location.
Probably the most important thing to realize when localizing your software application is that doing it manually is out of the question. Not too long ago that’s how it was done. There were lots of spreadsheets tracking what had been translated and what hadn’t, what was updated and what wasn’t. These spreadsheet were sent around via email and were a big hassle to manage. Today with modern localization management platforms like Transifex, all of this (and much more) is managed for you. With any good localization management platform you maintain control of your code and content while greatly improving the efficiency and effectiveness of your localization activities.