localization strategy and variables

Aug 26, 2014

I have Update 6: 1407.2208

Part of our localization strategy is as follows, a simple version:

Create a course in Storyline with English content English.story

Make a copy of that .story file; English-copy.story and rename it Spanish.story

Export all text, localize to Spanish, import localized text

Now we have two files: English.story with English content, and Spanish.story with Spanish content

Make a copy of English.story; English-copy.story and rename it MultiLanguage.story

Next, copy the scene with the Spanish screens from Spanish.story into MultiLanguage.story

(We need to have multiple languages in one .story file)

Here’s my problem:

When I localize Spanish.story I also rename all the variables so I have Spanish-specific variables; I need each language to have its own set of variables in the multi-language course.

When I copy the scene with my Spanish slides from Spanish.story into MultiLanguage.story, it not only doesn’t copy in the renamed variables, the Spanish slides are using the original English variables.

Why is this happening? How do I get the Spanish variables to come over with it?

Please watch this video demonstrating: http://screencast.com/t/zVpCos7z

English.story is attached.

Thanks for you help,


40 Replies
Ashley Terwilliger-Pollard

Hi David,

First off, thanks for the great video of the behavior - super helpful to see all the steps you went through and then use that as a base line for trying it on my own.

I took a look at the video, and at first I thought it may be because you copied and pasted the slides in, instead of importing them. So I followed your exact steps and did the import instead - unfortunately the same thing happened.

Next I tried creating a new variable in the "Spanish" project version, and assigned that one to the button and then did the import - that one worked correctly. I've shared this with our QA team as it appears to be a bug in how the variables are retained even though you've modified their name.

I don't have a timeframe to offer in regards to when this issue will be resolved, but I've linked it to this thread so that I'll be able to update you here with any additional information. In the meantime, I'd use a workaround of creating new variables instead of relying on the ones in the original project file.

David Kelling

Thanks for the confirmation on the bug Ashley, and the idea for trying to import instead, which gives the same result.

Super disappointing. Having to manually recreate all the variables is painful enough, but it is multiplied by 5 because you then have to find all the triggers (e.g., if there are on average 5 triggers that use each variable) that use those variables and change them to use the new variable, exacerbated if they are buried in conditions... It is so slick that if you rename the variable all the triggers get updated but alas I can't take advantage of that here.

Rats! If you have any other work-around tips I'd appreciate them but assume not so no further response necessary.

Steve Flowers

Hey David -

Depending on how you're packaging and what types of attached materials come in, you may be able to swap the story contents to another folder with a little JavaScript without interfering with the SCORM API. This would allow you to publish each story individually. One of the problems with publishing multiples in a single file, all of those slides actually load even if they aren't accessed. Hits the bandwidth.

David Kelling

I would greatly appreciate you elaborating; I have no idea what you are getting at. I need multiple languages in one .story file so the LMS can track completion of the course regardless of language viewed in. I have no idea what you are talking about... When you say "publish each story individually" that seems incompatible for my need to have all languages in one .story file... Please elaborate or point me to articles with related information. Please!

I also don't understand what you mean by "slides actually load even if they aren't accessed" given this article: http://www.articulate.com/support/storyline/how-content-is-preloaded-in-storyline so I'd love to hear more on how I'm misinterpreting that. If I have 10 scenes--one for each language--preceded by a single scene with a single language-selection slide, what is going to download? The first 3 slides in each of the 10 scenes? Ok, that would be worst case it seems but it then seems that once I select a language and go into a scene I assume Storyline won't download slides from other scenes because they aren't "next slides." I'd greatly appreciate more insight on this as well.


Steve Flowers

I haven't seen anyone do the first part, but it should be possible.

  • Multiple published outputs.
  • A selection screen for language.
  • A javascript function to push one folder or another of the published assets into the Flash object.

You'd need to do some post publish arrangement but certainly easier than recreating and reconnecting all of your variables.

For the second part, the whole thing loads eventually. Not just the next three slides. Priority is preload for first slide, load for next three slides as the first slide plays, then shuttle in the all of the other stuff.

  1. Assets are loaded for the first slide (or the current slide when resuming), so the course can begin playing right away.
  2. Assets are then loaded for the next three slides to prevent playback delays.
  3. Assets are then loaded for the remainder of the course.
Steve Flowers

Hey David,

This is actually fairly simple but isn't without a drawback. In the attached example, I created two language folders with the LMS publish from each one with the exception of the manifest files. In the base of the directory, I added an index_lms.html file that links to each language. The drawback is the student will have to select their language each time they resume. The upside is that no matter what language they select it will restore to the same location, provided that the published structures are identical.

To do this, I published one of the outputs (you may want to title it in a way that makes sense for the whole course) then published each language to LMS / SCORM.

In my main folder, I deleted the content files leaving these in the base folder:

  • adlcp_rootv1p2.xsd
  • ims_xml.xsd
  • imsp_rootv1p1p2.xsd
  • imsmanifest.xml
  • imsmd_rootv1p2p1.xsd

I created folders for each language in the base folder:

  • English
  • Spanish
  • ...

Then I created a simple HTML file named index_lms.html in the base folder with links to each language and zipped the whole thing with imsmanifest at the base of the zip. The links are simple relative links. These link to the content in the folder and begin the LMS initialization.

In my tests, everything worked well. If your LMS throws errors on a timer if the LMSAPI doesn't initialize it could throw a wrench in the mix. Try a test with the attached SCO to see how it works.

David Kelling

A follow-on question.  I've been using this strategy to build multi-language SCORM packages.  If the original English course has 3 screens, I make a copy of that course and localized to Spanish, create my multi-language SCORM package, launch English, go to screen 2, quit, launch Spanish, I am asked if I want to Resume, I say yes, and I am taken to screen 2, all is well.  I can start in one language and finish in another language.  I've been speculating that it Resumes successfully no matter which language you are in because the suspend data has screen IDs and because one package was a copy of the other it has the same screen IDs so both packages can successfully use/interpret the same suspend data.  So I have a problem if I want a new screen in another language.

Say screen 2 needs to be completely different in Spanish.  1 and 3 are fine, but 2 needs to be completely different. I delete screen 2 in the Spanish version and create a new screen.  I reassemble my mulit-language SCORM package.

I launch English, go to screen 3 and exit. I launch Spanish and am asked if I want to Resume, I say yes and am taken to screen 3.  If I then click PREV (doesn't matter if it is set to go to generic previous screen or if a specific screen is selected in the trigger) not only does it not go to the previous screen, the course freezes.  If I leave off in screen 2 of English, close, launch Spanish, say yes to return to last-visited screen, I get an empty stage and a frozen course.  I assume it is because Storyline is trying to go back to a screen that doesn't exist in the Spanish version.  

I assumed this would work for the following reason:  Push multi-language SCORM packages aside for a moment.  With a normal course SCORM package, 3-screen course: launch, go to screen 2, exit.  Now delete screen 2 from the course, create a new SCORM package and put it in the LMS replacing the old one.  Launch the course and say yes to be taken to last-visited screen which is no longer there. I am taken to screen 3 (which is now the 2nd screen in my course).  It does not freeze, I get a stage of content.  So you can see why I assumed a similar thing would happen in my multi-language package.  I want to understand: why not?

So it seems what I'll have to do is keep the original screen, delete all objects in the screen, build new objects, so I still have that same screen ID.  What I'd really like to understand better is that screen ID concept I made up.  To further complicate things, if the screen has interactivity, like a button with states, under normal circumstances when I go back to the screen it remembers the states because the screen is set to resume saved state.  So it seems I must keep the interactive objects as well.  If I keep the screen and build new objects, will I successfully get back to the screen except it won't know what the last state of the objects was because these objects didn't exist in the other language, or will I get a blank stage again?  You see where I'm going... What exactly do I have to save from the original screen in order for this to work? Just the shell of the screen? Every single object? Only certain kinds of objects?  

Thanks for any insight you can provide.

Steve Flowers

I thought there could be a risk of strangeness. I think there is a slide ID created as the slide is created. So it looks at the index, looks for the unique ID and restores. It looks like it might create those ID's in a unique sequence and not as a completely unique ID. Each object also has a unique ID. So to guarantee restore is clean and consistent, every element needs to be identical from a 

The question I would ask is "what's the risk that a user that starts in one language will want to continue in another language?" If the risk is low, maybe let it ride? If it's medium, you might be able to use another element like the cmi.core.lesson_location to store which language was first selected and automatically forward to the right spot when they restore. I don't believe this element is being used by Storyline but I could be wrong.

David Kelling

Thanks. After much thought and even trying to modify the original screen by keeping the original buttons but only pasting in new pictures and text boxes (it still fails) I'm going to go with "low risk" and "let it ride" for now. A challenge is that we must allow for the possibility that a user selects the wrong language so your idea to store language and send them back to that language can't be utilized.

David Kelling


Got any ideas for equivalent solution in the Tin Can world?  I imagine the user would see a separate course for each language showing up in the AMP library if they launched multiple languages but it would be great if each of those communicated back the exact same result to the LRS so once again you could run one report on the course in the Tin Can LMS and see who completed it regardless of the language they viewed it in...  If the use actually got multiple languages into the AMP library, launching any of them would report back completion status for the same course from the LMS' perspective. Any ideas or hints you have at all might be helpful.  What would be the equivalent in the Tin Can world of putting an intermediate index_lms.html file in front of the multiple, per-language directories with the language chosen on that intermediate index_lms.html file then launching the index_lms.html file inside the language-specific directory as you suggested above in the SCORM world?


David Kelling

Any suggestions? I messed with it for a bit but it wouldn't launch from the iPad.  Need some insight on ioslaunch.html perhaps. I tried leaving tincan.xml in the root and created an intermediate story.html with links to the story.html files inside of the language-specific directories and the LRS accepted the package and launched my story.html file but when it came to ioslaunch.html it failed giving "Cannot access content. AMP cannot access this content" error so messed with ioslaunch.html to try to incorporate the subdirectory into the launch path but don't know what I'm doing instead getting "AMP cannot download the content because one or more files cannot be found" and gave up. Thanks

Olivier Halouze

I read this topic and I'm looking for a solution to do the same with AICC files (not SCORM):
- a launch page with FRENCH or ENGLISH or CHINESE choice for the course
- The choice links to the content in the folder (french, chinese or english = same structure) and begin LMS intitialization
- If you turn back to the launch page and choose another language, it takes you at the same point when you left.
Could you help me please?

Ashley Terwilliger-Pollard

Hi Robert, 

This issue is still with our QA team, so I don't have any updates to share at this time. Currently the workaround is to create all new variables(versus renaming existing ones) and replace them in each instance throughout the module. 

We'll post any updates here if there is additional information to share. 

Ashley Schwartau

Hi there! I need to attempt this method for SCORM 2004 and have a question about which files to delete from each language folder and which files I need to copy over to the main base folder.

The attached image is of all the files that go into the published folder for SCORM 2004. I've highlighted the files you said to delete from this folder and copy into the base folder. 

Are there any others that I need to get rid of / move?



Steve Flowers

Hi Ashley -

 You'll want to move all of these to the root folder along with your index file. Edit the imsmanifest.xml file (or open it up in something like the reload editor) to direct your SCO to your new initial launch file if you change your initial launch file from the default index_lms.html. Otherwise, make your "SCO chooser" and name that index_lms.html.

No need to delete files out of the sub-folders. Most LMS won't care that they're there. You can just leave those in place unless your LMS freaks out (should be rare, most are pretty sensible when it comes to scorm configuration files).

Christie Pollick

Hi, Ashley -- There are no dumb questions, and I'm glad you asked! When you reach out using the 'Contact Me' link on a person's profile, they will either respond here in the thread, or they can reply privately and their response will be sent to your registered email address. Hope that answers your question, and Steve was able to give you the help you needed! :)

Ashley Schwartau

Thank you, Steve! I really appreciate your knowledge and you taking the time to try to help :-D

Sooooo I've done all this - copied those files into the root folder, left the files in each of the sub-folders, and have 13 sub-folders, and made an index_lms.html to launch the different languages based on the one from your original example.

when I test my SCO launcher index_lms.html I get this error:



An error has occurred:

Error - unable to acquire LMS API, content may not play properly and results may not be recorded. Please contact technical support. 

Press 'OK' to view debug information to send to technical support.


Does it look like I'm doing something blatantly wrong? Or is that just because I'm trying to test it locally? Loading it into an LMS might still work?


(Thank you!)