Custom localization system for your iphone games

__________

Localizating your application is crucial if you want to reach a broader audience, imaging how a Spanish or German kid will react if the game they try to play is in english or french, they just won't buy your game.

The iphone SDK has it's own localization system, which works very well, but as you may know the default localization system does not allow you to change the language in run-time, just use the OS default system, and it also does not allow other languages beyond what's defined on the iphone OS. So, if you want to change the language from a menu in your game there are many things you can do:
  • write your own system, which is utterly boring and implies parsing your language files, or...
  • overload and use what the framework has to offer.
This post tries to explain, first, how to the new localization system works, and second how to add localization to your system and how to use it to change the language in run-time.

Note: Although it is used for games it might be used for your own applications as well.

How the new system works

a. The iphone SDK way

The iphone SDK provides the NSLocalizableString("tag", "alternative") macro to obtain the localized string, from the Localizable.strings, for the given "tag" string or in case it didn't find a proper match it returns the "alternative" string.

I'll explain in the Implementation section how to build the Localizable.strings, just know that it has a strings in the format:
"tag" = "Localized text for the tag";
E.g.
NSString *localizedStr = NSLocalizableString(@"hello", @"Hello World");
//IF it finds the "hello" tag on the localizable.strings for the current OS language it will return the localized string.
//ELSE will return "Hello World"
b. The new way

With adding the LocalizationSystem.h and LcalizationSystem.m you add the following functionality to the default system.
  • you'll be fully compatible with what was already done.
  • you'll be able to change the language in run-time
  • you'll be able to support languages not added in the iphone OS implementation, like Esperanto, Catalá, Elfic,...
Using it:

It's usage is fairly simple, there has been defined 4 macros that extends the default functionality. These macros are:

1. LocalizationSetLanguage("language")
Using the following macro you'll be able to change the localization default language into the language you want.
// Sets the desired language of the ones you have.
// example calls:
// LocalizationSetLanguage(@"Italian");
// LocalizationSetLanguage(@"German");
// LocalizationSetLanguage(@"Spanish");
//
// If this function is not called it will use the default OS language.
// If the language does not exists y returns the default OS language.
- (void) setLanguage:(NSString*) l{
NSLog(@"preferredLang: %@", l);

NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];

if (path == nil)
//in case the language does not exists
[self resetLocalization];
else
bundle = [[NSBundle bundleWithPath:path] retain];
}
The "language" string should match what you have on you Localizable.strings file

2. AMLocalizedString("tag", "alternative")
Gets the Localized string:
// Gets the current localized string as in NSLocalizedString.
//
// example calls:
// AMLocalizedString(@"Text to localize",@"Alternative text, in case hte other is not find");
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment
{
return [bundle localizedStringForKey:key value:comment table:nil];
}
The AMLocalizedString works just the same way as the NSLocalizedString.

3. LocalizationReset;
Resets all settings, in case you'll allow your user to leave the language settings as default.
// Resets the localization system, so it uses the OS default language.
//
// example call:
// LocalizationReset;
- (void) resetLocalization
{
bundle = [NSBundle mainBundle];
}
4. LocalizationGetLanguage;
Gets the current set language.
// Just gets the current setted up language.
// returns "es","fr",...
//
// example call:
// NSString * currentL = LocalizationGetLanguage;
- (NSString*) getLanguage{

NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];

NSString *preferredLang = [languages objectAtIndex:0];

return preferredLang;
}

Implementation

Step 1. Creating the project

I'll use a Cocos2d 0.99.0 project as I wanted to demonstrate the system on games, but you'll be able to create the project better suits your application.

Step 2. Add localization to your project

To do so, you'll need to:
  1. in resources group within your project, right click add... -> New File
  2. I'll appear a window like the following. Go to Mac OS X -> Resources and select Strings File. Name your file "Localizable.string".
At this point you have added the localization file to you project, now open the information of the file (right click -> Get Info / cmd + i), and on the General tab press the Make File Localizable. You will get this as a result.

Now its time to add the localization you want.
tip: Name it as the language name in english. e.g "spanish", "french", "german",...

Step 3. Add the text.

Now open each of the files to add the text you want to localize, remember the format. Do it in the desired language file.

"tag" = "localized text";
"hello" = "HOLA MUNDO";
Add this point is exactly as if you were adding normal localization.

Step 4. Add the new localizatio file to your project.

You have to add the LocalizationSystem.h and LocalizationSystem.m to your project.

This can be done in two ways.
  1. Right click -> Add existing files... wherever you want to add the files, select them and click ok.
  2. You can darg from the sample project the group containing both files to your project.
Step 5. Just use the library.

1. Add
#import "LocalizationSystem.h"
In the classes that need localization,

2. Use AMLocalizableString instead of NSLocalizableString.

3. Use LocalizationSetLanguage to change the language.
LocalizationSetLanguage(@"Spanish");
CCLabel* label = [CCLabel labelWithString:AMLocalizedString(@"hello",@"Hello World") fontName:@"Marker Felt" fontSize:32];
The label will contain "Hola mundo".

Download

You can download a sample project with everything on it.
It consist of a clean project, just to be as familiar as possible, with the library added.

that will run as:

Each button represents a language added and OS, returns to the OS default language.

The files:
LocalizationSystem.h
LocalizationSystem.m

The sample project
Test project

If anyone has any suggestion or question leave it in the comments. I'll be glad to answer.
Thank you for reading.

363 comments:

«Oldest   ‹Older   1 – 200 of 363   Newer›   Newest»
Daria said...

Do you by any chance know what exactly is going on with localizable.strings? when are they loaded? are they kept in memory all the time? I have a large localizable.strings file and I'm trying to find the way to improve startup time. thanks in advance

Anderson Tagata said...

In your tutorial, you made a little mistake...
Should change NSLocalizedString to AMLocalizedString, you said:
2. Use AMLocalizableString instead of NSLocalizableString.

Nice post! Thanks

Bart said...

VERY very helpful. Kudos for putting this out there, and explaining it so well.

Zaur Amikishiyev said...

Juan Albero,

In the following code what is the meaning of [[self alloc] init]?

+ (LocalizationSystem *)sharedLocalSystem
{
@synchronized([LocalizationSystem class])
{
if (!_sharedLocalSystem){
[[self alloc] init];
}
return _sharedLocalSystem;
}
// to avoid compiler warning
return nil;
}

Alex Szilagyi said...

Can anyone provide me a tip how to implement this way for many text labels? Do I have to create a method for my each label?

Dan said...

Thanks Reuben.

I added following macro to help get localized images...

LocalizationSystem.h
---
#define AMLocalizedImagePath(imagename, imagetype) \
[[LocalizationSystem sharedLocalSystem] localizedImagePathForImg:(imagename) type:(imagetype)]

.
.
.

- (NSString *)localizedImagePathForImg:(NSString *)imagename type:(NSString *)imagetype;
---


LocalizationSystem.m
---

- (NSString *)localizedImagePathForImg:(NSString *)imagename type:(NSString *)imagetype
{
NSString * imgPath = [bundle pathForResource:imagename ofType:imagetype];

//NSLog(@"Returning imagePath:%@",imgPath);

return imgPath;
}

-----


Changing images after setting new language:
------------
UIImage *img = [[UIImage alloc] initWithContentsOfFile:AMLocalizedImagePath(@"app_logo", @"png")];

self.appLogo.image = img;

-------------

Dan said...

I could be wrong, but

"LocalizationGetLanguage" does not work.
it returns selected language on the device, no app selected language..

Alex Szilagyi said...

The same issue that @Dan has, anyone fixed it?

Alex Szilagyi said...

Update: Actually I'm using LocalizationSetLanguage(@"LanguageName"); but it gets the default one...

ezod said...

@Dan, @Alex:

I just put the following line at the end of method "- (void) setLanguage:(NSString*) l" :

[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:l, nil] forKey:@"AppleLanguages"];

This will simply overwrite the "AppleLanguages" Array and will contain only the preferred language.

(Works for me ;))

Ivan Vučica said...

You probably refer to NSLocalizedString, not NSLocalizableString. The second argument of this macro is not the alternative, but the explanation which'll be written out in the autogenerated .strings file(s).

Quang Thanh Le said...

Hi guys,
What is license for these files?

what does "Copyright Aggressive Mediocrity 2010. All rights reserved." mean?

Vyacheslav Khlichkin said...

Could you help me please: after adding two files (LocalizationSystem.m/.h) into my project comlier return me this stuff:

Ld /Users/iMac/Library/Developer/Xcode/DerivedData/Tale-evnomempxsbnpacapbyygvatjzig/Build/Products/Debug-iphonesimulator/Tale.app/Tale normal i386
cd /Users/iMac/projects/Cocos2D/Tale
setenv IPHONEOS_DEPLOYMENT_TARGET 6.0
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk -L/Users/iMac/Library/Developer/Xcode/DerivedData/Tale-evnomempxsbnpacapbyygvatjzig/Build/Products/Debug-iphonesimulator -F/Users/iMac/Library/Developer/Xcode/DerivedData/Tale-evnomempxsbnpacapbyygvatjzig/Build/Products/Debug-iphonesimulator -filelist /Users/iMac/Library/Developer/Xcode/DerivedData/Tale-evnomempxsbnpacapbyygvatjzig/Build/Intermediates/Tale.build/Debug-iphonesimulator/Tale.build/Objects-normal/i386/Tale.LinkFileList -Xlinker -objc_abi_version -Xlinker 2 -lz -Xlinker -no_implicit_dylibs -fobjc-link-runtime -mios-simulator-version-min=6.0 -framework QuartzCore -framework OpenGLES -framework OpenAL -framework AudioToolbox -framework AVFoundation -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/iMac/Library/Developer/Xcode/DerivedData/Tale-evnomempxsbnpacapbyygvatjzig/Build/Products/Debug-iphonesimulator/Tale.app/Tale

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_LocalizationSystem", referenced from:
objc-class-ref in MainMenuLayer.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status


(null): "_OBJC_CLASS_$_LocalizationSystem", referenced from:

(null): Objc-class-ref in MainMenuLayer.o

(null): Symbol(s) not found for architecture i386

(null): Collect2: ld returned 1 exit status



what should i correct? thank you

ps im newbie )

Vyacheslav Khlichkin said...

I solved the problem ) that was caused of manually adding files to project

Joan Albero said...

Hello. As commented before "LocalizationGetLanguage" may not work.

I haven't tried this in a long time and may have change since I first wrote the code with iOS 3.X and now we are 3 major updates later.

Glad is helping people.

mahmoud helaly said...

Hello,

I finished all the tutorial steps but still the app get the operating system (iPad OS) not the language which set on my code

Hire iPhone Application Developers said...

Thanks for share it. I got some important points which will help to me in future so thanks again.

Hire iPhone Game Developer

jems said...

You can download a sample project with everything on it.
It consist of a clean project, just to be as familiar as possible, with the library added. coque iphone 4

Warren Santos said...

I am very thankful to all your team for sharing such inspirational information.
backup extractor for iphone

hafiz asim said...

I want to find the paid directory submission service ,which can make strategical internet business project, based on directory submission. I strive to win my web contest.
www.edupolicies.com

hafiz asim said...

No one in the world is able to aid you with papers completing better than famous writing service can do. Hence, that is ok if you buy essay papers "bestcustompapers.com" from the reliable custom company.
www.nationalacademiespress.com

alfred said...

eep your iPhone away from things that can scratch it. If you are going to put it in your pocket or purse, don't put it in the same place you keep your keys or your change, as either one is likely to scratch it.

E_Cell

Mickey James said...

I’m flattened by your contents keep up the excellent work.
recipes and soup

chris.hoefle said...

Thank you so much for your description. I struggled with this, and your solution was my rescue. I modified your code slighly for my needings, if anyone is interessted please get in touch.

Ning said...

great post! helps me understand how the bundle works. I added a method to get the static "bundle" from "LocalizationSystem.h and m", so I can load my localized html files and images. Thanks again!

david said...

I was reading this post.It is very interesting and I hope you will be sharing more informative post in future.Thanks


iPhone Games

Pedro Viana said...

AWESOME!

Richard Cooke said...

Your writings, articles, blogs I mean over all contents is must read matter. Ur Hun Website

boris baker said...

Never found such informative articles
Look for Rainbow Systems Here

Sir Ward said...

I Never ever found such edifying blogs.
Relationship with Milvia Design

liyan gong said...
This comment has been removed by the author.
liyan gong said...

Thank you very much for sharing this great information. It works.
iPhone photo recovery
iPhone contact recovery

amber2012 said...

Excellent!!works just fine!!- iPhone Data Recovery

vey smith said...

Very classic blogs I’ve never seen to any site. Relationship Issues With Leonardo Spencer

Peggy Stoffel said...

I'm confident that once you read this again you come to read these articles and blogs.
Go to Camome

dadetao said...

These look amazing!!!
extract iPhone backup
iPhone backup extractor

iram akram said...

Hey my friends I tell you some tips about Be very careful with the timing of your nitrous. Generally speaking, it's a little wasted while you're shifting up the first couple of gears. We found the best time to activate it is after you've shifted up twice at the earliest. Make sure that you're not about to hit a drift section though, otherwise you'll waste this very useful boost.
RPG Finder

betty kelly said...

I think this is the best blog I have been through all this day. online payday loan lenders

Raul Wint said...

Provided blogs and articles looking very supportive for us. ppi

hazel Blossom said...

This is blog looking and information is very nice. I am very thankful to all your team for sharing such inspirational information. definition essay writing

Jony Willison said...

Unfortunately, iPhone doesn't have a trash bin in which your can recover deleted photos from iPhone. If you accidently delete photos on your iPhone, you may meet iPhone Photo Recovery to restore deleted photos from iPhone.

iPhone Photo Recovery is professional application that can help you extract iPhone file and get all of photos back if you deleted your cherished photos by mistake. Not only retrieve deleted photos from iPhone is good, it works well with iPhone 5, iPhone 4S, iPhone 4, iPhone 3GS. It can recover Messages, Contacts, Call History, Calendar, Notes, Reminders, Safari Bookmark directly from iPhone 5/4S.

iPhone photo recovery tutorial list:
1. recover deleted photos from iPhone 5
2. recover deleted photos from iPhone 4S
3. recover deleted photos from iPhone 4
4. recover deleted photos from iPhone 3GS

Chann Ethan said...

Good article, thanks a lot.

Recover Deleted SMS from iPhone,
Recover Deleted Photos from iPhone,
Recover Notes from iPhone 4,
Recover iPhone Contacts,
Recover Deleted Video from iPhone 4S,
undo Deleted Texts on iPhone,
Recover iMessage from iPhone

Jenny said...

Nice work! If you are interted in iPhone text messages recovery, here are the information i found:

retrieve deleted text messages from iPhone 5
retrieve deleted text messages from iPhone 4S
retrieve deleted text messages from iPhone 4
retrieve deleted text messages from iPhone 3GS

Sweet Fairy said...

This is so helpful. Thanks for sharing. ucuz iphone

Zhang Peng said...

Epubor eBook Converter Ultimate can satisfy all eBook conversion requests. http://www.epubor.com/ultimate.html

Webmaster said...

Very Informative. Thanks for Sharing.Keep it up.

iPhone Application Developers

Leona james said...

I'm gladsome to mature so more serviceable and informative assemblage on your website.
Learn More About High Impact Squad

Jennifer Young said...

Hello friends, nice post and nice urging commented at this place, I am after all enjoying by these.
YMCA Fit Jobs Articles

Angelina Jullie said...

I am really appreciating very much by seeing your interesting posts.
full coverage auto insurance

Micheal Clark said...

This article has some vast and valuable information about this subject.
good infographics

Johney Duke said...

The blog is unique that’s providing the nice material. Please post more interesting articles here.
social media infographics

jhon cena said...

I’ve been admirer of your website because I have got the great articles here.infographics design

David Otunga said...

Hi guys, when I am actually willing of reading these blog post to be updated regularly. It offers fastidious stuff.
good infographics

Nunah Mikhail said...

Wasp dudes! Amazing stuff continues the good work. infographic design

Mike Tyson said...

I guess this blog is perfectly incomparable.
payday loans oregon

ALBERT LIET said...

The caliber of information that you're offering is merely wonderful. good infographics

ALBERT LIET said...

The caliber of information that you're offering is merely wonderful. good infographics

Dolph ziggler said...

Superb way of explaining, and great blog to get wonderful information.infographics design

Alvin Gul said...

Hey – great blog, just looking around some blogs, seems a really nice platform you are using. I’m currently using WordPress for a few of my blogs but looking to change one of them over to a platform similar to yours as a trial run. Anything in particular you would recommend about it? click here

Berta Hargrove said...

I've been trying to find hours and now I have got such splendid work.
blood sugar levels chart

Feonacy Tyson said...

Keep the balls rolling!! Nice posts you have given for us.
whole life insurance comparison

Julie Johnson said...

It’s a classic great for me to go to this blog site, it offers helpful suggestions cheap auto insurance

Julie Johnson said...

It’s a classic great for me to go to this blog site, it offers helpful suggestions cheap auto insurance

Julie Johnson said...

It’s a classic great for me to go to this blog site, it offers helpful suggestions cheap auto insurance

Sir ackent said...

It’s amazing in support of me to truly have a web site that is valuable meant for my knowledge.auto insurance

Ma gar said...

VERY very helpful. Kudos for putting this out there. Superb way of explaining. Amazing stuff continues the good work.

https://itunes.apple.com/us/app/sniper-king/id705745002?mt=8

Malina Tysonh said...

I’m eager to find the valuable information and for me this is the right place to get the good stuff.
how to crack winrar password

sir kodak said...

Hi to all, the blog has really the dreadful information I really enjoyed a lotjsa number

Richard Sandberg said...

I went over this website and I conceive you've got a large number of splendid information,weight loss supplements for women

Julie Johnson said...

I suppose I've selected an unbelievable and interesting blog. free tutoring online

Dolph ziggler said...

Wasp dudes! Amazing stuff continues the good work. restaurants in schaumburg il

Julie Johnson said...

congratulations guys, quality information you have given!!! personal trainer Winnipeg

chris jhon said...

Nobody can reject the info you have given in the blogs, this is actually a great work. pirater un compte facebook

Paula Lewis said...

I am confident you've got a great enthusiast following there. pirater un compte facebook

Paula Lewis said...

I am surprised why other specialized don’t perceive your site I’m greatly cheerful I discovered this. pirater un compte facebook

Paula Lewis said...

I am surprised why other specialized don’t perceive your site I’m greatly cheerful I discovered this. pirater un compte facebook

youpak said...

I should say only that its awesome! The blog is informational and always produce amazing things. bubblegum casting

pakistanrose618@gmail.com said...

I am happy to see that you have provided such an incredible and impressive blog for us.
car insurance prices

Fred Haro said...

What a great blog it is!!! You are in truth on your way to colossal success. Well done. payroll advance loans

robin hood said...

Nice blog with awesome stuff!! Can you provide more information?? We are in fact waiting for you…
steam wallet generator

Cory Fuller said...

This is an excellent blog along with the great knowledge.http://www.amazon.com/gp/product/B00GR0ESK0

kingloin said...

You have posted the blogs are really fantastic and informative.

vietnam tour

Albert einstien said...

Thank you so much for such a great blog.
credit people reviews

Richard Sandberg said...

Your work article, blogs I mean over all contents is must read material.is bubblegum casting legitimate

aleena rose said...

Amazing information in this blog here that is truly glancing over the every aspects of topic.
buy twitter followers UK

saim disoza said...

Hey to everyone, it’s my first visit of the blog site; this blog includes awesome and actually best info for the visitors. http://www.epicfollowers.com

aleena rose said...

Inconceivable points. Sound arguments. Keep going the truly amazing work.
domain name

saim disoza said...

congratulations guys, quality information you have given!!!buy twitter followers UK

Nice Man said...

Quality stuff may be the key to invite the users to visit begin to see the blog site, that’s what this site provides.


central booking staten island

aleena rose said...

Your blogs are truly awesome I have no words to praise for your blogs.
vietnam visa on arrival

aleena rose said...

That’s a nice site you people are carrying out there.
central booking staten island

Nice Man said...

I’m eager to find the valuable information and for me this is the right place to get the good stuff.

free media player download

only one said...

Your content shows the power, I’m about to add this to my bookmarks.
free open source ftp client

Gliter Jone said...

I’m thrilled I found your website and blogs. Nice guys!!! bubblegum casting reviews

saim disoza said...

I certainly appreciate your stuff provided in the blogs.
vietnam holiday

saim disoza said...

Keep it up!! You have done the nice job having provided the latest information.vietnam holiday

saim disoza said...

This is my very first time that I am visiting here and I’m truly pleasurable to see everything at one place.vietnam tour

saim disoza said...

These blogs are valuable because these are providing such informative information for all the people.vietnam holiday

aleena rose said...

Hello, this is fastidious post I actually loved reading this.
sewing kit

julia john said...

I am certain this article has touched all the web visitors; it’s very extremely lovely script.
best credit

janiffer suiz said...

I have spent a lot of the time in different blogs but this is really a unique blog for me.vietnam holiday

janiffer suiz said...

These blogs are valuable because these are providing such informative information for all the people.vietnam tour

janiffer suiz said...

Amazing information in this blog here that is truly glancing over the every aspects of topic.vietnam travel

janiffer suiz said...

Keep it up!! You have done the nice job having provided the latest information.vietnam holiday

Master Mind said...

Your articles and blogs are inspirational.
electrical contractors brisbane

nice name said...

Your website is for sure worth bookmarking.
ny central booking

ramas samar said...

I am informing you all "fabulous information"

Manhattan central booking

Richard Sandberg said...

Exceptional blog you guys have conserved there, I absolutely appraise your effort.

central booking ny

Sir Thoma said...

congratulations guys, quality information you have given!!! criminal attorney ny

Albert einstien said...

Continue the good work; keep posting more n more n more.
replica watches

julia bandth said...

Regarding all aspects the blog was perfectly nice. Accident Claims

Albert einstien said...

This is really pretty cool place I like it because it has everything I want more on this blog soon.
helpful site

Zara Whitaker said...

It’s my first time to visit this site & I’m really surprised to see such impressive stuff out there. click now

thomas morrison said...

Waooow!!! Really very cool site of blogs. You can imagine what you have done for me.
this form

vietnam holiday said...

I’m glad to see that having got your blog site I have solved my whole issues regarding searching the stuff.
click this link

vietnam holiday said...

I’m glad to see that having got your blog site I have solved my whole issues regarding searching the stuff.
click now

Cool boy said...

I think I have really come on the right place for getting the perfect info.for more info

Cool Person said...

The information you have given in the blog really marvelous and more interesting.
get more info

Samion Eric said...

I think I have really come on the right place for getting the perfect info.
for more info

Albert einstien said...

The information in this blog is extremely useful for the people.
green coffee bean extract

Lucy gray said...

I think I have really come on the right place for getting the perfect info.
read more

nice name said...

That’s really a nice one, I have seen many blogs but they are outdated so I’m pleased to see this blog now.
Full Article

Paula Lewis said...

Great webpage buddy, I am going to notify this to all my friends and contacts as well. id badge

jorg chan said...

The information you have given in the blog really marvelous and more interesting.
best credit

julia bandth said...

I have been really impressed by going through this awesome blog. who has lowest car insurance rates

Barbara amsel said...

Hey enormous stuff or pleasant information you are offering here.
best home alarm system

Raul Wint said...

congratulations guys, quality information you have given!!! lexington law reviews

vietnam holiday said...

The information you have given in the blog really marvelous and more interesting.
whole life quotes

Albert einstien said...

congratulations guys, quality information you have given!!!
payday lenders

Albert einstien said...

exposed skin care reviews
I suppose I've selected an unbelievable and interesting blog.

Albert einstien said...

Hurrah, that’s what I was trying to get for, just what a stuff Presented at this blog!! Thanks admin of the site.
recipes for pasta salad

Alex Jones said...

This info you provided in the blog that was really unique I love it!!! ppi claims

akson bhag said...

The information you have given in the blog really marvelous and more interesting.
Electric Shaver

Pocha huntas said...

I think I have really come on the right place for getting the perfect info.
rental mobil jakarta

thomas said...

shaver blog
Thank you so much you have given the great blogs site by which we can get more advantage.

Brenda Sturgill said...

Your blogs and its stuff magnetize me to return again n again. Best Electric Shaver

thomas said...

The stuff in this blog is in not only incredible but also providing the great knowledge to the people.
direct lender quick approval bad credit no check loans

thomas said...

I have visited lots of the blogs but this blog is truthfully wonderful.
how to lose man boobs fast

unsit polek said...

Thanks meant for sharing this type of satisfying opinion, written piece is fastidious, that’s why I’ve read it completely. green coffee bean extract weight loss

thomas said...

I want to say thank to you people for this great and helpful info. Thanks!!!
Kansas City SEO

Albert einstien said...

linden method
Waooow!! Nice blog, this will be greatly helpful.

vietnam holiday said...

Your blogs are fantastic, useful and your articles are wonderful.phlebotomist

Albert einstien said...

Height Increasing Shoes
I think I have never seen such blogs ever before that has complete things with all details which I want. So kindly update this ever for us.

sileena jad said...

This blog is really awesome in all respects.
best panasonic shaver review

fan cahk said...

The information you have given in the blog really marvelous and more interesting.
italian recipes

jorg chan said...

The information you have given in the blog really marvelous and more interesting.diet news

Albert einstien said...

lung cancerYour composing is purely awe-inspiring that I desired to read such high quality material...

thomas said...

I never ever read such type of info before this was really incredible. quick weight loss pills

rishan safar said...

Hi to everybody, here everyone is sharing such knowledge, so it’s fastidious to see this site, and I used to visit this blog daily. phlebotomy

Albert einstien said...

Awesome! Immense information there.
panic away

Albert einstien said...

Excellent quality articles are here. This is good site with useful info.
creditrepair.com reviews

Swiss watches said...

Those who are still far from your site they are missing the more brilliant stuff of the blogs.diet programs

kent clark said...

The info you provided in the blog that was really unique I love it!!!credit repair companies

Barbara amsel said...

This blog is really awesome in all respects.
frontpoint security review

wright jhon said...

You guys present there are performing an excellent job. facebook marketing

thomas said...

Appreciate you guys you are doing a really terrific job.
Puppy training

thomas said...

topcartips.comWaooow!! Nice blog, this will be greatly helpful.

thomas said...

Waooow!! Nice blog, this will be greatly helpful.
Maid Service Prices

Cm punk said...

Your contents provide me a lot of creative suggestions that I can seemingly utilize on my web page too.credit people reviews

thomas said...

I constantly emailed this site post page to all my friends, because if prefer to read it then my all friends will too.
diet information

blaine heden said...

I have been really impressed by going through this awesome blog. vivint home security

Mickey James said...

Awesome work! That is quite appreciated. I hope you’ll get more success.

frontpoint security review

solar energy said...

congratulations guys, quality information you have given!!! multiple website opener

thomas said...

home security companiesYour work is totally enthusiastic and informative.

Fred Haro said...

Bundles of thanks for providing such kind of blogs with the informative and impressive articles. get more likes on facebook - realfacebooklike.com

thomas said...

How to get rid of pimplesYour blogs and each of its stuff is so pleasurable and valuable it is making me come back soon.

robin hood said...

I'm certainly very happy to read this blog site posts which carries plenty of helpful data, thanks for providing such information.best electric razor

Albert einstien said...

I want to say thank to you people for this great and helpful info. Thanks!!!
hotels makkah

Nunah Mikhail said...

Your blogs and its stuff magnetize me to return again n again. umrah package

thomas said...

Your blogs and information attracts me to come back again n again. social anxiety treatment

Joseph Cauley said...

Regarding all aspects the blog was perfectly nice. Electric Shaver

Albert einstien said...

congratulations guys, quality information you have given!!!
after effects tutorial

martin hussy said...

Your work article, blogs I mean over all contents is must read material. lifeinsurance

thomas said...

Awesome! Immense information there.
facebook likes

Alex Jones said...

congratulations guys, quality information you have given!!! <a href="http://img1.imagehousing.com/81/993515ae8bd33e68a7e10aab26a9cc8b.jpg

Mike tyson said...

The information you have given in the blog really marvelous and more interesting. pay day loan lubboack

Dominic G Powers said...

Methylone Shoppe is a research and chemical supplier from China. Methylone Shoppe is the largest privately-branded methylone supplier in USA. We deliver more than just a broad array of advanced quality methylone and other chemicals For More info Visit : http://methyloneshoppe.com/

Carla Dillon said...

How fine of you!!!! Really awesome efforts you have shown. after effects tutorial

Carla Dillon said...

How fine of you!!!! Really awesome efforts you have shown. after effects tutorial

julia martin said...

Thanks a lot for publishing the new good stuff for us. I’ll really get the great advantage from your good stuff.
Facebook Likes

jhon cena said...

These articles and blogs are certainly sufficient for me personally for a day.luxury Villas Marrakech

grady williams said...

downloadAmiable articles and the blogs really helped me a lot, thanks for the valuable information.

unsit polek said...

Nice answers in replace of the question with real point of view and explaining about that. hotels makkah

Seth Danks said...

The information you have given in the blog really marvelous and more interesting. automobile insurance

Albert einstien said...

I want to say thank to you people for this great and helpful info. Thanks!!!
user manual

Albert einstien said...

Awesome! Immense information there.

nemesis mod

Fred Haro said...

Your blog is such like that I have run out of words!!! Really superb Víno

Alex Jones said...

The author of your blogs and articles and contents is really appreciating. Best Online Slot Games

Rebecca Lopez said...

Your blogs and its stuff magnetize me to return again n again. bt tm-15

Julie Johnson said...

I envisage feeling to have the increase that your knowledge. magma clone

Melvin Gregor said...

The information you have given in the blog really marvelous and more interesting. online tutoring service

gallantfelix said...

You people have actually provided the best blogs that are easy to understand for the folks. home security companies

Albert einstien said...

frontpoint securityIt's been good to see your blog when I always look for such type of blogs. It’s great to discover the post here.

unsit polek said...

Great blogs buddy……… this will definitely assist me. compare auto insurance rates

Albert einstien said...

from this site
Awesome! Immense information there.

Kent Clark said...

You have done really a superb job with your web site. Marvelous stuff is here to read. Braun 3Series 380S-4

Albert einstien said...

I want to say thank to you people for this great and helpful info. Thanks!!!
garcinia cambogia pure extract

deny lost said...

The Info in the blog is out of this world, I so want to read more. Cute Cartilage Earrings

deny lost said...

I never ever read such type of info before this was really incredible. credit repair companies

jay paul said...

Congratulation for the great post. Those who come to read your article will find lots of helpful and informative tips.

Acer - 15.6"TravelMate Notebook 4 GB Memory - 750 GB Hard Drive

Acer - Aspire Ultrabook 15.6" Laptop - 6GB Memory - 500GB Hard Drive + 20GB SSD

«Oldest ‹Older   1 – 200 of 363   Newer› Newest»

Post a Comment

top