public void WriteToFile(string fileName)
        {
            using (var resxWriter = new ResXResourceWriter (fileName)) {

                Resources.ForEach (resxWriter.AddResource);

                if (Resources.Count == 0) {
                    resxWriter.AddMetadata ("", "");
                }
            }
        }
		public void SaveFile(string filename, Stream stream)
		{
			switch (Path.GetExtension(filename).ToLowerInvariant()) {
					
					// write XML resource
				case ".resx":
					ResXResourceWriter rxw = new ResXResourceWriter(stream);
					foreach (KeyValuePair<string, ResourceItem> entry in resources) {
						if (entry.Value != null) {
							ResourceItem item = entry.Value;
							rxw.AddResource(item.Name, item.ResourceValue);
						}
					}
					foreach (KeyValuePair<string, ResourceItem> entry in metadata) {
						if (entry.Value != null) {
							ResourceItem item = entry.Value;
							rxw.AddMetadata(item.Name, item.ResourceValue);
						}
					}
					rxw.Generate();
					rxw.Close();
					break;
					
					// write default resource
				default:
					ResourceWriter rw = new ResourceWriter(stream);
					foreach (KeyValuePair<string, ResourceItem> entry in resources) {
						ResourceItem item = (ResourceItem)entry.Value;
						rw.AddResource(item.Name, item.ResourceValue);
					}
					rw.Generate();
					rw.Close();
					break;
			}
		}
		public void SaveFile(FileName filename, Stream stream)
		{
			switch (Path.GetExtension(filename).ToLowerInvariant()) {
				case ".resx":
					// write XML resource
					ResXResourceWriter rxw = new ResXResourceWriter(stream, t => ResXConverter.ConvertTypeName(t, filename));
					foreach (ResourceItem entry in resourceItems) {
						if (entry != null) {
							rxw.AddResource(entry.ToResXDataNode(t => ResXConverter.ConvertTypeName(t, filename)));
						}
					}
					foreach (ResourceItem entry in metadataItems) {
						if (entry != null) {
							rxw.AddMetadata(entry.Name, entry.ResourceValue);
						}
					}
					rxw.Generate();
					rxw.Close();
					break;
				default:
					// write default resource
					ResourceWriter rw = new ResourceWriter(stream);
					foreach (ResourceItem entry in resourceItems) {
						rw.AddResource(entry.Name, entry.ResourceValue);
					}
					rw.Generate();
					rw.Close();
					break;
			}
		}
        public void Save()
        {
            if (!IsDirty) return;
            if (File.Exists(TargetResXFileName)) File.Delete(TargetResXFileName);

            bool containsTranslation = false;
            foreach (var str in StringsWithTranslations)
            {
                containsTranslation = true;
                break;
            }

            if (containsTranslation)
            {
                if (!FileSystemWalker.TranslationsDirExists)
                    Directory.CreateDirectory(FileSystemWalker.TranslationsDirectory);

                using (ResXResourceWriter writer = new ResXResourceWriter(TargetResXFileName))
                {
                    foreach (var str in StringsWithTranslations)
                    {
                        writer.AddResource(str.Key, str.Target);
                        writer.AddMetadata(OrgSourceMetadataKeyPrefix + str.Key, str.TranslatedSource);
                    }
                }
            }
            else
            {
                if (File.Exists(TargetResXFileName)) File.Delete(TargetResXFileName);
            }

            // Clear dirty flag
            foreach (var str in translatableStrings)
            {
                str.ClearDirty();
            }
        }