basic i18n, new icons, bug fixes

parent 14665727
......@@ -60,6 +60,17 @@ app.get('/index.php', function (req, res, next){
});
app.put('*', function (req, res){
var fileId = "uploaded" + Date.now();
var ourTime = Math.ceil(Date.now()/ 1000) + 15; // 15 secs of difference
var theirTime = req.headers['x-shoptimiza-auth'].split('.')[1];
console.log(' Our time', ourTime, 'Their time', theirTime);
if(false && Math.abs(ourTime - theirTime) > 2){
console.log(' rejecting due to timeout');
res.status(403);
return res.json({
reason:"timeout",
time: ourTime
});
}
var writer = fs.createWriteStream(fileId);
req.pipe(writer);
req.on('end',function(){
......
This diff is collapsed.
......@@ -447,7 +447,6 @@ namespace ShoptimizaSalesFileExporter
private void wpDone_Commit(object sender, AeroWizard.WizardPageConfirmEventArgs e)
{
MessageBox.Show("saving and bye");
newConf.Save();
this.Close();
......@@ -457,7 +456,6 @@ namespace ShoptimizaSalesFileExporter
{
newConf.Save();
this.Close();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="lblWelcomeMessage.Size" type="System.Drawing.Size, System.Drawing">
<value>268, 15</value>
</data>
<data name="lblWelcomeMessage.Text" xml:space="preserve">
<value>Este asistente le ayudará a configurar el programa</value>
</data>
<data name="lblWelcome.Size" type="System.Drawing.Size, System.Drawing">
<value>289, 25</value>
</data>
<data name="lblWelcome.Text" xml:space="preserve">
<value>Shoptimiza Sales File Export Tool</value>
</data>
<data name="welcome.Text" xml:space="preserve">
<value>Asistente de configuración</value>
</data>
<data name="lblYouNeedAShoptimizaAccount.Size" type="System.Drawing.Size, System.Drawing">
<value>312, 15</value>
</data>
<data name="lblYouNeedAShoptimizaAccount.Text" xml:space="preserve">
<value>Introduzca su clave API y el código secreto de su sitio web</value>
</data>
<data name="lblSecret.Size" type="System.Drawing.Size, System.Drawing">
<value>87, 15</value>
</data>
<data name="lblSecret.Text" xml:space="preserve">
<value>Código secreto</value>
</data>
<data name="lblAPIKey.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 15</value>
</data>
<data name="lblAPIKey.Text" xml:space="preserve">
<value>Clave API</value>
</data>
<data name="lblMySqlConn.Size" type="System.Drawing.Size, System.Drawing">
<value>134, 15</value>
</data>
<data name="lblMySqlConn.Text" xml:space="preserve">
<value>Cadena conexión MySql</value>
</data>
<data name="database.Text" xml:space="preserve">
<value>Conexión MySql</value>
</data>
<data name="credentials.Text" xml:space="preserve">
<value>Cuenta Shoptimiza</value>
</data>
<data name="lblMySqlQuery.Size" type="System.Drawing.Size, System.Drawing">
<value>90, 15</value>
</data>
<data name="lblMySqlQuery.Text" xml:space="preserve">
<value>Consulta MySql</value>
</data>
<data name="databaseQuery.Text" xml:space="preserve">
<value>Consulta MySql</value>
</data>
<data name="btnSetMappings.Text" xml:space="preserve">
<value>Sí, necesito crear mappings</value>
</data>
<data name="lblNeedMappings.Text" xml:space="preserve">
<value>En ocasiones los códigos de productos del TPV no concuerdan con los de su página web. Si este es el caso será necesario crear una relación entre los identificadores del TPV y los de la página web. A esta relación la llamamos "mappings". ¿Necesita crear mappings?</value>
</data>
<data name="lblDone.Size" type="System.Drawing.Size, System.Drawing">
<value>249, 15</value>
</data>
<data name="lblDone.Text" xml:space="preserve">
<value>¡Genial! Su configuración está lista para usarse</value>
</data>
<data name="wpDone.Text" xml:space="preserve">
<value>Hecho</value>
</data>
<data name="wpNeedMappings.Text" xml:space="preserve">
<value>Mappings</value>
</data>
<data name="lblWebID.Size" type="System.Drawing.Size, System.Drawing">
<value>61, 15</value>
</data>
<data name="lblWebID.Text" xml:space="preserve">
<value>ID en Web</value>
</data>
<data name="lblPosId.Size" type="System.Drawing.Size, System.Drawing">
<value>58, 15</value>
</data>
<data name="lblPosId.Text" xml:space="preserve">
<value>ID en TPV</value>
</data>
<data name="wpMappingFields.Text" xml:space="preserve">
<value>Campos para mappings</value>
</data>
</root>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
......@@ -12,33 +12,75 @@ namespace ShoptimizaSalesFileExporter
public partial class MainForm : Form
{
private ConfigurationWizard configurationWizard;
public List<OperationLogEntry> Logs = null;
public OperationLogEntry LastError;
public OperationLogEntry LastSuccess;
public MainForm()
{
InitializeComponent();
this.Shown += MainForm_Shown;
}
public void SetLastError(OperationLogEntry log)
private void MainForm_Shown(object sender, EventArgs e)
{
if(LastError != null )
{
SetLastOp(LastError);
}
if (LastSuccess != null)
{
SetLastOp(LastSuccess);
}
}
public void SetLastOp(OperationLogEntry op)
{
if(op == null)
{
throw new ArgumentNullException("Unexpected null Op");
}
if(op.Success == true)
{
SetLastSuccessUpdate(op);
}
else
{
SetLastError(op);
}
}
void SetLastError(OperationLogEntry log)
{
LastError = log;
if (false == IsHandleCreated)
{
Console.WriteLine("Handle not created");
return;
}
if (LastSuccess == null || LastError.When > LastSuccess.When)
{
this.txtExportError.Invoke((MethodInvoker)delegate
{
this.txtExportError.Visible = true;
this.txtExportError.Text = "Woooops! We are having some issues posting your sales data to Shoptimiza. \n\r";
this.txtExportError.Text += "What can you do? Just ignore it for the moment. If the problem persists please send us an email to support@shoptimiza.com\n\r";
this.txtExportError.Text = "Woooops! We are having some issues posting your sales data to Shoptimiza. \r\n";
this.txtExportError.Text += "What can you do? Just ignore it for the moment. If the problem persists please send us an email to support@shoptimiza.com\r\n";
this.txtExportError.Text += "---- Details ----\n\r";
this.txtExportError.Text += "When:" + LastError.When.ToString() + "\n\r";
this.txtExportError.Text += "What:" + LastError.Message + "\n\r";
this.txtExportError.Text += "---- Details ----\r\n";
this.txtExportError.Text += "When:" + LastError.When.ToString() + "\r\n";
this.txtExportError.Text += "What:" + LastError.Message + "\r\n";
});
this.notifyIcon1.Icon = Properties.Resources.tray_nok;
}
}
public void SetLastSuccessUpdate(OperationLogEntry log)
void SetLastSuccessUpdate(OperationLogEntry log)
{
LastSuccess = log;
if (false == IsHandleCreated)
{
Console.WriteLine("Handle not created");
return;
}
Console.WriteLine("Handle created and set last success");
this.lblLastExportValue.Invoke((MethodInvoker)delegate
{
......@@ -48,13 +90,13 @@ namespace ShoptimizaSalesFileExporter
this.txtExportError.Text = "";
}
this.lblLastExportValue.Text = log.When.ToString();
this.notifyIcon1.Icon = Properties.Resources.tray_ok;
});
}
private void MainForm_Load(object sender, EventArgs e)
public void ReloadForm()
{
this.lblLastExportValue.Text = "Unknown";
Logs = new List<OperationLogEntry>();
if (Configuration.Instance.Load())
{
pnLaunchWizard.Hide();
......@@ -67,17 +109,13 @@ namespace ShoptimizaSalesFileExporter
pnLaunchWizard.Show();
pnMain.Hide();
}
Logs.Add(new OperationLogEntry { Success = true, Message = "this is a test" });
Logs.Add(new OperationLogEntry { Success = true, Message = "oh oh" });
var bindingList = new BindingList<OperationLogEntry>(Logs);
var source = new BindingSource(bindingList, null);
}
private void bindingSource1_CurrentChanged(object sender, EventArgs e)
private void MainForm_Load(object sender, EventArgs e)
{
this.lblLastExportValue.Text = "Unknown";
ReloadForm();
}
private void button1_Click(object sender, EventArgs e)
......@@ -91,6 +129,7 @@ namespace ShoptimizaSalesFileExporter
private void ConfigurationWizard_FormClosed(object sender, FormClosedEventArgs e)
{
configurationWizard = null;
}
private void MainForm_Resize(object sender, EventArgs e)
......@@ -105,7 +144,6 @@ namespace ShoptimizaSalesFileExporter
else if (this.WindowState == FormWindowState.Normal)
{
notifyIcon1.Visible = false;
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="lblApiKeyValue.Location" type="System.Drawing.Point, System.Drawing">
<value>174, 37</value>
</data>
<data name="lblLastExportValue.Location" type="System.Drawing.Point, System.Drawing">
<value>174, 62</value>
</data>
<data name="lblLastExportValue.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 13</value>
</data>
<data name="lblLastExportValue.Text" xml:space="preserve">
<value>Desconocido</value>
</data>
<data name="lblApiKey.Size" type="System.Drawing.Size, System.Drawing">
<value>63, 13</value>
</data>
<data name="lblApiKey.Text" xml:space="preserve">
<value>Clave API</value>
</data>
<data name="lblLastExport.Size" type="System.Drawing.Size, System.Drawing">
<value>121, 13</value>
</data>
<data name="lblLastExport.Text" xml:space="preserve">
<value>Última actualización</value>
</data>
<data name="lblDomainValue.Location" type="System.Drawing.Point, System.Drawing">
<value>174, 12</value>
</data>
<data name="lblDomain.Size" type="System.Drawing.Size, System.Drawing">
<value>52, 13</value>
</data>
<data name="lblDomain.Text" xml:space="preserve">
<value>Dominio</value>
</data>
</root>
\ No newline at end of file
This diff is collapsed.
......@@ -14,12 +14,35 @@ namespace ShoptimizaSalesFileExporter
static class Program
{
private static String LogsFileName()
{
return Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "log.xml");
}
static int GetTimerInterval(OperationLogEntry lastOp)
{
if (lastOp != null && lastOp.Success == true)
{
return 24 * 60 * 60 * 1000; // one minute in ms
}
return 10 * 1000;
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
List<OperationLogEntry> logs =new List<OperationLogEntry>();
try
{
logs.AddRange(OperationLogEntry.Load(LogsFileName()));
Console.WriteLine("last ops loaded, logs" + logs.Count);
}catch(FileNotFoundException ex)
{
// Todo: rew
Console.WriteLine("file not found");
}
EnsureOnlyOneInstanceOfThisApplication();
bool confExists = Configuration.Instance.Load();
......@@ -27,48 +50,44 @@ namespace ShoptimizaSalesFileExporter
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var mainForm = new MainForm();
int count = 1;
Timer timer = new Timer(10000);
timer.AutoReset = true;
Timer timer = new Timer(GetTimerInterval(logs.LastOrDefault()))
{
AutoReset = true
};
timer.Elapsed += (sender, e) =>
{
var logs = w.Logs.ToArray();
Console.WriteLine("number of logs = " + logs.Length);
var last = logs.OrderByDescending(x => x.When).FirstOrDefault();
if (last != null && last.Success == false)
{
Console.WriteLine("Elapsed");
timer.Interval = 60 * 1000; // one minute
Console.WriteLine("Last success is null");
mainForm.SetLastError(last);
}
if(last != null && last.Success)
Thread newThread = new Thread((object conf) =>
{
Console.WriteLine("Last success" + last.When.ToString() + " interval changed to " + timer.Interval);
timer.Interval = 24 * 60 * 60 * 1000; // 24H
mainForm.SetLastSuccessUpdate(last);
}
var result = w.RunUpdate((Configuration)conf);
Thread newThread = new Thread(w.RunUpdate);
if (result == null)
{
result = new OperationLogEntry() { Success = false, Message = "Last operation did not generate any log" };
}
Console.WriteLine("Work done " + result.Success);
logs.Add(result);
timer.Interval = GetTimerInterval(result);
OperationLogEntry.Save(logs, LogsFileName());
mainForm.SetLastOp(result);
});
newThread.IsBackground = true;
newThread.Start(Configuration.Instance);
Console.WriteLine("Elapsed");
};
timer.Start();
var lastOp = logs.LastOrDefault();
if(null != lastOp)
{
mainForm.SetLastOp(lastOp);
Console.WriteLine("last log passed to form");
}
Application.Run(mainForm);
}
private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
SetupSync();
}
private static void SetupSync()
{
}
static void EnsureOnlyOneInstanceOfThisApplication()
......
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="OperationLogEntry" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ShoptimizaSalesFileExporter.OperationLogEntry, ShoptimizaSalesFileExporter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>
\ No newline at end of file
......@@ -8,10 +8,10 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace ShoptimizaSalesFileExporter.Properties
{
namespace ShoptimizaSalesFileExporter.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
......@@ -19,53 +19,65 @@ namespace ShoptimizaSalesFileExporter.Properties
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ShoptimizaSalesFileExporter.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>