The best example is sending the email messages from an application.
Of course you can write a subject and a body for email message directly in your code:
var subject = string.Format("Details about item ID - {0}", item.Id); var body = string.Format(@"Dear {0} {1}, This is a details about your item ID - {2}. Regards.", item.FirstName, item.LastName, item.Id);
And everything is OK unless somebody ask you to change the text of a subject or a body message.
In that case you have to change it in the code, release your application and deploy it again.
It often happens that when you already finished the deployment, you receive the new text message for a body, and based on my experience you will receive that kind of messages again and again.
Then somebody can ask you - what about localization? You need to send one message in English and another message in German. Later somebody ask about a Korean message, etc.
So, it's good example where a text template engine could help you.
In this post i will show you how to use RazorEngine for it.
Using the RazorEngine
The following command in the Package Manager console will install RazorEngine package into your ASP.NET MVC 4 WebAPI application.
PM > Install-Package RazorEngine
RazorEngine is a templating engine built upon Microsoft's Razor parsing technology. The RazorEngine allows you to use Razor syntax to build robust templates. Currently RazorEngine has integrated the vanilla Html + Code support, but it would support other markup languages in future.
So, let's start with TemplateEngine interface:
public interface ITemplateEngine { string Parse(string template, dynamic model); }
This interface introduce just one method which receive a template text and a data model for a template in a parameters and send the generated text back.
Continue with realization:
public class RazorTemplateEngine : ITemplateEngine { public string Parse(string template, dynamic model) { return Razor.Parse(template, model); } }
It's really easy, just don't forget include RazorEngine to your using block.
The localized templates service
Our template engine is ready. But we don't want to just convert one text to another using string variables.
We would like to specify the template name, the template data model and the current culture, and get the generated text back.
For that reason I will create an TemplatesService class, but let's start with an interface first:
public interface ITemplatesService { string Parse(string templateName, dynamic model, CultureInfo cultureInfo = null); }
This simple interface has only one method which takes the template name, data model and current culture as a parameters and will return the generated text as well.
Realization of this simple interface is not so simple, but i will explain all the methods later.
But before I show you the realization I would like to tell you that our TemplatesService class needs to do some file system operations, e.g. read all contents of the files, check if a file exists.
I suggest to create a separate interface (and realization of course) to do all of this file system tasks. It allows you to avoid a lot of problems in unit testing, and make your services more clear to another developers.
The interface for the file system operations:
public interface IFileSystemService { string ReadAllText(string fileName); bool FileExists(string fileName); string GetCurrentDirectory(); }
And really simple realization:
public class FileSystemService : IFileSystemService { public string ReadAllText(string fileName) { return File.ReadAllText(fileName); } public bool FileExists(string fileName) { return File.Exists(fileName); } public string GetCurrentDirectory() { return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); } }
I hope everything is clear to you in this class.
So, let's return to realization of TemplatesService. I will show you the realization from methods to methods. The constants, the properties and a constructor of the class, first:
public class TemplatesService : ITemplatesService { private const string DefaultLanguage = "en"; private const string TemplatesDirectoryName = "Templates"; private const string TemplateFileNameWithCultureTemplate = "{0}.{1}.template"; private const string TemplateFileNameWithoutCultureTemplate = "{0}.template"; private readonly IFileSystemService _fileSystemService; private readonly ITemplateEngine _templateEngine; private readonly string _templatesDirectoryFullName; public TemplatesService(IFileSystemService fileSystemService, ITemplateEngine templateEngine) { _fileSystemService = fileSystemService; _templateEngine = templateEngine; _templatesDirectoryFullName = Path.Combine(_fileSystemService.GetCurrentDirectory(), TemplatesDirectoryName); } // rest of the code }
Nothing complex in this code: just declaring the four constants where I specified the default language name, the name of the directory where the templates are stored, and the string templates for the file name of template with and without a culture.
Also, I stored the full path to templates directory in the _templateDirectoryFullName property in the constructor of the class.
Then, the implementation of the one public method which declared in the interface:
public string Parse(string templateName, dynamic model, CultureInfo cultureInfo = null) { var templateContent = GetContent(templateName, cultureInfo); return _templateEngine.Parse(templateContent, model); }
It takes the content of the template from GetContent method and call the template engine to get a string result.
private string GetContent(string templateName, CultureInfo cultureInfo) { var templateFileName = TryGetFileName(templateName, cultureInfo); if (string.IsNullOrEmpty(templateFileName)) { throw new FileNotFoundException(string.Format("Template file not found for template '{0}' in '{1}'", templateName, _templatesDirectoryFullName)); } return _fileSystemService.ReadAllText(templateFileName); }
Te method GetContent tries to take the template full file name (a file name with a path) from the method TryGetFileName, and if this method return null or empty string throws an exception. Otherwise it reads all the template file content and return it.
private string TryGetFileName(string templateName, CultureInfo cultureInfo) { var language = GetLanguageName(cultureInfo); // check file for current culture var fullFileName = GetFullFileName(templateName, language); if (_fileSystemService.FileExists(fullFileName)) { return fullFileName; } // check file for default culture if (language != DefaultLanguage) { fullFileName = GetFullFileName(templateName, DefaultLanguage); if (_fileSystemService.FileExists(fullFileName)) { return fullFileName; } } // check file without culture fullFileName = GetFullFileName(templateName, string.Empty); if (_fileSystemService.FileExists(fullFileName)) { return fullFileName; } return string.Empty; }
This method gets the language name from CultureInfo parameters, and checks is the template file for that language exist, and if no, checks is the template file for default language exists, and if it is not found then checks is the template file without any culture exist.
For example, look at the templates files structure:
subject.template subject.de.template
Let's imagine, that the current culture is German. The language is "de". The method should check the template file for this language and should found the second template 'subject.de.template'.
Then, let's imagine, that for now, the current culture is Korean. The language is "ko". The method should check the template file for this language, and will not find it, because we don't have a template file for Korean culture. Then the method should check the template file for default language which is 'en', and will not find it as well. The latest check will be for the template file without any culture and the first one template 'subject.template' should be found.
The implementation of the GetLanguage method is really simple:
private static string GetLanguageName(CultureInfo cultureInfo) { return cultureInfo != null ? cultureInfo.TwoLetterISOLanguageName.ToLower() : DefaultLanguage; }
It returns the two letter ISO language name or the default language name if culture is not specified.
And the last method:
private string GetFullFileName(string templateName, string language) { var fileNameTemplate = string.IsNullOrEmpty(language) ? TemplateFileNameWithoutCultureTemplate : TemplateFileNameWithCultureTemplate; var templateFileName = string.Format(fileNameTemplate, templateName, language); return Path.Combine(_templatesDirectoryFullName, templateFileName); }
That's all with the TemplatesService.
Using the localizable template service
To demonstrate how to use this service let's create the template file first.
Create a directory 'Templates' in your project.
Then click the right mouse button on this directory in the 'Solution Explorer' and select 'Add' -> 'New Item...' (or just press Ctrl+Shift+A).
In the new window click on 'Visual C# Items' and select the 'Text File' in the list. Enter the file name - 'first.template' and click 'Add' button.
Then insert the next text into template file:
ID: @Model.Id Name: @Model.Name Items: @for(int i = 0; i < @Model.Items.Count; i++) { @:item #@i - @Model.Items[i] }
Then write some simple code to parse the template:
var model = new { Id = 10, Name = "Name1", Items = new List<string> {"Item1", "Item2", "Item3", "Item4", "Item5"} }; var templateService = new TemplatesService(new FileSystemService(), new RazorTemplateEngine()); var result = templateService.Parse("first", model);
After that, put the break point after the last line (var result = ...) and run your application in Debug mode.
When the debugger stops on that break point just check the value of the result variable in the Text Visualizer.
If should contains the next text:
ID: 10 Name: Name1 Items: item #0 - Item1 item #1 - Item2 item #2 - Item3 item #3 - Item4 item #4 - Item5
In my next post you can find how to create a localizable text template engine using StringTemplate.
That's all.
Good luck.
I have learn several just right stuff here. Definitely
ReplyDeleteworth bookmarking for revisiting. I wonder how much attempt you place
to make this kind of fantastic informative website.
My website - lotto 649 23 march 2013
it doesn't work for me ((
ReplyDeleteTemplate file not found for template 'first' in 'C:\Users\UserName\AppData\Local\Temp\Temporary ASP.NET Files\root\1a3e82a9\9c2ce23\assembly\dl3\d7a75f04\34344e0f_ed70ce01\Templates'
Try using this method instead:
Deletepublic string GetCurrentDirectory()
{
//return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
return
new System.Uri(
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase)).
LocalPath;
}
Hi! This is a great post, really helped me a lot.
ReplyDeleteFew things:
- How about master layout, section and partial support? I've seen few examples on the net, but couldn't really make it work. It would be nice if you can add your thoughts here about those issues.
- You are resolving the mapping Template Name -> Physical File really deep in the code. Problem with this is that I have a requirement to generate two templates for one email - html and text version. Maybe for future readers you should place this resolving up in the hierarchy, in the Parse method.
Thanks!
Great Article..
ReplyDeleteWeb API 2.2 Training
Online Web API 2.2 Training
Online Web-API Training from India
Web-API Training in Chennai
Dot Net Training in Chennai
Great Article..
ReplyDeleteWeb API 2.2 Training
Online Web API 2.2 Training
Online Web-API Training from India
Web-API Training in Chennai
Dot Net Training in Chennai
ASP.Net MVC Training
Online MVC Training
Online MVC Training from India
MVC Training in Chennai
Such as very good information promoting content are provided and more skills are improved after refer that post.For more details about oracle fusion please check our website.
ReplyDeleteOracle Fusion Training Institute
ReplyDeleteIts a wonderful post and very helpful, thanks for all this information. You are including better information regarding this topic in an effective way.Thank you so much
Personal Installment Loans
Payday Cash Advance loan
Title Car loan
Cash Advance Loan
Thanks for all the information, it was very helpful I really like that you are providing information.
ReplyDeleteTo find Best Training institutes can search in our Calfre.com it is very easy to find the complete details about all Training's Centers Click Here
Your article is so informative and I have cleared all of my doubts. Your way of explanation is awesome, thank you for sharing useful information.
ReplyDeleteTo find Best Training institutes can search in our Calfre.com it is very easy to find the complete details about all Training's Centers Click Here
nice blog
ReplyDeletedata science training in bangalore
aws training in bangalore
I always enjoy reading quality articles by an individual who is obviously knowledgeable on their chosen subject. Ill be watching this post with much interest. Keep up the great work, I will be back
ReplyDeleteJava training in Chennai | Java training in Tambaram
Java training in Chennai | Java training in Velachery
Java training in Chennai | Java training in Omr
Oracle training in Chennai
We are a group of volunteers and starting a new initiative in a community. Your blog provided us valuable information to work on.You have done a marvellous job!
ReplyDeleteData Science training in kalyan nagar
Data Science training in OMR | Data science training in chennai
Data Science training in chennai | Best Data science Training in Chennai
Data science training in velachery | Data Science Training in Chennai
Data science training in tambaram | Data Science training in Chennai
Data science training in jaya nagar | Data science Training in Bangalore
It's interesting that many of the bloggers to helped clarify a few things for me as well as giving.Most of ideas can be nice content.The people to give them a good shake to get your point and across the command
ReplyDeleteJava interview questions and answers
Java training in Chennai | Java training institute in Chennai | Java course in Chennai
Java training in Bangalore | Java training institute in Bangalore | Java course in Bangalore
Java interview questions and answers
I prefer to study this kind of material. Nicely written information in this post, the quality of content is fine and the conclusion is lovely. Things are very open and intensely clear explanation of issues
ReplyDeletepython training in chennai
python training in chennai
python training in bangalore
This is a nice article here with some useful tips for those who are not used-to comment that frequently. Thanks for this helpful information I agree with all points you have given to us. I will follow all of them.
ReplyDeleteexcel advanced excel training in bangalore | Devops Training in Chennai
I believe there are many more pleasurable opportunities ahead for individuals that looked at your site.
ReplyDeleteangularjs Training in marathahalli
angularjs interview questions and answers
angularjs Training in bangalore
angularjs Training in bangalore
angularjs Training in chennai
automation anywhere online Training
guest post
ReplyDeleteappvn apk ios
tutuapp apk ios
Thanks for such a great article here. I was searching for something like this for quite a long time and at last, I’ve found it on your blog. It was definitely interesting for me to read about their market situation nowadays.pmp training centers in chennai| pmp training in velachery | project management courses in chennai |pmp training in chennai | pmp training institute in chennai
ReplyDeletenice post..Sap B1 Companies in Chennai
ReplyDeleteSap B1 Company in Chennai
Sap B1 Partners in Chennai
Very good information. Its very useful for me. We have a good career in java. We need learn from real time examples and for this we choose good training institute, we need to learn from experts . We need a good training institute for our learning . so people making use of the free demo classes.Many training institute provides free demo classes. One of the best training institute in Bangalore is Apponix Technologies.
ReplyDeletehttps://www.apponix.com/Java-Institute/Java-Training-Institute-in-Bangalore.html
Such as very good information promoting content are provided and more skills are improved after refer that post.For more details about oracle please check our website.
ReplyDeleteOracle Golden gate Online Training
Oracle Identity Manager Online Training
Oracle Performance Tuning Online Training
Oracle 11g Rac Online Training
Oracle RAC Online Training
Oracle SCM Online Training
Oracle SOA Online Training
youtubelampung.blogspot.com
ReplyDeletebimbellampung.blogspot.com
bateraitanam.blogspot.com
lampungservice.com
Hi, It’s Amazing to see your blog.This provide us all the necessary information regarding
ReplyDeleteupcoming real estate project which having all the today’s facilities.
autocad in bhopal
3ds max classes in bhopal
CPCT Coaching in Bhopal
java coaching in bhopal
Autocad classes in bhopal
Catia coaching in bhopal
this is nice post thank you
ReplyDeleteselenium training in chennai
selenium training in omr
best python training institute in omr
best python training in sholinganallur
best python training in chennai
best java training in chennai
thanks for sharing this information
ReplyDeleteaws training in bangalore
Amazon web services training in bangalore
best AWS Training institute in Bangalore
aws training institutes in bangalore
aws certification course in bangalore
devops training institutes in bangalore
devops certification course in bangalore
UiPath Training in Bangalore
For AWS training in Bangalore, Visit:
ReplyDeleteAWS training in Bangalore
the post is amazing ethical hacking certification
ReplyDeleteI really enjoy reading this article. Hope that you would do great in upcoming time.A perfect post. Thanks for sharing.aws training in bangalore
ReplyDeleteThe content was very interesting, I like this post. Your explanation way is very attractive and very clear.data science training in bangalore
ReplyDeleteThe Information which you provided is very much useful for Agile Training Learners. Thank You for Sharing Valuable Information.google cloud platform training in bangalore
ReplyDeleteThanks for sharing this blog. This very important and informative blog.dot net training in bangalore
ReplyDeleteEnjoyed reading the article above, really explains everything in detail, the article is very interesting and effective. Thank you and good luck…
ReplyDeleteStart your journey with Database Developer Training in Bangalore and get hands-on Experience with 100% Placement assistance from experts Trainers @Bangalore Training Academy Located in BTM Layout Bangalore.
Thanks for your post very userful for the readers .keep me as a bookmark for future reference .
ReplyDeleteRpa training in chennai | RPA training course chennai
AI training in chennai
I can’t imagine that’s a great post. Thanks for sharing.
ReplyDeleteStart your journey with AWS Course and get hands-on Experience with 100% Placement assistance from Expert Trainers with 8+ Years of experience @eTechno Soft Solutions Located in BTM Layout Bangalore.
I am really happy with your blog because your article is very unique and powerful for new reader.
ReplyDeleteaws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore
Nice Post! Thank you for sharing very good post, it was so Nice to read and useful to improve my knowledge as updated one, keep blogging.
ReplyDeleteaws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore
I can’t imagine that’s a great post. Thanks for sharing.
ReplyDeleteGet Best Dell Boomi Training in Bangalore from Real Time Industry Experts with 100% Placement Assistance in MNC Companies. Book your Free Demo with Softgen Infotech.
very nice information..
ReplyDeleteinplant training in chennai
inplant training in chennai
inplant training in chennai for it.php
Australia hosting
mexico web hosting
moldova web hosting
albania web hosting
andorra hosting
australia web hosting
denmark web hosting
nice....
ReplyDeleteinplant training in chennai
inplant training in chennai for it
panama web hosting
syria hosting
services hosting
afghanistan shared web hosting
andorra web hosting
belarus web hosting
brunei darussalam hosting
inplant training in chennai
2) Thanks for this. I really like what you've posted here and wish you the best of luck with this blog and thanks for sharing.
ReplyDeletesql server dba training in bangalore
sql server dba courses in bangalore
sql server dba classes in bangalore
sql server dba training institute in bangalore
sql server dba course syllabus
best sql server dba training
sql server dba training centers
Really it was an awesome article… very interesting to read…Thanks for sharing.........
ReplyDeleteaws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore
Snapdeal Winner List here came up with an Offer where you can win Snapdeal prize list 2020 by just playing a game & win prizes.
ReplyDeleteSnapdeal winner name2020 also check the Snapdeal lucky draw2020
Really nice post. Thank you for sharing amazing information.
ReplyDeleteaws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore
This post is really nice and informative. The explanation given is really comprehensive and useful... salesforce administrator training
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThanks for the informative article About Angular Js. This is one of the best resources I have found in quite some time. Nicely written and great info. I really cannot thank you enough for sharing.
ReplyDeleteJava training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery
ReplyDeleteFirstly talking about the Blog it is providing the great information providing by you . Thanks for that . Next i want to share some information about Salesforce training in Banglore .
This is most informative and also this post most user friendly and super navigation to all posts. Thank you so much for giving this information to me.
ReplyDeleteDevOps Training in Chennai
DevOps Course in Chennai
Nice & Informative Blog !
ReplyDeleteIf you are looking for the best accounting software that can help you manage your business operations. call us at QuickBooks Phone Number 1-(855) 550-7546.
Hey!! Great work. You have a very informative blog .You are doing well. Keep it up. We will also provide Quickbooks Subscription Error to alter Quickbook’s issues. If you have any issues regarding Quickbooks dial +1-8555-756-1077 for getting instant help.
ReplyDeleteNice Post !
ReplyDeleteQuickBooks is the best accounting software of the current time that provides ease of use and a user-friendly interface.you may face some technical queries in this software. To get solutions for such problems, call us at QuickBooks Customer Service Number 1-(855) 550-7546.
Hey! Good blog. I was facing an error in my QuickBooks software, so I called QuickBooks Error 6123 (855)-756-1077. I was tended to by an experienced and friendly technician who helped me to get rid of that annoying issue in the least possible time.
ReplyDeleteCommon Service Centre provides different types of online activities in a single point. Visit jainand Digital Point for getting best service.
ReplyDeletebest learning management system
ReplyDeleteonline learning management system software
google meet alternative
Hey! Mind-blowing blog. Keep writing such beautiful blogs. In case you are struggling with issues on QuickBooks software, dial QuickBooks Support Phone Number (877)603-0806. The team, on the other end, will assist you with the best technical services.
ReplyDeleteHey! Excellent work. Being a QuickBooks user, if you are struggling with any issue, then dial QuickBooks Phone Number (877)948-5867. Our team at QuickBooks will provide you with the best technical solutions for QuickBooks problems.
ReplyDeleteNice Blog !
ReplyDeleteQuickBooks is an accounting software that helps you manage and handle all the accounting operations at the same time.However, many times, you may come across errors like QuickBooks Error 1926 while working on this software.To get instant assistance for QuickBooks issues, Our team offers 24 hours of service to our clients.
Nice Blog !
ReplyDeleteQuickBooks Error 1334 is an error that degrades the performance of your software.They utilise their whole skill and experience into resolving all the annoying issues of QuickBooks users.
Hey! What a wonderful blog. I loved your blog. QuickBooks is the best accounting software, however, it has lots of bugs like QuickBooks Error. To fix such issues, you can contact experts via QuickBooks technical support number
ReplyDeleteGreat writeup! Thanks so much for putting in the work and sharing with everyone.In case if you face any techincal issue in QuickBooks, you can contact Us:
ReplyDeleteQuickBooks Customer Service
Yeni projelerimi incelemek isterseniz tıklayın..
ReplyDelete1- tiktok takipçi satın al
2- tiktok takipçi satın al
3- takipçi satın al
4- tiktok takipçi satın al
5- instagram mobil ödeme takipçi satın al
Thankyou so much for sharing this info
ReplyDeletewedding Photographer in Ahmedabad
wedding Photographer in Bhopal
Dooh in India
I am glad to be here and read your very interesting article, it was very informative and helpful information for me. keep it up. Roy Batty Coat
ReplyDeleteThank you very much for this great post.
ReplyDeleteTyler Ronan Jacket
Hey! Fabulous post. It is the best thing that I have read on the internet today. Moreover, if you need instant support for QuickBooks Error, visit at QuickBooks Customer Service Our team is always ready to help and support their clients.
ReplyDeletevirtual edge .This approach could translate to more ticket sales for the conference itself and The addition of a corporate meeting could mean that more employees will be travelling to the destination. business event invitation email and thank you letter for invitation to event
ReplyDelete
ReplyDeleteHey! Mind-blowing blog. Keep writing such beautiful blogs. In case you are struggling with issues on QuickBooks software, dial QuickBooks Support Phone Number . The team, on the other end, will assist you with the best technical services.
what is contrave
ReplyDeletesilicon wives
sky pharmacy
atx 101 uk
macrolane buttock injections london
hydrogel buttock injections
buying vyvanse online legit
buy dermal fillers online usa
mesotherapy injections near me
xeomin reviews
buy bubba-kush online
ReplyDeletebuy-og-kush-online
buy lysergic-acid-diethylamide-lsd online
buy-goldern-teacher-mushrooms-online
cannabis-seeds for sale
buy shatter online
dab-rigs-and-bongs-2 for sale
vapes-carts price today
buy marijuana-flowers online
green-crack for sale
buy white-widow online
This comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDeletebuy marijuana-edibles online
ReplyDeletebuy cbd-oils online
buy vapes-and-carts online
buy accessories online
buy auto-flowering-seeds online
buy granddaddy-purple online
buy psychedelics online
buy cannabis-concentrates-online
buy og-kush online
buy dmt-nn-dimethyltryptamine online
buy blue-cheese-weed online
buy purple-haze online
buy strawberry-cough online
buy black-diamond-kush online
buy blue-dream online
buy moon-rock online
buy blue-dream-feminized online
profile.php?id=100069707270977 online
buy marijuana-flowers/sativa/ online
buy marijuana-flowers/indica-strains/ online
buy marijuana-flowers/hybrid/ online
buy vapes-and-carts/dank-vapes/ online
buy sun-rocks online
Hey! What a wonderful blog. I loved your blog. QuickBooks is the best accounting software, however, it has lots of bugs like QuickBooks Error. To fix such issues, you can contact experts via QuickBooks Phone Number
ReplyDeletehttps://www.facebook.com/Jack-russell-puppies-looking-for-a-lovely-home-103472108733880/
ReplyDeleteHey! Lovely blog. Your blog contains all the details and information related to the topic. In case you are a QuickBooks user, here is good news for you. You may encounter any error like QuickBooks Error, visit at QuickBooks Customer Service Number for quick help.
ReplyDeleteHi , Thank you so much for writing such an informational blog. If you are Searching for latest Jackets, Coats and Vests, for more info click on given link-Rip Wheeler Jacket
ReplyDeleteHey! Well-written blog. It is the best thing that I have read on the internet today. Moreover, if you are looking for the solution of QuickBooks Software, visit at QuickBooks Customer Service (866)669-5068 to get your issues resolved quickly.
ReplyDeleteHey! Nice Blog, I have been using QuickBooks for a long time. One day, I encountered QuickBooks Customer Service in my software, then I called QuickBooks Customer Service (855)963-5959. They resolved my error in the least possible time.
ReplyDeletehippiestore.org
ReplyDeleteBuy one-up-chocolate-bar Online
Buy one-up-cookies-and-cream-bar online
Buy mescaline-or-peyote Online
Buy mescaline-powder online
Buy-edibles-mushrooms-online
<a href="https://hippiestore.org/product-category/psychedelics/dm…
This was an extremely wonderful post. Thanks for providing this info. 4th Hokage Cloak
ReplyDeleteIt was not first article by this author as I always found him as a talented author. walter white khaki jacket
ReplyDeleteI read this article. I think You put a lot of effort to create this article. I appreciate your work. penelope blossom coat
ReplyDeleteHii!!
ReplyDeleteGood content.wonderful blog. If you are searching for Quickbooks Customer Serviceyou can reach us at.+1 888-210-4052,PA.
This comment has been removed by the author.
ReplyDelete
ReplyDeleteorganic chemistry tutor
organic chemistry teacher
ReplyDeletedonate for poor child
sponsor a child in need
ReplyDeleteThank you so much providing amazing information.architect in pune
architects in pune Our aim is to work with dedication and passion and enhance the human experience.
ReplyDeleterehab center in westwood nj
Thank you for sharing your awesome and valuable article this is the best blog for the students they can also learn.
ReplyDelete
ReplyDeleteLovely post..! I got well knowledge of this blog. Thank you!
Solicitation Of A Minor VA
Online Solicitation Of A Minor
yurtdışı kargo
ReplyDeleteresimli magnet
instagram takipçi satın al
yurtdışı kargo
sms onay
dijital kartvizit
dijital kartvizit
https://nobetci-eczane.org/
0V1İCJ
شركة انشاء مسابح
ReplyDeleteشركة انشاء مسابح بجدة
شركة مكافحة حشرات roKcVz2A4q
ReplyDelete