Skip to content

Commit

Permalink
Dev
Browse files Browse the repository at this point in the history
  • Loading branch information
JoacimWall committed Oct 22, 2023
1 parent 381b1d4 commit 17c9e70
Show file tree
Hide file tree
Showing 35 changed files with 553 additions and 169 deletions.
Binary file added Images/ExportToNativeDialog.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Images/MultilingualSettingsDialog.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@

### View introduction video or download the sample app
#### This video is for Mac but the windows and mac are very similar. What changed after this was done is that you now configure by changing values in the file MultiLingualExtensionSettings.json which is created in the same folder as the solution file.

### Support for Native Android and Ios (only Mac os)
#### In case you want to use this to have a master language file for native Android and Ios. do you need to use .resx files. To get the translation to land in your native projects, set the path to these in MultiLingualExtensionSettings.json and the property AndroidResourcesOutPutFolder and IosResourcesOutPutFolder.

[![YouTube](https://i9.ytimg.com/vi/4OAhHpUpXmA/mq2.jpg?sqp=CLDSof8F&rs=AOn4CLAexsPpQzbUEi8Ud_7YgThQFXFwPg)](https://youtu.be/4OAhHpUpXmA)


Expand Down Expand Up @@ -77,6 +81,11 @@ your preferred export format, csv or xslt.
If you also want to handle the status for the texts in the master resx file then sett this to true.
This will add Comment node to master Resx file on sync and also export the master Resx on export.

#### AndroidResourcesOutPutFolder
If you want to convert your resx files to Native android translation files, you specify here where you want them to be saved. default is that they are saved in a directory under the same as the master resx file.

#### IosResourcesOutPutFolder
If you want to convert your resx files to Native Ios translation files, you specify here where you want them to be saved. default is that they are saved in a directory under the same as the master resx file.

### Synchronization of Resx or Resw files
There are two ways to sync the language files.
Expand Down Expand Up @@ -111,6 +120,10 @@ This file will then be Translate with the master file. The extension will only t
<img width=“100” height="200" src="https://github.com/JoacimWall/Visual-studio-multilingual-extension/blob/main/Images/TranslateLog.png">


### Export of translation to native Android and Ios files
In case you want to use this to have a master language file for native Android and Ios. do you need to use .resx files. To get the translation to land in your native projects, set the path to these in MultiLingualExtensionSettings.json and the property AndroidResourcesOutPutFolder and IosResourcesOutPutFolder.

<img width=“100” height="400" src="https://github.com/JoacimWall/Visual-studio-multilingual-extension/blob/main/Images/ExportToNativeDialog.png">
### Export of texts to Excel or csv file
There are two ways to export the resx files to csv or xlsx.
Right-click the master file and select "Export all .xx-xx.resx files". Then all files that are in the same folder and follow the naming standard .xx-xx.resx will be processed and all rows with status 'New' or 'Need review' will be exported. You can change the preferd export file type in the settings dialog click tools/multilangual settings and select the preferd 'Export file type' and click save.
Expand Down
1 change: 1 addition & 0 deletions src/MultilingualClient/GlobalUsings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
global using MultilingualExtension.Shared.Interfaces;
global using MultilingualExtension.Shared.Helpers;
global using MultilingualExtension.Shared.Services;
global using MultilingualExtension.Shared.Services.FileConverters;

//Local
global using MultilingualClient.Controls.TreeView;
Expand Down
30 changes: 30 additions & 0 deletions src/MultilingualClient/MultilingualClient.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,36 @@
<Compile Include="..\MultilingualExtension\MultilingualExtension.Mac\Services\ExportService.cs">
<Link>Services\ExportService.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\AndroidResxConverterOutput.cs">
<Link>Services\FileConverters\AndroidResxConverterOutput.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\ResxConverters.cs">
<Link>Services\FileConverters\ResxConverters.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\ResxConverter.cs">
<Link>Services\FileConverters\ResxConverter.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\IResxConverterOutput.cs">
<Link>Services\FileConverters\IResxConverterOutput.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\iOSResxConverterOutput.cs">
<Link>Services\FileConverters\iOSResxConverterOutput.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\StringExtensions.cs">
<Link>Services\FileConverters\StringExtensions.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\ResxString.cs">
<Link>Services\FileConverters\ResxString.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\ResxConverterOutputFactory.cs">
<Link>Services\FileConverters\ResxConverterOutputFactory.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\IResxConverterOutputFactory.cs">
<Link>Services\FileConverters\IResxConverterOutputFactory.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension\MultilingualExtension.SharedCode\Services\FileConverters\StringExtensionsMobile.cs">
<Link>Services\FileConverters\StringExtensionsMobile.cs</Link>
</Compile>
</ItemGroup>
<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst')) and '$(Configuration)' == 'Debug'">
<CodesignEntitlements>Platforms/MacCatalyst/Entitlements.Debug.plist</CodesignEntitlements>
Expand Down
19 changes: 0 additions & 19 deletions src/MultilingualClient/Services/FileConverters/ResxConverters.cs

This file was deleted.

14 changes: 4 additions & 10 deletions src/MultilingualClient/ViewModels/MainViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@


using System;
using MultilingualClient.Services;
using ResxConverter.Mobile;

namespace MultilingualClient.ViewModels;
namespace MultilingualClient.ViewModels;

public class MainViewModel : BaseViewModel
{
Expand Down Expand Up @@ -175,7 +169,7 @@ private async Task ExportFile(object e, string type)
Console.WriteLine("Sync file completed");
}
}
private static readonly Dictionary<string, ResxConverter.Core.ResxConverter> Converters = new Dictionary<string, ResxConverter.Core.ResxConverter>(StringComparer.OrdinalIgnoreCase)
private static readonly Dictionary<string, ResxConverter> Converters = new Dictionary<string, ResxConverter>(StringComparer.OrdinalIgnoreCase)
{
{ "android", ResxConverters.Android },
{ "ios", ResxConverters.iOS },
Expand All @@ -197,7 +191,7 @@ private async Task GenerateAndroidFiles(object e)
statusPadLoger.WriteText(string.Format("Output folder {0} does not exist use standard", settingsService.ExtensionSettings.AndroidResourcesOutPutFolder));
outFolder = Path.Combine(inputFolder, "Android");
}
ResxConverter.Core.ResxConverter converter;
ResxConverter converter;
if (Converters.TryGetValue("android", out converter))
{
statusPadLoger.WriteText(string.Format("Start export all Android transaltions to the folder {0}", outFolder));
Expand Down Expand Up @@ -234,7 +228,7 @@ private async Task GenerateIosFiles(object e)
statusPadLoger.WriteText(string.Format("Output folder {0} does not exist use standard", settingsService.ExtensionSettings.AndroidResourcesOutPutFolder));
outFolder = Path.Combine(inputFolder, "Ios");
}
ResxConverter.Core.ResxConverter converter;
ResxConverter converter;
if (Converters.TryGetValue("ios", out converter))
{
statusPadLoger.WriteText(string.Format("Start export all Ios transaltions to the folder {0}", outFolder));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
using MonoDevelop.Components.Commands;
using MonoDevelop.Ide;
using MonoDevelop.Projects;
using MultilingualExtension.Services;
using MultilingualExtension.Shared.Helpers;
using MultilingualExtension.Shared.Services;
using MultilingualExtension.Shared.Services.FileConverters;

namespace MultilingualExtension
{
class ConvertToMobileNativeHandler : CommandHandler
{
private static readonly Dictionary<string, ResxConverter> Converters = new Dictionary<string, ResxConverter>(StringComparer.OrdinalIgnoreCase)
{
{ "android", ResxConverters.Android },
{ "ios", ResxConverters.iOS },
};
protected async override void Run(object dataItem)
{


try
{
var test = IdeApp.Workbench.Pads;
string nativeTypeToExport = dataItem as string;
ExportService exportService = new ExportService();
await IdeApp.Workbench.SaveAllAsync();
ProjectFile selectedItem = (ProjectFile)IdeApp.Workspace.CurrentSelectedItem;
var path = IdeApp.Workspace.CurrentSelectedSolution.FileName;
var projPath = System.IO.Path.GetDirectoryName(path);
MultilingualExtension.Shared.Interfaces.ISettingsService settingsService = new MultilingualExtension.Services.SettingsService(projPath);
string selectedFilename = selectedItem.Name;

//Dummy for mac
var outputPane = new StatusPadLoger();
ResxConverter converter;
var res_Info = Res_Helpers.FileInfo(settingsService.ExtensionSettings.MasterLanguageCode, selectedFilename);

string inputFolder = selectedItem.FilePath.ToString().Substring(0, selectedItem.FilePath.ToString().Count() - res_Info.Model.MasterFilename.Count());
string outFolder;
if (nativeTypeToExport == Globals.Generate_Android_Files_Title)
{
if (Directory.Exists(settingsService.ExtensionSettings.AndroidResourcesOutPutFolder))
outFolder = settingsService.ExtensionSettings.AndroidResourcesOutPutFolder;
else
{
outputPane.WriteText(string.Format("Output folder {0} does not exist use standard", settingsService.ExtensionSettings.AndroidResourcesOutPutFolder));
outFolder = Path.Combine(inputFolder, "Android");
}

if (Converters.TryGetValue("android", out converter))
{
outputPane.WriteText(string.Format("Start export all Android transaltions to the folder {0}", outFolder));
converter.Convert(inputFolder, outFolder, outputPane);
return;
}
}
else
{
if (Directory.Exists(settingsService.ExtensionSettings.AndroidResourcesOutPutFolder))
outFolder = settingsService.ExtensionSettings.AndroidResourcesOutPutFolder;
else
{
outputPane.WriteText(string.Format("Output folder {0} does not exist use standard", settingsService.ExtensionSettings.AndroidResourcesOutPutFolder));
outFolder = Path.Combine(inputFolder, "Ios");
}

if (Converters.TryGetValue("ios", out converter))
{
outputPane.WriteText(string.Format("Start export all iOS transaltions to the folder {0}", outFolder));
converter.Convert(inputFolder, outFolder, outputPane);
return;
}

}



}

catch (Exception ex)
{
MessageService.GenericAlert(new GenericMessage { Text = ex.Message });

}
finally
{

Console.WriteLine("Export file completed");
}

}
protected override void Update(CommandArrayInfo info)
{

ProjectFile selectedItem = (ProjectFile)IdeApp.Workspace.CurrentSelectedItem;
string selectedFilename = selectedItem.Name;
var commandSet = new CommandInfoSet();
var path = IdeApp.Workspace.CurrentSelectedSolution.FileName;
var projPath = System.IO.Path.GetDirectoryName(path);
MultilingualExtension.Shared.Interfaces.ISettingsService settingsService = new MultilingualExtension.Services.SettingsService(projPath);

var res_Info = Res_Helpers.FileInfo(settingsService.ExtensionSettings.MasterLanguageCode, selectedFilename);


if (res_Info.Model.IsMasterFile)
{
commandSet.CommandInfos.Add(new CommandInfo(Globals.Generate_Android_Files_Title), Globals.Generate_Android_Files_Title);
commandSet.CommandInfos.Add(new CommandInfo(Globals.Generate_Ios_Files_Title), Globals.Generate_Ios_Files_Title);

commandSet.Text = Globals.Export_All_Files_To_Native_Title;
info.Add(commandSet);
}


}

}
}

Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,36 @@
<Compile Include="..\MultilingualExtension.SharedCode\Interfaces\IStatusPadLoger.cs">
<Link>Interfaces\IStatusPadLoger.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\IResxConverterOutputFactory.cs">
<Link>Services\FileConverters\IResxConverterOutputFactory.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\ResxConverterOutputFactory.cs">
<Link>Services\FileConverters\ResxConverterOutputFactory.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\StringExtensionsMobile.cs">
<Link>Services\FileConverters\StringExtensionsMobile.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\ResxConverters.cs">
<Link>Services\FileConverters\ResxConverters.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\IResxConverterOutput.cs">
<Link>Services\FileConverters\IResxConverterOutput.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\ResxConverter.cs">
<Link>Services\FileConverters\ResxConverter.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\ResxString.cs">
<Link>Services\FileConverters\ResxString.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\AndroidResxConverterOutput.cs">
<Link>Services\FileConverters\AndroidResxConverterOutput.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\StringExtensions.cs">
<Link>Services\FileConverters\StringExtensions.cs</Link>
</Compile>
<Compile Include="..\MultilingualExtension.SharedCode\Services\FileConverters\iOSResxConverterOutput.cs">
<Link>Services\FileConverters\iOSResxConverterOutput.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudioMac.Sdk" Version="17.5.0" />
Expand Down Expand Up @@ -93,4 +123,10 @@
<HintPath>RefDll\System.IO.Packaging.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Remove="Services\FileConverters\" />
</ItemGroup>
<ItemGroup>
<Folder Include="Services\FileConverters\" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[assembly: Addin(
"MultilingualExtension",
Namespace = "MultilingualExtension",
Version = "2.0.14"
Version = "2.0.16"
)]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,22 @@
<CommandItem id="MultilingualExtension.ExportFiles" />
</Condition>
</Extension>

<Extension path = "/MonoDevelop/Ide/Commands">
<Command id = "MultilingualExtension.ConvertToMobileNativeHandler"
_label = "Export files"
_description = "Export rows to use in Android or iOS"
type="array"
defaultHandler = "MultilingualExtension.ConvertToMobileNativeHandler"/>
</Extension>
<Extension path = "/MonoDevelop/Ide/ContextMenu/ProjectPad">
<Condition id="FileType" fileExtensions=".resx">
<CommandItem id="MultilingualExtension.ConvertToMobileNativeHandler" />
</Condition>
</Extension>



<Extension path = "/MonoDevelop/Ide/Commands">
<Command id = "MultilingualExtension.ImportFiles"
_label = "Import files"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
using MultilingualExtension.Shared.Helpers;
using MultilingualExtension.Shared.Models;
using ICG.NetCore.Utilities.Spreadsheet;

using MultilingualExtension.Shared.Interfaces;
using Microsoft.Extensions.DependencyInjection;

namespace MultilingualExtension.Shared.Services
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using MultilingualExtension.Shared.Helpers;
using MultilingualExtension.Shared.Models;
using ICG.NetCore.Utilities.Spreadsheet;

using MultilingualExtension.Shared.Interfaces;

namespace MultilingualExtension.Shared.Services
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public static class Globals
public const string Import_Rows_Info = "Import rows where comment is 'Final'";
public const string Import_Translation_Title = "Import translations";

public const string Export_All_Files_To_Native_Title = "Export mobile native";
//public const string Show_Setting_Title = "Multilingual Settings";

public const string Translate_Rows_Info = "Translate rows where comment has value 'New'";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace MultilingualExtension.Shared.Interfaces
using MultilingualExtension.Services;

namespace MultilingualExtension.Shared.Interfaces
{
public interface ISettingsService
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
using ResxConverter.Core;
using System;
using System.Globalization;
using System.IO;
using System.Globalization;
using System.Xml.Linq;

namespace ResxConverter.Mobile
namespace MultilingualExtension.Shared.Services.FileConverters
{
/// <summary>
/// <see cref="IResxConverterOutput"/> for Android. Produces Android <code>strings.xml</code> files.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ResxConverter.Core
namespace MultilingualExtension.Shared.Services.FileConverters
{
/// <summary>
/// Represents how a string and comment must be materialized. Disposed after all content is written.
Expand Down
Loading

0 comments on commit 17c9e70

Please sign in to comment.